+commit 1681776abc0873bcbbbc5b2b17e15d54a1031f51
+Merge: 8830926 aebdcaf
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 19:07:49 2016 -0700
+
+ Merge branch 'master' into branch-1.6
+
+commit aebdcaf37eafbc13cce695fe65a455e49c6108c3
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 19:06:19 2016 -0700
+
+ one more time, with feeling .. this time, I've updated pdclib
+
+commit 88309264656220bae6ee941211f7aa1b1dc19944
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 19:06:19 2016 -0700
+
+ one more time, with feeling .. this time, I've updated pdclib
+
+commit 70e9064ca962dfd345f8a342afa130f969606553
+Merge: 489d22f 73ce3f7
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 19:04:49 2016 -0700
+
+ Merge branch 'master' into branch-1.6
+
+commit 73ce3f73526edfabccd3b98e6e67de6d82a84b63
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 18:58:31 2016 -0700
+
+ submodule madness
+
+commit cbec66452ecd01bbd5aebf6f98443d5e0540f5d2
+Merge: 4043e07 81b8f4d
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 18:29:07 2016 -0700
+
+ Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
+
+commit 81b8f4da612b527915f68f632fbd94a46bc1795f
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 17:22:35 2016 -0800
+
+ doc: Remove extraneous 'first off' from legal paragraph
+
+ Not helpful (bdale)
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 6a00f186a06f22638882f43f49fa0c03ea387eac
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 17:13:56 2016 -0800
+
+ doc: Remove telemini v2.0. Add telemega v2.0
+
+ Reflect hardware we've actually shipped.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 6cbf93995d90fc4790eb77bcaa233742857fe052
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 17:01:57 2016 -0800
+
+ doc: fix typo in using external active switch circuit section
+
+ the -> then (bdale)
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 3547e65eecbe7bd4e16dc6f2048b7a69f29d05ff
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 16:59:37 2016 -0800
+
+ doc: Update copyright year in altusmetrum doc
+
+ And note that this need to be checked for each release in RELNOTES
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 4043e0707cdc77158f709c19dd134f92b4604270
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 17:45:45 2016 -0700
+
+ modify release procedure to reflect Keith setting version in confgure.ac
+
+commit 2f35e0ba52f538ea1061bfff5bbd772b8a241386
+Merge: 86ccbac 3fdaf74
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 17:44:03 2016 -0700
+
+ Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
+
+commit 86ccbac16f5cd0be4a4c11260816b4799cda46f2
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 17:43:34 2016 -0700
+
+ modify bringup scripts to handle TeleMega v2.0
+
+commit 3fdaf745f98f42f1ec4ae7cc682f47be8d8568eb
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 14:37:05 2016 -0800
+
+ Bump version to 1.6.2, altosdroid to 10
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit ebe009b9c7c2f4de3405479f800a33b449fcbb1e
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 17:41:38 2016 -0700
+
+ now building for m4, too
+
+commit ff9c034dc942ec4bc5cc30cc593ea2165e143d55
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Jan 10 17:38:26 2016 -0700
+
+ new build dependency on asciidoc
+
+commit a66e57e0e92cdbd3c6a10b835c50f55647c07351
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 15:56:21 2016 -0800
+
+ altos: Switch PWM constants to end up exposing µsec
+
+ This changes the constants so the clock runs at 1MHz, making the step
+ 1µsec each. Then make the period 20000 steps, or 20ms for a 50Hz
+ frequency as before.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 4e29bcd07819415ebe44e22536305e9c51d9ae4c
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 15:44:08 2016 -0800
+
+ altos: Set TeleMega v2.0 PWM to support servos
+
+ Typical servos use a 50Hz signal with less than 10% duty cycle. Set
+ the divider to 10 and the range to 64000 to provide a reasonable level
+ of detail down in the low range.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 54c20f1caf7f2e09284a9839cfa854d71f5634a2
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 11:44:17 2016 -0800
+
+ Add release notes for 1.6.2
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 7041c386cdf37716f8daf0bc1a9204db620e3de9
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 12:30:34 2016 -0800
+
+ Update java library versions
+
+ altoslib is API incompatible with 1.6.1 release due to altos.state updates.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit b560b20cc7d4d5ac219613b29707f7cb8a018273
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 12:30:11 2016 -0800
+
+ altoslib: Remove debug message from AltosMap
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 88671454e931ea5e5946438df3c437493e2356c8
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 12:21:24 2016 -0800
+
+ Elide flight computer info from APRS section of TeleGPS manual
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit efd6cd5682be3d0cead71ecfa00f37428b64785f
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Jan 10 12:15:50 2016 -0800
+
+ Elide pyro channel information from EasyMini docs
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 4344bf3de532f54e0185421975c3c8dff1ac8bc2
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Jan 9 21:33:23 2016 -0800
+
+ altos: Insert inter telemetry-packet delay
+
+ The receivers take some time to reset the radio between packets, so
+ make sure we don't send back-to-back telemetry too quickly by delaying
+ after sending each telemetry packet.
+
+commit fe8b7ab9dd1949c53af8f09f08679bdf0280c104
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Jan 9 16:28:53 2016 -0800
+
+ Switch TeleMega v2.0 to CC1200 radio chip
+
+ That's what we're using, after all
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 0fd370af8bc8842000415c4d182d84b4bf6f90fa
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Dec 25 23:27:45 2015 -0800
+
+ altos: Set AO_PWM_TIMER_SCALE for telemega-v2.0
+
+ This is needed to configure the PWM timer correctly
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 742f7c834bb5d651d2bebf2069d4e8facc33390d
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Dec 25 23:20:29 2015 -0800
+
+ altos: Get stm32l pwm driver working
+
+ Fix the CCMR1_OC1PE and CCMR2_OC3PE values.
+ Disable clock when no PWM outputs are running.
+ Fix the apb1enr value for the timer.
+ Set ARR value to PWM_MAX - 1 -- ARR is off by one.
+ Sets the GPIO pins to 40MHz bandwidth for sharper edges.
+
+ Tested on EasyMega, but that code is not included as it breaks the
+ companion protocol.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 8aa0ab9fe9ca41f6d520d388973164bc0c599a06
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Dec 24 00:28:59 2015 -0800
+
+ altos: Add TeleMega v2.0, including PWM driver
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit a1b760d0a01e7087bcc214fcd395541fbf268fe8
+Author: Keith Packard <keithp@keithp.com>
+Date: Wed Dec 23 10:18:24 2015 -0800
+
+ ao-tools/ao-dbg: Stop using sigvec
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit f28d59ddf3e1b763ce5757f572e79085963818e9
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Nov 14 00:01:05 2015 -0800
+
+ doc: Remove some bogus bits from am.css
+
+ Just commented out stuff which had a nested comment and was thus invalid
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 19f700f1c99d2f3dcd8775cc629037312d853ee1
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Nov 13 23:36:02 2015 -0800
+
+ doc: Construct html index for documentation
+
+ This gets uploaded to keith's machine as an easy way to see what's available.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 688c5ee98565a25e77c8618e1957ed3b8eff5a56
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Nov 13 23:17:11 2015 -0800
+
+ doc: Try a different trick for asciidoc build issues
+
+ asciidoc creates temp files in the current directory using basename of
+ the source filename. Doing html and pdf builds in parallel causes
+ chaos as a result. Fix this by having the pdf target build both
+ serially, and then have the html target just depend on the pdf target.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 992c0eab6275cec7d5035b99952537fd7ece2ed4
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Nov 13 22:55:35 2015 -0800
+
+ doc: Split out EasyMini into a separate manual
+
+ EasyMini uses a tiny fraction of the overall system software;
+ splitting the manual out makes it a lot smaller.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit b030dfb3df859b3b3cb9c666394f315edcd11f49
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Nov 13 20:59:25 2015 -0800
+
+ doc: Reformat html versions a bit
+
+ Color more text black, including toc. Add a bit of space around the
+ toc. Make paragraph labels bold.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 6260ee1419ba5c122939b28e3e8fc6f8ecf48928
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Nov 13 20:58:58 2015 -0800
+
+ doc: Move pad beeps table to usage chapter
+
+ This places all of the sound information in one place.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 2133c235af9511a42b65b239c6fcbeafa0e6d272
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Nov 13 20:58:08 2015 -0800
+
+ doc: Provide more actual links instead of just chapter names
+
+ Replace 'see chapter "foo"' with 'see <<foo>>' so that a link is
+ created to directly go to the relevant text.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 87cb41dfa07153b4dc44f723c65888945b3a11b1
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Nov 13 20:56:45 2015 -0800
+
+ doc: Reformat 'Using MicroPeak' section
+
+ Use labeled paragraphs to make the steps stand out.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 4c1206a47431c7d873228fdd7328e1b9ac93a390
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Nov 13 19:45:02 2015 -0800
+
+ Break out common pieces from TeleGPS and AltusMetrum
+
+ This creates shared files for portions of the TeleGPS and AltusMetrum
+ manual to avoid duplicating text between the two.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit ef2ba847ca53a8ddfcddd4e51a0dd43c45161c85
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Nov 1 21:05:20 2015 -0800
+
+ doc: Add product logos to books
+
+ This places the product logo on the title verso in pdf form, and above
+ the TOC in html form.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 8642690da76a86736b97026e2a259d8cbad26262
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Nov 1 06:20:27 2015 -0800
+
+ altosui: telemini outline pdf changed name
+
+ It's now telemini-outline.pdf, just like the other outline files.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit c877ecce7b67272eb6dcba50a58b59cd1cbfa5ab
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Nov 1 05:43:59 2015 -0800
+
+ doc: verbose mode for a2x
+
+commit 13d03ee8ba3a300ef2a3a380b60f08dbe37793b0
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Nov 1 05:08:27 2015 -0800
+
+ doc: Make pdf titles less ridiculously large
+
+ Instead of having them grow at 20% per nesting level, use 10% instead.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 553d9041b52cbb88662fcc5e6a277ce43bd151cd
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Nov 1 04:23:56 2015 -0800
+
+ doc: Get images and tables all centered and labeled
+
+ A bunch of images were using image: instead of image:: and some images
+ and tables were missing titles.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit edcb80f25875200a73269045db71c1579b0c2c82
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Nov 1 04:22:27 2015 -0800
+
+ doc: Split revhistory to separate file for html docs
+
+ This avoids having the revhistory clutter the top of the document.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 1c0f2cd7cbd8fa1360d6b18a1bf8ac0707634aa4
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Nov 1 04:20:18 2015 -0800
+
+ doc: Place html book contents on left side of page with separate scrollbar
+
+ This lets the user see the toc while browsing the document
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit f2816b305fc9e18a1190e392d43ff489936f10f0
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Nov 1 04:18:34 2015 -0800
+
+ doc: Switch to free fonts. Publish fonts with docs.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 5b782c8f45ed6c34ed0e7f1aff6ac298c9a879ff
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Oct 31 23:54:26 2015 -0700
+
+ doc: Minor makefile cleanups
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 22f399b13fbbc980315a1f6a9f5616586b680d77
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Oct 31 23:36:03 2015 -0700
+
+ doc: Convert telemetry and companion docs to asciidoc
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 14ad137fd14707bc7b45a3512a4a6f81915ca1c1
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Oct 31 22:40:13 2015 -0700
+
+ doc: Convert AltOS doc to asciidoc
+
+ It's still pretty stale, but at least it isn't in docbook?
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit ce297f14ff54d230d01fb6dedaafca571e8b836b
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Oct 31 21:34:42 2015 -0700
+
+ doc: Finish converting docs to asciidoc format
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 9aed128dc0aab5d49e1b3264c864a6c3e929bffe
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Oct 31 14:54:20 2015 -0700
+
+ doc: Add titles to all figures
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 7ef958cbb51a04079e2a4833917ccef57ae5a2ee
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Oct 29 20:32:58 2015 -0700
+
+ doc: Add updating firmware and using am products asciidoc bits
+
+ This finishes the asciidoc transition
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 41aca78e3f7c17433e3c77cd3c596bbf8acab7cb
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Oct 29 18:38:46 2015 -0700
+
+ doc: Add asciidoc version of Altos Droid manual
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 5ddf9525f94f38c20327d1f2b43917e43519b949
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Oct 29 18:14:38 2015 -0700
+
+ doc: Add asciidoc version of altosui chapter.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit adfbccfeb551c9d0315116912e7255a173fc3103
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Oct 29 16:49:00 2015 +0900
+
+ doc: Lots more conversion from docbook to asciidoc
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit c5fd0eaa786a122580ba9a3ef7bfc0f2cfd8263b
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Oct 29 15:50:31 2015 +0900
+
+ doc: Add asciidoc telemini v1.0
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 8cf466d7a767a20387a8d9d6ec81ee00af3fe4a7
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Oct 29 12:12:15 2015 +0900
+
+ doc: Start doc transition to asciidoc
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit c1ca80318102af122cb7b5380331e37795280761
+Author: Keith Packard <keithp@keithp.com>
+Date: Tue Oct 13 13:52:32 2015 -0700
+
+ doc: Force FOP to read images from doc directory
+
+ Looks like something changed and fop is now reading from the directory
+ containing the source file. xmlto places that source in /tmp, making
+ all relative URIs fail. Fix this by creating a fop configuration file
+ directing it to load relative to the doc directory and then pass that
+ through xmlto.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 0ae116dd8779fd0594d443a735e7b6834ea9b713
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Oct 10 14:10:59 2015 -0700
+
+ telelco: Fix pad reset to one on radio signal loss
+
+ The pad number was getting reset back to one when signal was lost,
+ causing pad one to get fired in this case even when already set to arm mode.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 6659d08c41d89e4aa3d5e849c066a91bb09f2dd7
+Author: Keith Packard <keithp@keithp.com>
+Date: Mon Sep 21 07:03:30 2015 +0100
+
+ Create directory on keithp.com when uploading devel version
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 926522c6791c2a5529ea24ebd67eea45350e3526
+Author: Keith Packard <keithp@keithp.com>
+Date: Mon Sep 21 07:01:19 2015 +0100
+
+ altoslib: Keep downloading when a parse error occurs
+
+ Eventually, we'll hit a block with no valid data and give up. Until
+ then, keep going in case the flight computer glitched and wrote bad data.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 431c713389dc819d2433d893c898ff82c7941722
+Author: Keith Packard <keithp@keithp.com>
+Date: Mon Sep 21 06:32:52 2015 +0100
+
+ altoslib: Clean up remaining direct AltosState.state users
+
+ This value has been hidden to avoid having it written accidentally;
+ there were a few more bits of code using it though.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit c1dec3bec0789e8934a6e13fd117931ba468b318
+Author: Keith Packard <keithp@keithp.com>
+Date: Mon Sep 21 06:27:26 2015 +0100
+
+ Bump release number to 1.6.1.1
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 0f8272852b12cf7a349cd9fd07f17c55cdb335a1
+Author: Keith Packard <keithp@keithp.com>
+Date: Mon Sep 21 06:25:49 2015 +0100
+
+ altoslib: Make sure .eeprom download file is flushed on exception
+
+ Flush and close the eeprom file even if an exception occurs to make
+ sure that contents of the file aren't lost.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit a81d028dc62a0a624051fc3c9debb9687fda931e
+Author: Keith Packard <keithp@keithp.com>
+Date: Mon Sep 21 06:00:36 2015 +0100
+
+ altosuilib: In display thread, set new state synchronously
+
+ When replaying telemetry, received_time gets set by both the
+ telemetry reader (when the file is initially read) and by the replay
+ reader (as the telemetry is processed). Because these two events are
+ separated by the time it takes to play the file, the second time is
+ the one we want for figuring out how long since the last telemetry
+ packet. However, if we set the global state when pulling the state out
+ of the telemetry reader, and then the replay reader pauses for a long
+ time, then the voice output thread sees the intermediate time value
+ and thinks that it has been a long time since the last packet was
+ received and reports that the rocket may have crashed.
+
+ Fix this by just holding the read state until it has been passed by
+ the replay reader and had the received_time set to current time.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit f61c2b73f3b63aa9c3f0fbccede89c71580089ba
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Sep 13 22:27:10 2015 -0700
+
+ altosdroid: Add minus sign and decimal point to lat/lon input fields
+
+ Some android devices always have change-sign and decimal-point keys
+ visible, but some do not. Make sure they're available for lat/lon input.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 9dae5f76c5691dc94c02839eb1321426f96f2134
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Sep 13 22:24:47 2015 -0700
+
+ altos/telelco: Adjust drag race UI
+
+ Enter/leave drag race is done by rotating the box selector knob
+ to a new 'dr' position and then holding down the firing button; this
+ avoids a potential accidental firing if you somehow don't realize
+ you've armed the box before selecting drag race mode.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 618f7ac8f31941fcbb3ed91829de69c0f0be8e0b
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Sep 12 20:41:37 2015 -0700
+
+ altoslib: Rotation off by factor of two
+
+ The rotation computation was off by a factor of two when converting
+ the rates to a quaternion (the quaternion needs to be half of the
+ actual rotation amount). This ended up presenting a tilt angle of
+ twice what it should be.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 0afa07d3c1dcb5e301fcb8b4edfecdd961662478
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Sep 12 19:20:49 2015 -0700
+
+ altoslib: Hide 'state' member and use accessor function
+
+ Someone was smashing the state to 'landed' when no packets had been
+ received for a while. Found that by making it impossible for anyone
+ outside of AltosState to change the value.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 7064bc685aebeef07711e525dea4d5fbe33d235b
+Merge: ea1d241 dda3f45
+Author: Bdale Garbee <bdale@gag.com>
+Date: Tue Sep 29 00:46:42 2015 -0600
+
+ Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
+
+commit ea1d24151cf76ae8f2368673317b66958e2508c4
+Author: Bdale Garbee <bdale@gag.com>
+Date: Tue Sep 29 00:45:27 2015 -0600
+
+ add automatic Bluetooth functionality check to turnon_telebt
+
+commit dda3f459eaff8d4e41cb44584c8ef77b8e2b3b1c
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Aug 29 17:29:00 2015 -0700
+
+ altos/telelco: Add drag race UI
+
+ With the unit disarmed, press and hold the fire button for five
+ seconds to enable drag race mode.
+
+ The display will show 'dr' for five seconds and beep five times to
+ indicate that drag race mode is enabled. The decimal points in the
+ display will all be displayed as an additional visual aid. Once every
+ five seconds, it will beep.
+
+ With drag race mode enabled, you can select a box/pad pair and press
+ the 'fire' button to add it to the drag race group. For the current
+ box, all members of the drag race group will have their continuity
+ LEDs blink slowly. There will be no indication of continuity in this
+ mode; you'll want to check that before enabling drag race mode. If you
+ want to de-select a member of the group, just press the fire button
+ again. Each time you push the fire button, it will beep out the pad
+ number added or removed.
+
+ Arm the box and you will not be able to add or remove members from the
+ drag race group. Firing will simultaneously fire all members of the
+ drag race group.
+
+ To disable drag race mode, press and hold the fire button for two
+ seconds. It will beep twice and turn off the decimal points in the display.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 55c1be449ef7ce389a3d94686051d272c858bee4
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Aug 29 13:21:19 2015 -0700
+
+ altos/telelco: Infrastructure changes for drag racing
+
+ This makes the lco management code support arming multiple pads and
+ firing all of them at once. The UI code does not expose this yet.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 2839796ca5ace5f0c79643afc1a868893246b621
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Aug 29 13:20:16 2015 -0700
+
+ altos: Provide direct segment driving interface for LCD displays
+
+ This exposes a simple bit-mask for setting the seven segments instead
+ of just allowing hex-decimal values.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 368f87918547f89e7eb2a92990621e75e07a3b25
+Author: Keith Packard <keithp@keithp.com>
+Date: Sat Aug 29 13:18:46 2015 -0700
+
+ altos/telefire: No reply for ARMED. Ignore time for FIRE.
+
+ This will let us do drag races by letting the LCO arm multiple boxes
+ and fire them all with a single command.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit f491eec1b950e4ad35a535db254a27a3dd2ad430
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Aug 20 23:02:04 2015 -0700
+
+ altos: Add HAS_COMPANION to new boards with companion connectors
+
+ Thanks much to Rob Derstadt for discovering this bug!
+
+ TeleMetrum v2.0, TeleMega, EasyMega, TeleBalloon v2.0 all have
+ companion connectors and yet HAS_COMPANION was not defined. This
+ disabled companion telemetry packets on these products, but otherwise
+ didn't have any effect.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit b4064bf63bb95c58d74869f4ff3e440370d64692
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Aug 20 10:51:11 2015 -0700
+
+ ao-telem: Add companion packet telemetry data printing
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 73dd2e2c73c42f6ce949b4aa7992f63610962c37
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Aug 20 10:50:30 2015 -0700
+
+ altoslib: Add companion telemetry data support
+
+ This got lost in the great telemetry rewrite
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 489d22f448d9927533e90da4d16c5a332a234a8d
+Merge: 570daac eaab49a
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Aug 16 17:53:40 2015 +0200
+
+ Merge branch 'master' into branch-1.6
+
+commit eaab49ab1859ebe236a201f93b5352e67aa7ed2b
+Author: Bdale Garbee <bdale@gag.com>
+Date: Sun Aug 16 17:43:32 2015 +0200
+
+ apply wrap-and-sort to control files
+
+commit 909b048a4797b2477279750a77a82c6f5f2776d0
+Author: Bdale Garbee <bdale@gag.com>
+Date: Fri Aug 7 20:52:48 2015 -0600
+
+ turnon script for TeleBT v3.0
+
+commit 9e40f97b013256650364a2a7be96d7d2216ed778
+Author: Bdale Garbee <bdale@gag.com>
+Date: Fri Jul 31 10:47:08 2015 -0600
+
+ add a paragraph about TeleBT battery charging to AltosDroid chapter in documentation
+
+commit 773b23c48f67564eec83fc3ee085862c547ad160
+Author: Bdale Garbee <bdale@gag.com>
+Date: Tue Jul 28 01:34:25 2015 -0600
+
+ move turnon_teledongle to new cal-freq code
+
+commit 570daace9caf7647a09c53d5c75593cc4c98b93b
+Author: Bdale Garbee <bdale@gag.com>
+Date: Thu Jul 16 13:36:13 2015 -0600
+
+ changelog for 1.6.1 release
+
commit 6e9bb9178356620bd47d9f2e31abf42b7f1a8f11
Merge: e2cefd8 87c8bb3
Author: Bdale Garbee <bdale@gag.com>
micropeak/MicroPeak-Windows-$(VERSION_DASH).exe
keithp-fat: fat
+ ssh keithp.com mkdir -p public_html/altos-$(VERSION)
scp -p $(fat_linux) $(fat_mac) $(fat_windows) keithp.com:public_html/altos-$(VERSION)
set-java-versions:
git checkout master
+ - update the version in configure.ac if Keith hasn't already
+
- make sure the Google Maps API key is in the build chroot and root
sudo mkdir -p /var/cache/pbuilder/base.cow/opt/google /opt/google
sudo cp ~/altusmetrumllc/google-maps-api-key \
git checkout branch-<version> # the x.y parts only
- cherry-pick or merge appropriate content from master
- - update the version in configure.ac
-
- make sure there is a doc/release-notes-<version>.xsl
- make sure that doc/altusmetrum.xsl has the right copyright year,
and add release to the revision history at the front (release notes
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/preload_latitude_label"
- android:inputType="number"/>
+ android:inputType="number|numberSigned|numberDecimal"/>
<TextView android:id="@+id/preload_longitude_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/preload_longitude_label"
- android:inputType="number"/>
+ android:inputType="number|numberSigned|numberDecimal"/>
<TextView android:id="@+id/preload_types"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
import android.os.Handler;
//import android.os.Message;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosBluetooth extends AltosDroidLink {
import java.io.*;
import java.lang.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import android.app.Activity;
import android.graphics.*;
import android.graphics.*;
import android.graphics.drawable.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosDroid extends FragmentActivity implements AltosUnitsListener {
AltosGreatCircle from_receiver = null;
if (saved_state != null)
- prev_state = saved_state.state;
+ prev_state = saved_state.state();
if (state != null) {
set_screen_on(state_age(state));
- if (state.state == AltosLib.ao_flight_stateless) {
+ if (state.state() == AltosLib.ao_flight_stateless) {
boolean prev_locked = false;
boolean locked = false;
}
}
} else {
- if (prev_state != state.state) {
+ if (prev_state != state.state()) {
String currentTab = mTabHost.getCurrentTabTag();
- switch (state.state) {
+ switch (state.state()) {
case AltosLib.ao_flight_boost:
if (currentTab.equals(tab_pad_name)) mTabHost.setCurrentTabByTag(tab_flight_name);
break;
else
mFlightView.setText(String.format("%d", state.flight));
}
- if (saved_state == null || state.state != saved_state.state) {
- if (state.state == AltosLib.ao_flight_stateless) {
+ if (saved_state == null || state.state() != saved_state.state()) {
+ if (state.state() == AltosLib.ao_flight_stateless) {
mStateLayout.setVisibility(View.GONE);
} else {
mStateView.setText(state.state_name());
import android.os.Handler;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public abstract class AltosDroidLink extends AltosLink {
import java.util.*;
import java.io.*;
import android.location.Location;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public interface AltosDroidMapInterface {
public void onCreateView(AltosDroid altos_droid);
package org.altusmetrum.AltosDroid;
import android.content.Context;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosDroidPreferences extends AltosPreferences {
import android.os.Environment;
import android.util.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosDroidPreferencesBackend implements AltosPreferencesBackend {
public final static String NAME = "org.altusmetrum.AltosDroid";
package org.altusmetrum.AltosDroid;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import android.location.Location;
import android.app.Activity;
import android.graphics.Color;
import java.util.*;
import java.io.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import android.app.Activity;
import android.graphics.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import com.google.android.gms.maps.*;
import com.google.android.gms.maps.model.*;
import android.app.*;
import android.os.Handler;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosUsb extends AltosDroidLink {
import android.speech.tts.TextToSpeech.OnInitListener;
import android.location.Location;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosVoice {
if (last_tell_mode != TELL_MODE_FLIGHT)
last_flight_tell = TELL_FLIGHT_NONE;
- if (state.state != last_state && AltosLib.ao_flight_boost <= state.state && state.state <= AltosLib.ao_flight_landed) {
+ if (state.state() != last_state && AltosLib.ao_flight_boost <= state.state() && state.state() <= AltosLib.ao_flight_landed) {
speak(state.state_name());
- if (descending(state.state) && !descending(last_state)) {
+ if (descending(state.state()) && !descending(last_state)) {
if (state.max_height() != AltosLib.MISSING) {
speak("max height: %s.",
AltosConvert.height.say_units(state.max_height()));
if (last_flight_tell == TELL_FLIGHT_NONE || last_flight_tell == TELL_FLIGHT_STATE || last_flight_tell == TELL_FLIGHT_TRACK) {
last_flight_tell = TELL_FLIGHT_SPEED;
- if (state.state <= AltosLib.ao_flight_coast) {
+ if (state.state() <= AltosLib.ao_flight_coast) {
speed = state.speed();
} else {
speed = state.gps_speed();
last_tell_mode = tell_mode;
last_tell_serial = tell_serial;
if (state != null) {
- last_state = state.state;
+ last_state = state.state();
last_height = state.height();
if (state.gps != null)
last_gps = state.gps;
import android.widget.*;
import android.widget.AdapterView.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class MapTypeActivity extends Activity {
private Button hybrid;
import android.location.LocationListener;
import android.location.Criteria;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
/**
* This Activity appears as a dialog. It lists any paired devices and
package org.altusmetrum.AltosDroid;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import android.app.Activity;
import android.os.Bundle;
import java.util.*;
import java.io.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import android.app.Activity;
import android.graphics.*;
package org.altusmetrum.AltosDroid;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import android.app.Activity;
import android.os.Bundle;
}
if (state.flight != 0) {
- if (state.state <= AltosLib.ao_flight_pad)
+ if (state.state() <= AltosLib.ao_flight_pad)
data_logging_view.setText("Ready to record");
- else if (state.state < AltosLib.ao_flight_landed)
+ else if (state.state() < AltosLib.ao_flight_landed)
data_logging_view.setText("Recording data");
else
data_logging_view.setText("Recorded data");
package org.altusmetrum.AltosDroid;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import android.app.Activity;
import android.os.Bundle;
package org.altusmetrum.AltosDroid;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import android.content.BroadcastReceiver;
import android.content.Context;
import java.util.concurrent.*;
import android.os.Handler;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class TelemetryReader extends Thread {
import android.location.LocationListener;
import android.location.Criteria;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class TelemetryService extends Service implements LocationListener {
package org.altusmetrum.AltosDroid;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import android.location.Location;
public class TelemetryState {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosCRCException extends Exception {
public int rssi;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
}
void write_flight(AltosState state) {
- out.printf("%d,%8s", state.state, state.state_name());
+ out.printf("%d,%8s", state.state(), state.state_name());
}
void write_basic_header() {
}
private void write(AltosState state) {
- if (state.state == AltosLib.ao_flight_startup)
+ if (state.state() == AltosLib.ao_flight_startup)
return;
if (!header_written) {
write_header();
header_written = true;
}
if (!seen_boost) {
- if (state.state >= AltosLib.ao_flight_boost) {
+ if (state.state() >= AltosLib.ao_flight_boost) {
seen_boost = true;
boost_tick = state.tick;
flush_pad();
has_gps_sat = false;
has_companion = false;
for (AltosState state : states) {
- if (state.state != AltosLib.ao_flight_stateless && state.state != AltosLib.ao_flight_invalid && state.state != AltosLib.ao_flight_startup)
+ if (state.state() != AltosLib.ao_flight_stateless && state.state() != AltosLib.ao_flight_invalid && state.state() != AltosLib.ao_flight_startup)
has_flight_state = true;
if (state.acceleration() != AltosLib.MISSING || state.pressure() != AltosLib.MISSING)
has_basic = true;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.*;
import java.text.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosConfigDataException extends Exception {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosConfigValues {
/* set and get all of the dialog values */
/*
* Sensor data conversion functions
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosConvert {
/*
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosDistance extends AltosUnits {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.text.*;
import java.util.concurrent.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
AltosEepromList flights;
boolean success;
- ParseException parse_exception;
+ String parse_errors;
AltosState state;
private void FlushPending() throws IOException {
}
}
+ void LogError(String error) {
+ if (parse_errors != null)
+ parse_errors.concat(error.concat("\n"));
+ else
+ parse_errors = error;
+ }
+
void CaptureEeprom(AltosEepromChunk eechunk, int log_format) throws IOException, ParseException {
boolean any_valid = false;
boolean got_flight = false;
monitor.set_serial(flights.config_data.serial);
for (int i = 0; i < AltosEepromChunk.chunk_size && !done; i += record_length) {
- AltosEeprom r = eechunk.eeprom(i, log_format, state);
+ AltosEeprom r = null;
+
+ try {
+ r = eechunk.eeprom(i, log_format, state);
+ } catch (ParseException pe) {
+ LogError(pe.getMessage());
+ r = null;
+ }
if (r == null)
continue;
monitor.set_flight(state.flight);
/* Monitor state transitions to update display */
- if (state.state != AltosLib.ao_flight_invalid &&
- state.state <= AltosLib.ao_flight_landed)
+ if (state.state() != AltosLib.ao_flight_invalid &&
+ state.state() <= AltosLib.ao_flight_landed)
{
- if (state.state > AltosLib.ao_flight_pad)
+ if (state.state() > AltosLib.ao_flight_pad)
want_file = true;
- if (state.state == AltosLib.ao_flight_landed)
+ if (state.state() == AltosLib.ao_flight_landed)
done = true;
}
/* Reset per-capture variables */
want_file = false;
- eeprom_file = null;
eeprom_pending = new LinkedList<String>();
/* Set serial number in the monitor dialog window */
CaptureEeprom (eechunk, log_format);
- if (state.state != prev_state && state.state != AltosLib.ao_flight_invalid) {
+ if (state.state() != prev_state && state.state() != AltosLib.ao_flight_invalid) {
state_block = block;
- prev_state = state.state;
+ prev_state = state.state();
}
monitor.set_value(state.state_name(),
- state.state,
+ state.state(),
block - state_block,
block - log.start_block);
}
CheckFile(true);
- if (eeprom_file != null) {
- eeprom_file.flush();
- eeprom_file.close();
- }
}
public void run () {
link.start_remote();
for (AltosEepromLog log : flights) {
- parse_exception = null;
+ parse_errors = null;
if (log.selected) {
monitor.reset();
+ eeprom_file = null;
try {
CaptureLog(log);
} catch (ParseException e) {
- parse_exception = e;
+ LogError(e.getMessage());
+ }
+ if (eeprom_file != null) {
+ eeprom_file.flush();
+ eeprom_file.close();
}
}
- if (parse_exception != null) {
+ if (parse_errors != null) {
failed = true;
- monitor.show_message(String.format("Flight %d download error\n%s\nValid log data saved",
+ monitor.show_message(String.format("Flight %d download error. Valid log data saved\n%s",
log.flight,
- parse_exception.getMessage()),
+ parse_errors),
link.name,
AltosEepromMonitor.WARNING_MESSAGE);
}
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
headers = new AltosEepromIterable(AltosEepromHeader.read(input));
start = headers.state();
- if (start.state != AltosLib.ao_flight_stateless)
+ if (start.state() != AltosLib.ao_flight_stateless)
start.set_state(AltosLib.ao_flight_pad);
if (start.log_format == AltosLib.MISSING) {
for (AltosEeprom eeprom : body) {
eeprom.update_state(state);
state.finish_update();
- if (state.state >= AltosLib.ao_flight_boost) {
+ if (state.state() >= AltosLib.ao_flight_boost) {
start.set_boost_tick(state.tick);
break;
}
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.text.*;
import java.util.concurrent.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosEepromMonitor {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.File;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosFlashListener {
public void position(String label, int percent);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosFlightDisplay extends AltosUnitsListener, AltosFontListener {
void reset();
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.text.*;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
for (AltosState s : states) {
state = s;
- if (state.state == AltosLib.ao_flight_landed)
+ if (state.state() == AltosLib.ao_flight_landed)
break;
}
state = s;
if (state.acceleration() < 1)
boost_time = state.time;
- if (state.state >= AltosLib.ao_flight_boost && state.state <= AltosLib.ao_flight_landed)
+ if (state.state() >= AltosLib.ao_flight_boost && state.state() <= AltosLib.ao_flight_landed)
break;
}
if (state == null)
if (state.pressure() != AltosLib.MISSING)
has_flight_data = true;
- int state_id = state.state;
+ int state_id = state.state();
if (state.time >= boost_time && state_id < AltosLib.ao_flight_boost)
state_id = AltosLib.ao_flight_boost;
if (state.time >= landed_time && state_id < AltosLib.ao_flight_landed)
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosFontListener {
void font_size_changed(int font_size);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosFrequency {
public double frequency;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.text.*;
import java.util.concurrent.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosGPSSat {
public int svid;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.lang.Math;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosHeight extends AltosUnits {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.LinkedList;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosHexsym {
String name;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.*;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.concurrent.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosIdleMonitorListener {
public void update(AltosState state, AltosListenerState listener_state);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.*;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
boolean started = false;
void state_start(AltosState state) {
- String state_name = AltosLib.state_name(state.state);
- String state_color = state_color(state.state);
+ String state_name = AltosLib.state_name(state.state());
+ String state_color = state_color(state.state());
out.printf(kml_style_start, state_name, state_color);
out.printf("\tState: %s\n", state_name);
out.printf("%s", kml_style_end);
}
if (prev != null && prev.gps_sequence == state.gps_sequence)
return;
- if (state.state != flight_state) {
- flight_state = state.state;
+ if (state.state() != flight_state) {
+ flight_state = state.state();
if (prev != null) {
coord(state);
state_end(prev);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosLatLon {
public double lat;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosLatitude extends AltosLocation {
public String pos() { return "N"; }
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.lang.*;
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.lang.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.lang.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.*;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosLine {
public String line;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.concurrent.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public abstract class AltosLocation extends AltosUnits {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.text.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosLongitude extends AltosLocation {
public String pos() { return "E"; }
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.*;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.lang.*;
if (!gps.locked && gps.nsat < 4)
return;
- switch (state.state) {
+ switch (state.state()) {
case AltosLib.ao_flight_boost:
if (!have_boost) {
- add_mark(gps.lat, gps.lon, state.state);
+ add_mark(gps.lat, gps.lon, state.state());
have_boost = true;
}
break;
case AltosLib.ao_flight_landed:
if (!have_landed) {
- add_mark(gps.lat, gps.lon, state.state);
+ add_mark(gps.lat, gps.lon, state.state());
have_landed = true;
}
break;
}
if (path != null) {
- AltosMapRectangle damage = path.add(gps.lat, gps.lon, state.state);
+ AltosMapRectangle damage = path.add(gps.lat, gps.lon, state.state());
if (damage != null)
repaint(damage, AltosMapPath.stroke_width);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.net.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosMapCacheListener {
public void map_cache_changed(int map_cache);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.net.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.lang.Math;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosMapLoaderListener {
public abstract void loader_start(int max);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.lang.Math;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.lang.Math;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.lang.Math;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosMapRectangle {
AltosLatLon ul, lr;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.net.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosMapStoreListener {
abstract void notify_store(AltosMapStore store, int status);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosMapTileListener {
abstract public void notify_tile(AltosMapTile tile, int status);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.lang.Math;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosMapZoomListener {
abstract public void zoom_changed(int zoom);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.*;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosNoSymbol extends Exception {
public AltosNoSymbol(String name) {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosOrient extends AltosUnits {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.*;
import java.text.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosPointDouble {
public double x, y;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosPointInt {
public int x, y;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.File;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.*;
import java.text.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosQuaternion {
double r; /* real bit */
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosRectangle {
public int x, y, width, height;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
public void update(AltosState state) throws InterruptedException {
/* Make it run in realtime after the rocket leaves the pad */
- if (state.state > AltosLib.ao_flight_pad && state.time_change > 0)
+ if (state.state() > AltosLib.ao_flight_pad && state.time_change > 0)
Thread.sleep((int) (Math.min(state.time_change,10) * 1000));
state.set_received_time(System.currentTimeMillis());
}
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosRotation {
private AltosQuaternion rotation;
}
public void rotate(double dt, double x, double y, double z) {
- AltosQuaternion rot = AltosQuaternion.half_euler(x * dt, y * dt, z * dt);
+ AltosQuaternion rot = AltosQuaternion.half_euler(x * dt / 2.0, y * dt / 2.0, z * dt / 2.0);
rotation = rot.multiply(rotation).normalize();
}
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.TimeoutException;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.TimeoutException;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.TimeoutException;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.TimeoutException;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.TimeoutException;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.TimeoutException;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.util.concurrent.TimeoutException;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosSpeed extends AltosUnits {
* Track flight state from telemetry or eeprom data stream
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
}
}
- public int state;
+ private int state;
public int flight;
public int serial;
public int altitude_32;
}
}
+ public int state() {
+ return state;
+ }
+
public void set_device_type(int device_type) {
this.device_type = device_type;
switch (device_type) {
}
}
- public void make_companion (int nchannels) {
- if (companion == null)
- companion = new AltosCompanion(nchannels);
- }
-
public void set_companion(AltosCompanion companion) {
this.companion = companion;
}
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosStateUpdate {
public void update_state(AltosState state) throws InterruptedException;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.text.*;
public void update_state(AltosState state) {
state.set_serial(serial);
- if (state.state == AltosLib.ao_flight_invalid)
+ if (state.state() == AltosLib.ao_flight_invalid)
state.set_state(AltosLib.ao_flight_startup);
state.set_tick(tick);
state.set_rssi(rssi, status);
--- /dev/null
+/*
+ * Copyright © 2015 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.altoslib_9;
+
+public class AltosTelemetryCompanion extends AltosTelemetryStandard {
+ AltosCompanion companion;
+
+ static final public int max_channels = 12;
+
+ public AltosTelemetryCompanion(int[] bytes) {
+ super(bytes);
+
+ int channels = uint8(7);
+
+ if (channels > max_channels)
+ channels = max_channels;
+
+ companion = new AltosCompanion(channels);
+
+ companion.tick = tick;
+ companion.board_id = uint8(5);
+ companion.update_period = uint8(6);
+
+ if (channels == 0)
+ companion.companion_data = null;
+ else {
+ companion.companion_data = new int[channels];
+
+ for (int i = 0; i < channels; i++)
+ companion.companion_data[i] = uint16(8 + i * 2);
+ }
+ }
+
+ public void update_state(AltosState state) {
+ super.update_state(state);
+
+ state.set_companion(companion);
+ }
+}
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTelemetryConfiguration extends AltosTelemetryStandard {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
for (AltosTelemetry telem : telems) {
telem.update_state(state);
state.finish_update();
- if (state.state != AltosLib.ao_flight_invalid && state.state >= AltosLib.ao_flight_boost) {
+ if (state.state() != AltosLib.ao_flight_invalid && state.state() >= AltosLib.ao_flight_boost) {
start.set_boost_tick(state.tick);
break;
}
}
return new AltosTelemetryIterator(state, i);
}
-}
\ No newline at end of file
+}
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.io.*;
import java.util.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.text.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTelemetryLocation extends AltosTelemetryStandard {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.text.*;
import java.util.HashMap;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTelemetryMegaData extends AltosTelemetryStandard {
int state;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTelemetryMegaSensor extends AltosTelemetryStandard {
int accel;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTelemetryMetrumData extends AltosTelemetryStandard {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTelemetryMini extends AltosTelemetryStandard {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTelemetryRaw extends AltosTelemetryStandard {
public AltosTelemetryRaw(int[] bytes) {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.text.*;
import java.io.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTelemetrySatellite extends AltosTelemetryStandard {
int channels;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTelemetrySensor extends AltosTelemetryStandard {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public abstract class AltosTelemetryStandard extends AltosTelemetry {
int[] bytes;
case packet_type_satellite:
telem = new AltosTelemetrySatellite(bytes);
break;
-/*
case packet_type_companion:
telem = new AltosTelemetryCompanion(bytes);
break;
-*/
case packet_type_mega_sensor:
telem = new AltosTelemetryMegaSensor(bytes);
break;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosTemperature extends AltosUnits {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import java.text.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosUnitsListener {
public void units_changed(boolean imperial_units);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosVersion {
public final static String version = "@VERSION@";
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public class AltosVoltage extends AltosUnits {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
public interface AltosWriter {
AltosStateUpdate.java \
AltosTelemetry.java \
AltosTelemetryConfiguration.java \
+ AltosTelemetryCompanion.java \
AltosTelemetryFile.java \
AltosTelemetryIterable.java \
AltosTelemetryLegacy.java \
import java.awt.*;
import libaltosJNI.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class Altos extends AltosUILib {
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosAscent extends AltosUIFlightTab {
JLabel cur, max;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosCompanionInfo extends JTable implements AltosFlightDisplay {
private AltosFlightInfoTableModel model;
import java.io.*;
import java.util.concurrent.*;
import java.text.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosConfig implements ActionListener {
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosConfigPyroUI
extends AltosUIDialog
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosConfigTD implements ActionListener {
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosConfigTDUI
extends AltosUIDialog
import javax.swing.*;
import javax.swing.event.*;
import java.text.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosConfigUI
extends AltosUIDialog
import java.beans.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosConfigureUI
extends AltosUIConfigure
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosDescent extends AltosUIFlightTab {
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosFlightStatus extends JComponent implements AltosFlightDisplay {
GridBagLayout layout;
int last_state = -1;
void show(AltosState state, AltosListenerState listener_state) {
- if (state.state != last_state) {
- if (state.state == AltosLib.ao_flight_stateless)
+ if (state.state() != last_state) {
+ if (state.state() == AltosLib.ao_flight_stateless)
hide();
else {
show();
value.setText(state.state_name());
}
- last_state = state.state;
+ last_state = state.state();
}
}
import java.text.*;
import java.util.prefs.*;
import java.util.concurrent.LinkedBlockingQueue;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosFlightStatusTableModel extends AbstractTableModel {
private String[] columnNames = {
package altosui;
import java.awt.event.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosFlightStatusUpdate implements ActionListener {
import javax.swing.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {
AltosVoice voice;
JComponent cur_tab = null;
JComponent which_tab(AltosState state) {
- if (state.state < Altos.ao_flight_boost)
+ if (state.state() < Altos.ao_flight_boost)
return pad;
- if (state.state <= Altos.ao_flight_coast)
+ if (state.state() <= Altos.ao_flight_coast)
return ascent;
- if (state.state <= Altos.ao_flight_main)
+ if (state.state() <= Altos.ao_flight_main)
return descent;
- if (state.state == AltosLib.ao_flight_stateless)
+ if (state.state() == AltosLib.ao_flight_stateless)
return descent;
return landed;
}
if (state == null)
state = new AltosState();
- if (state.state != Altos.ao_flight_startup) {
+ if (state.state() != Altos.ao_flight_startup) {
if (!has_state) {
pane.setTitleAt(0, "Launch Pad");
pane.add(ascent, 1);
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import java.io.*;
import java.util.concurrent.*;
import java.util.Arrays;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDisplay, AltosIdleMonitorListener, DocumentListener {
AltosDevice device;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosIgniteUI
extends AltosUIDialog
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosIgnitor extends AltosUIFlightTab {
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosLanded extends AltosUIFlightTab implements ActionListener {
import java.io.*;
import java.util.concurrent.*;
import java.awt.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosLaunch {
AltosDevice device;
import java.io.*;
import java.text.*;
import java.util.concurrent.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altosuilib_9.*;
class FireButton extends JButton {
protected void processMouseEvent(MouseEvent e) {
package altosui;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosPad extends AltosUIFlightTab {
hide();
} else {
if (state.flight != 0) {
- if (state.state <= Altos.ao_flight_pad)
+ if (state.state() <= Altos.ao_flight_pad)
show("Ready to record");
- else if (state.state < Altos.ao_flight_landed ||
- state.state == AltosLib.ao_flight_stateless)
+ else if (state.state() < Altos.ao_flight_landed ||
+ state.state() == AltosLib.ao_flight_stateless)
show("Recording data");
else
show("Recorded data");
}
boolean report_pad(AltosState state) {
- if ((state.state == AltosLib.ao_flight_stateless ||
- state.state < AltosLib.ao_flight_pad) &&
+ if ((state.state() == AltosLib.ao_flight_stateless ||
+ state.state() < AltosLib.ao_flight_pad) &&
state.gps != null &&
state.gps.lat != AltosLib.MISSING)
{
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class AltosUI extends AltosUIFrame {
public AltosVoice voice = new AltosVoice();
System.out.printf ("process cat\n");
for (AltosState state : eef) {
System.out.printf ("tick %d state %d height %g\n",
- state.tick, state.state, state.height());
+ state.tick, state.state(), state.height());
if ((state.set & AltosState.set_gps) != 0)
System.out.printf ("time %g lat %g lon %g alt %g\n",
state.time_since_boost(),
$(top_srcdir)/doc/telemetrum-outline.pdf \
$(top_srcdir)/doc/easymini-outline.pdf \
$(top_srcdir)/doc/telemega-outline.pdf \
- $(top_srcdir)/doc/telemini.pdf
+ $(top_srcdir)/doc/telemini-outline.pdf
DOC=$(ALTUSMETRUM_DOC) $(ALTOS_DOC) $(TELEMETRY_DOC) $(TEMPLATE_DOC)
File "../doc/telemetrum-outline.pdf"
File "../doc/telemega-outline.pdf"
File "../doc/easymini-outline.pdf"
- File "../doc/telemini.pdf"
+ File "../doc/telemini-outline.pdf"
SectionEnd
Section "File Associations"
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import libaltosJNI.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosBTDevice extends altos_bt_device implements AltosDevice {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.util.*;
import libaltosJNI.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosBTDeviceIterator implements Iterator<AltosBTDevice> {
AltosBTDevice current;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosBTKnown implements Iterable<AltosBTDevice> {
LinkedList<AltosBTDevice> devices = new LinkedList<AltosBTDevice>();
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import javax.swing.plaf.basic.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosBTManage extends AltosUIDialog implements ActionListener, Iterable<AltosBTDevice> {
LinkedBlockingQueue<AltosBTDevice> found_devices;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosCSVUI
extends AltosUIDialog
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.text.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
class AltosEditFreqUI extends AltosUIDialog implements ActionListener {
Frame frame;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosDataChooser extends JFileChooser {
JFrame frame;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import libaltosJNI.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import javax.swing.*;
import java.awt.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import javax.swing.*;
import java.awt.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.text.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosDisplayThread extends Thread {
return;
/* reset the landing count once we hear about a new flight */
- if (state.state < AltosLib.ao_flight_drogue)
+ if (state.state() < AltosLib.ao_flight_drogue)
reported_landing = 0;
/* Shut up once the rocket is on the ground */
}
/* If the rocket isn't on the pad, then report height */
- if (AltosLib.ao_flight_drogue <= state.state &&
- state.state < AltosLib.ao_flight_landed &&
+ if (AltosLib.ao_flight_drogue <= state.state() &&
+ state.state() < AltosLib.ao_flight_landed &&
state.from_pad != null &&
state.range >= 0)
{
(int) (state.from_pad.bearing + 0.5),
(int) (state.elevation + 0.5),
AltosConvert.distance.say(state.range));
- } else if (state.state > AltosLib.ao_flight_pad && state.height() != AltosLib.MISSING) {
+ } else if (state.state() > AltosLib.ao_flight_pad && state.height() != AltosLib.MISSING) {
voice.speak(AltosConvert.height.say_units(state.height()));
} else {
reported_landing = 0;
* either we've got a landed report or we haven't heard from it in
* a long time
*/
- if (state.state != AltosLib.ao_flight_stateless &&
- state.state >= AltosLib.ao_flight_drogue &&
+ if (state.state() != AltosLib.ao_flight_stateless &&
+ state.state() >= AltosLib.ao_flight_drogue &&
(last ||
System.currentTimeMillis() - state.received_time >= 15000 ||
- state.state == AltosLib.ao_flight_landed))
+ state.state() == AltosLib.ao_flight_landed))
{
if (Math.abs(state.speed()) < 20 && state.height() < 100)
voice.speak("rocket landed safely");
(int) (state.from_pad.bearing + 0.5),
AltosConvert.distance.say_units(state.from_pad.distance));
++reported_landing;
- if (state.state != AltosLib.ao_flight_landed) {
- state.state = AltosLib.ao_flight_landed;
- show_safely();
- }
}
}
}
public synchronized void notice(boolean spoken) {
- if (old_state != null && old_state.state != state.state) {
+ if (old_state != null && old_state.state() != state.state()) {
report_time = now();
this.notify();
} else if (spoken)
synchronized boolean tell() {
boolean ret = false;
- if (old_state == null || old_state.state != state.state) {
- if (state.state != AltosLib.ao_flight_stateless)
+ if (old_state == null || old_state.state() != state.state()) {
+ if (state.state() != AltosLib.ao_flight_stateless)
voice.speak(state.state_name());
- if ((old_state == null || old_state.state <= AltosLib.ao_flight_boost) &&
- state.state > AltosLib.ao_flight_boost) {
+ if ((old_state == null || old_state.state() <= AltosLib.ao_flight_boost) &&
+ state.state() > AltosLib.ao_flight_boost) {
if (state.max_speed() != AltosLib.MISSING)
voice.speak("max speed: %s.",
AltosConvert.speed.say_units(state.max_speed() + 0.5));
ret = true;
- } else if ((old_state == null || old_state.state < AltosLib.ao_flight_drogue) &&
- state.state >= AltosLib.ao_flight_drogue) {
+ } else if ((old_state == null || old_state.state() < AltosLib.ao_flight_drogue) &&
+ state.state() >= AltosLib.ao_flight_drogue) {
if (state.max_height() != AltosLib.MISSING)
voice.speak("max height: %s.",
AltosConvert.height.say_units(state.max_height() + 0.5));
try {
for (;;) {
try {
- state = reader.read();
- if (state == null) {
+ AltosState new_state = reader.read();
+ if (new_state == null) {
+ state = null;
listener_state.running = false;
break;
}
- reader.update(state);
+ reader.update(new_state);
+ state = new_state;
show_safely();
told = tell();
idle_thread.notice(told);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosEepromDelete implements Runnable {
AltosEepromList flights;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosEepromManage implements ActionListener {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMonitor {
JFrame owner;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
class AltosEepromItem implements ActionListener {
AltosEepromLog log;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosFlashUI
extends AltosUIDialog
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import javax.swing.table.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import javax.swing.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosFlightStatsTable extends JComponent implements AltosFontListener {
GridBagLayout layout;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosGraphDataPoint implements AltosUIDataPoint {
public int id(int index) {
if (index == data_state) {
- int s = state.state;
+ int s = state.state();
if (AltosLib.ao_flight_boost <= s && s <= AltosLib.ao_flight_landed)
return s;
} else if (data_ignitor_fired_0 <= index && index <= data_ignitor_fired_max) {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.lang.*;
import java.io.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
class AltosGraphIterator implements Iterator<AltosUIDataPoint> {
AltosGraphDataSet dataSet;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosInfoTable extends JTable implements AltosFlightDisplay, HierarchyListener {
private AltosFlightInfoTableModel model;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import javax.swing.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import javax.swing.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
public interface AltosPositionListener {
public void position_changed(int position);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosRomconfigUI
extends AltosUIDialog
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.text.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
class AltosScanResult {
String callsign;
* Deal with TeleDongle on a serial port
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import libaltosJNI.*;
/*
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
public class AltosSerialInUseException extends Exception {
public AltosDevice device;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
class DelegatingRenderer implements ListCellRenderer<Object> {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
public class AltosUIDataMissing extends Exception {
public int id;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
public interface AltosUIDataPoint {
public abstract double x() throws AltosUIDataMissing;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
public interface AltosUIDataSet {
public abstract String name();
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.concurrent.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public abstract class AltosUIFlightTab extends JComponent implements AltosFlightDisplay, HierarchyListener {
public GridBagLayout layout;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosUIFreqList extends JComboBox<AltosFrequency> {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
import javax.swing.*;
import javax.imageio.ImageIO;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public abstract class AltosUIIndicator implements AltosFontListener, AltosUnitsListener {
JLabel label;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import libaltosJNI.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosUILib extends AltosLib {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
public interface AltosUIListener {
public void ui_changed(String look_and_feel);
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.concurrent.*;
import javax.imageio.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosUIMapNew extends JComponent implements AltosFlightDisplay, AltosMapInterface {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
import java.net.URL;
import java.net.URLConnection;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
class AltosUIMapPos extends Box {
AltosUIFrame owner;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.io.*;
import java.util.*;
import java.awt.Component;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosUIPreferences extends AltosPreferences {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.io.File;
import java.util.prefs.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import javax.swing.filechooser.FileSystemView;
public class AltosUIPreferencesBackend implements AltosPreferencesBackend {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosUIRateList extends JComboBox<String> {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.util.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class AltosUITelemetryList extends JComboBox<String> {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public abstract class AltosUIUnitsIndicator extends AltosUIIndicator {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public abstract class AltosUIVoltageIndicator extends AltosUIUnitsIndicator {
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.util.*;
import libaltosJNI.*;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.awt.*;
import java.awt.event.*;
*/
-package org.altusmetrum.altosuilib_8;
+package org.altusmetrum.altosuilib_9;
import java.lang.reflect.*;
import java.util.HashMap;
#!/bin/sh
-VERSION=1.0
+VERSION=2.0
PRODUCT=TeleMega
BASE=`echo $PRODUCT | tr 'A-Z' 'a-z'`
--- /dev/null
+#!/bin/sh
+
+VERSION=1.0
+PRODUCT=TeleMega
+BASE=`echo $PRODUCT | tr 'A-Z' 'a-z'`
+
+echo "$PRODUCT-v$VERSION Test Program"
+echo "Copyright 2014 by Keith Packard. Released under GPL v2"
+echo
+echo "Expectations:"
+echo "\t$PRODUCT v$VERSION powered from USB"
+echo
+
+ret=1
+ao-list | while read product serial dev; do
+ case "$product" in
+ "$PRODUCT-v$VERSION")
+
+ echo "Testing $product $serial $dev"
+
+ ./test-igniters $dev main drogue 3 0 1 2
+ echo""
+
+ echo "Testing baro sensor"
+ ../ao-tools/ao-test-baro/ao-test-baro --tty="$dev"
+
+ case $? in
+ 0)
+ ;;
+ *)
+ echo "failed"
+ exit 1
+ esac
+ echo""
+
+ FLASHSIZE=8388608
+
+ echo "Testing flash"
+ ../ao-tools/ao-test-flash/ao-test-flash --tty="$dev" "$FLASHSIZE"
+
+ case $? in
+ 0)
+ ;;
+ *)
+ echo "failed"
+ exit 1
+ esac
+ echo""
+
+ echo "Testing GPS"
+ ../ao-tools/ao-test-gps/ao-test-gps --tty="$dev"
+
+ case $? in
+ 0)
+ ;;
+ *)
+ echo "failed"
+ exit 1
+ esac
+ echo""
+
+ echo "$PRODUCT-v$VERSION" serial "$serial" is ready to ship
+ ret=0
+ ;;
+ esac
+done
exit 1
fi
-VERSION=1.0
+VERSION=2.0
REPO=~/altusmetrumllc/Binaries
echo "TeleMega v$VERSION Turn-On and Calibration Program"
--- /dev/null
+#!/bin/sh
+
+if [ -x /usr/bin/ao-flash-stm ]; then
+ FLASH_STM=/usr/bin/ao-flash-stm
+else
+ echo "Can't find ao-flash-stm! Aborting."
+ exit 1
+fi
+
+if [ -x /usr/bin/ao-usbload ]; then
+ USBLOAD=/usr/bin/ao-usbload
+else
+ echo "Can't find ao-usbload! Aborting."
+ exit 1
+fi
+
+VERSION=1.0
+REPO=~/altusmetrumllc/Binaries
+
+echo "TeleMega v$VERSION Turn-On and Calibration Program"
+echo "Copyright 2014 by Bdale Garbee. Released under GPL v2"
+echo
+echo "Expectations:"
+echo "\tTeleMega v$VERSION powered from USB"
+echo "\t\twith ST-Link-V2 cabled to debug header"
+echo "\t\twith coax from UHF to frequency counter"
+echo
+echo -n "TeleMega-$VERSION serial number: "
+read SERIAL
+
+echo $FLASH_STM
+
+$FLASH_STM $REPO/loaders/telemega-v$VERSION*.elf || exit 1
+
+sleep 5
+
+$USBLOAD --serial=$SERIAL $REPO/telemega-v$VERSION*.elf || exit 1
+
+sleep 5
+
+dev=`ao-list | awk '/TeleMega-v'"$VERSION"'/ { print $3; exit(0); }'`
+
+case "$dev" in
+/dev/tty*)
+ echo "TeleMega found on $dev"
+ ;;
+*)
+ echo 'No TeleMega-v'"$VERSION"' found'
+ exit 1
+ ;;
+esac
+
+echo 'E 0' > $dev
+
+SERIAL=$SERIAL ./cal-freq $dev
+
+../ao-tools/ao-cal-accel/ao-cal-accel $dev
+
+echo 'E 1' > $dev
+
+./test-telemega
+
+exit $?
{
int flags, opt;
char *endptr;
- struct sigvec vec, ovec;
while ((opt = getopt_long(argc, argv, "PVvHhmt:X:c:r:Z:s:S:p:T:", options, NULL)) != -1) {
switch (opt) {
perror("fdopen");
exit(1);
}
- vec.sv_handler = SIG_IGN;
- vec.sv_mask = 0;
- vec.sv_flags = 0;
- sigvec(SIGINT, &vec, &ovec);
+ signal(SIGINT, SIG_IGN);
command_read();
- sigvec(SIGINT, &ovec, NULL);
+ signal(SIGINT, SIG_DFL);
fclose(s51_input);
fclose(s51_output);
}
} else {
s51_input = stdin;
s51_output = stdout;
- vec.sv_handler = s51_sigint;
- vec.sv_mask = 0;
- vec.sv_flags = 0;
- sigvec(SIGINT, &vec, &ovec);
+ signal(SIGINT, s51_sigint);
command_read();
}
exit(0);
telem.mega_sensor.mag_y,
telem.mega_sensor.mag_z);
break;
+ case AO_TELEMETRY_COMPANION:
+ printf("board_id %3d update_period %3d channels %2d",
+ telem.companion.board_id,
+ telem.companion.update_period,
+ telem.companion.channels);
+ for (c = 0; c < telem.companion.channels; c++)
+ printf(" %6d", telem.companion.companion_data[c]);
+ printf("\n");
+ break;
case AO_TELEMETRY_MEGA_DATA:
printf ("state %1d v_batt %5d v_pyro %5d ",
telem.mega_data.state,
printf ("s%1d %5d ", c,
telem.mega_data.sense[c] |
(telem.mega_data.sense[c] << 8));
-
+
printf ("ground_pres %5d ground_accel %5d accel_plus %5d accel_minus %5d ",
telem.mega_data.ground_pres,
telem.mega_data.ground_accel,
dnl Process this file with autoconf to create configure.
AC_PREREQ(2.57)
-AC_INIT([altos], 1.6.1)
-ANDROID_VERSION=9
+AC_INIT([altos], 1.6.2)
+ANDROID_VERSION=10
AC_CONFIG_SRCDIR([src/kernel/ao.h])
AM_INIT_AUTOMAKE([foreign dist-bzip2])
AM_MAINTAINER_MODE
dnl ==========================================================================
dnl Java library versions
-ALTOSUILIB_VERSION=8
-ALTOSLIB_VERSION=8
+ALTOSUILIB_VERSION=9
+ALTOSLIB_VERSION=9
AC_SUBST(ALTOSLIB_VERSION)
AC_DEFINE(ALTOSLIB_VERSION,$ALTOSLIB_VERSION,[Version of the AltosLib package])
Priority: optional
Maintainer: Bdale Garbee <bdale@gag.com>
Uploaders: Keith Packard <keithp@keithp.com>
-Build-Depends: autoconf,
+Build-Depends: asciidoc,
+ autoconf,
automake,
cc1111,
debhelper (>= 7),
*.html
*.pdf
*.fo
+*.raw
titlepage.templates.xsl
+fop-cfg.xml
# 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 \
- release-notes-1.1.1.html \
- release-notes-1.2.html \
- release-notes-1.2.1.html \
- release-notes-1.3.html \
- release-notes-1.3.1.html \
- release-notes-1.3.2.html \
- release-notes-1.4.html \
- release-notes-1.4.1.html \
- release-notes-1.5.html \
- release-notes-1.6.html \
- release-notes-1.6.1.html
-
-PICTURES=\
+RELNOTES_INC=\
+ release-notes-1.6.2.inc \
+ release-notes-1.6.1.inc \
+ release-notes-1.6.inc \
+ release-notes-1.5.inc \
+ release-notes-1.4.2.inc \
+ release-notes-1.4.1.inc \
+ release-notes-1.4.inc \
+ release-notes-1.3.2.inc \
+ release-notes-1.3.1.inc \
+ release-notes-1.3.inc \
+ release-notes-1.2.1.inc \
+ release-notes-1.2.inc \
+ release-notes-1.1.1.inc \
+ release-notes-1.1.inc \
+ release-notes-1.0.1.inc \
+ release-notes-0.9.2.inc \
+ release-notes-0.9.inc \
+ release-notes-0.8.inc \
+ release-notes-0.7.1.inc
+
+IMAGES=\
altosui.png \
ascent.png \
configure-altimeter.png \
configure-pyro.png \
descent.png \
device-selection.png \
+ easymega.svg \
+ easymega-v1.0-bottom.jpg \
+ easymega-v1.0-top.jpg \
+ easymini.svg \
easymini-top.jpg \
fire-igniter.png \
graph-configure.png \
graph-map.png \
graph.png \
graph-stats.png \
+ ignitor.png \
landed.png \
launch-pad.png \
load-maps.png \
micropeak-download.png \
micropeak-graph-configure.png \
micropeak-graph.png \
+ micropeak-nofont.svg \
micropeak-preferences.png \
micropeak-raw-data.png \
micropeak-save-dialog.png \
scan-channels.png \
site-map.png \
table.png \
+ telegps-configure.png \
+ telegps-graph-configure.png \
+ telegps-graph-graph.png \
+ telegps-graph-map.png \
+ telegps-graph-stats.png \
+ telegps-info.png \
+ telegps-location.png \
+ telegps-map.png \
+ telegps-preferences.png \
+ telegps-scan.png \
+ telegps-status.png \
+ telegps-table.png \
+ telegps-v1.0-top.jpg \
+ telemega.svg \
telemega-v1.0-top.jpg \
+ telemetrum.svg \
telemetrum-v1.1-thside.jpg \
+ telemetrum-v2.0-th.jpg \
+ telemini.svg \
telemini-v1-top.jpg \
- telemini-v2-top.jpg
+ altusmetrum-oneline.svg \
+ telegps-oneline.svg \
+ micropeak-oneline.svg
+
+TXT_FILES=altusmetrum.txt
+
+COMMON_INC_FILES=\
+ config-device.inc \
+ config-ui.inc \
+ load-maps.inc \
+ aprs-operation.inc \
+ handling.inc
+
+INC_FILES=\
+ dedication.inc \
+ intro.inc \
+ getting-started.inc \
+ usage.inc \
+ telemetrum.inc \
+ telemini-v1.0.inc \
+ easymini-device.inc \
+ telemega.inc \
+ easymega.inc \
+ installation.inc \
+ using-am-products.inc \
+ updating-firmware.inc \
+ altosui.inc \
+ altosdroid.inc \
+ system-operation.inc \
+ pyro-channels.inc \
+ flight-data-recording.inc \
+ specs.inc \
+ $(COMMON_INC_FILES) \
+ release-notes.inc \
+ $(RELNOTES_INC)
+
+RAW_FILES=$(TXT_FILES:.txt=.raw) $(INC_FILES:.inc=.raw)
+
+TELEGPS_INC_FILES=\
+ telegps-dedication.inc \
+ telegps-quick-start.inc \
+ telegps-using.inc \
+ telegps-system-operation.inc \
+ telegps-application.inc \
+ telegps-specs.inc \
+ telegps-updating-firmware.inc \
+ telegps-release-notes.inc \
+ $(COMMON_INC_FILES)
+
+TELEGPS_TXT_FILES=\
+ telegps.txt
+
+TELEGPS_RAW_FILES=$(TELEGPS_TXT_FILES:.txt=.raw) $(TELEGPS_INC_FILES:.inc=.raw)
+
+MICROPEAK_TXT_FILES=\
+ micropeak.txt
+
+MICROPEAK_INC_FILES=
+
+MICROPEAK_RAW_FILES=$(MICROPEAK_TXT_FILES:.txt=.raw) $(MICROPEAK_INC_FILES:.inc=.raw)
+
+EASYMINI_TXT_FILES=\
+ easymini.txt
+
+EASYMINI_INC_FILES=$(INC_FILES) easymini-release-notes.inc
+
+
+EASYMINI_RAW_FILES=$(EASYMINI_TXT_FILES:.txt=.raw) $(EASYMINI_INC_FILES:.inc=.raw)
+
+OUTLINE_TXT_FILES=\
+ easymega-outline.txt \
+ easymini-outline.txt \
+ telemega-outline.txt \
+ telemetrum-outline.txt \
+ telemini-outline.txt
+
+OUTLINE_RAW_FILES=$(OUTLINE_TXT_FILES:.txt=.raw)
+
+OUTLINE_PDF_FILES=$(OUTLINE_TXT_FILES:.txt=.pdf)
SVG=\
easymini.svg \
telemini.svg \
easymega.svg
-RELNOTES_XSL=$(RELNOTES:.html=.xsl)
-HTML=altusmetrum.html altos.html telemetry.html companion.html micropeak.html telegps.html $(RELNOTES)
-PDF=altusmetrum.pdf altos.pdf telemetry.pdf companion.pdf micropeak.pdf telegps.pdf \
- telemetrum-outline.pdf telemega-outline.pdf easymini-outline.pdf easymega-outline.pdf
-HTMLSTYLE=/usr/share/xml/docbook/stylesheet/docbook-xsl/html/docbook.xsl
-FOSTYLE=xorg-fo.xsl
-TEMPLATES=titlepage.templates.xsl
-PDFSTYLE=
-IMAGES=$(PICTURES) $(SVG)
-DOC=$(HTML) $(PDF) $(IMAGES)
+RELNOTES_PDF=$(RELNOTES_INC:.inc=.pdf)
+RELNOTES_HTML=$(RELNOTES_INC:.inc=.html)
+
+ONEFILE_TXT_FILES=\
+ altos.txt \
+ companion.txt \
+ telemetry.txt
-.SUFFIXES: .xml .xsl .html .pdf
+ONEFILE_RAW_FILES=$(ONEFILE_TXT_FILES:.txt=.raw)
+ONEFILE_PDF_FILES=$(ONEFILE_TXT_FILES:.txt=.pdf)
-XSLTFLAGS=--stringparam section.autolabel 1 --xinclude
+AM_HTML=am.html
-.xsl.html:
- xsltproc $(XSLTFLAGS) -o $@ $(HTMLSTYLE) $*.xsl
+HTML=altusmetrum.html micropeak.html telegps.html easymini.html $(RELNOTES_HTML) $(ONEFILE_HTML_FILES)
-.xsl.pdf:
- xmlto -x $(FOSTYLE) --with-fop pdf $*.xsl
+HTML_REVHISTORY=\
+ altusmetrum-revhistory.html \
+ micropeak-revhistory.html \
+ telegps-revhistory.html \
+ easymini-revhistory.html
-.xml.xsl:
- xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.xml
+PDF=altusmetrum.pdf micropeak.pdf telegps.pdf easymini.pdf $(RELNOTES_PDF) $(ONEFILE_PDF_FILES) \
+ $(OUTLINE_PDF_FILES)
+
+FOP_STYLE=am-fo.xsl
+HTML_STYLE=am-html.xsl
+COMMON_STYLE=common.xsl
+FOP_XCONF=fop.xconf
+STYLESHEET=am.css
+
+FONTS=\
+ fonts/DejaVuSansMono-BoldOblique.ttf \
+ fonts/DejaVuSansMono-Bold.ttf \
+ fonts/DejaVuSansMono-Oblique.ttf \
+ fonts/DejaVuSansMono.ttf \
+ fonts/OpenSans-Light.ttf \
+ fonts/OpenSans-LightItalic.ttf \
+ fonts/OpenSans-Regular.ttf \
+ fonts/OpenSans-Italic.ttf \
+ fonts/OpenSans-Semibold.ttf \
+ fonts/OpenSans-SemiboldItalic.ttf
+
+TEMPLATES_TMPL=titlepage.templates.tmpl
+
+TEMPLATES_XSL=$(TEMPLATES_TMPL:.tmpl=.xsl)
+
+PDF_CONFIG_FILES=$(FOP_STYLE) $(COMMON_STYLE) $(FOP_XCONF) $(TEMPLATES_XSL)
+HTML_CONFIG_FILES=$(HTML_STYLE) $(COMMON_STYLE) $(TEMPLATES_XSL)
+
+DOC=$(HTML) $(HTML_REVHISTORY) $(PDF) $(IMAGES) $(STYLESHEET)
+
+.SUFFIXES: .tmpl .xsl .inc .txt .raw .pdf .html
+
+.txt.raw:
+ sed -e 's/^[ ]*//' -e 's/^\\//' $*.txt > $@
+
+.inc.raw:
+ sed -e 's/^[ ]*//' -e 's/^\\//' $*.inc > $@
+
+.raw.pdf:
+ a2x --verbose -a docinfo -f pdf --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(FOP_STYLE) --fop --fop-opts="-c $(FOP_XCONF)" $*.raw
+ a2x --verbose -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(HTML_STYLE) --stylesheet=$(STYLESHEET) $*.raw
+
+.pdf.html:
+ @touch $@
+
+.tmpl.xsl:
+ xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.tmpl
all: $(HTML) $(PDF)
+altusmetrum-revhistory.html: altusmetrum.html
+
+micropeak-revhistory.html: micropeak.html
+
+telegps-revhistory.html: telegps.html
+
+altusmetrum.pdf altusmetrum.html: altusmetrum-docinfo.xml $(RAW_FILES) $(IMAGES)
+
+telegps.html telegps.pdf: telegps-docinfo.xml $(TELEGPS_RAW_FILES) $(IMAGES)
+
+micropeak.pdf micropeak.html: micropeak-docinfo.xml $(MICROPEAK_RAW_FILES) $(IMAGES)
+
+easymini.pdf easymini.html: easymini-docinfo.xml $(EASYMINI_RAW_FILES) $(IMAGES)
+
install: all
-publish: $(DOC)
+publish: $(DOC) $(FONTS)
cp $(DOC) /home/bdale/web/altusmetrum/AltOS/doc/
+ mkdir -p /home/bdale/web/altusmetrum/AltOS/doc/fonts/
+ cp $(FONTS) /home/bdale/web/altusmetrum/AltOS/doc/fonts/
(cd /home/bdale/web/altusmetrum ; \
git add /home/bdale/web/altusmetrum/AltOS/doc/* ; \
+ git add /home/bdale/web/altusmetrum/AltOS/doc/fonts/* ; \
echo "update docs" | \
- git commit -F - /home/bdale/web/altusmetrum/AltOS/doc/* ; \
+ git commit -F - /home/bdale/web/altusmetrum/AltOS/doc/* /home/bdale/web/altusmetrum/AltOS/doc/fonts/* ; \
git push)
+publish-keithp: am.html $(DOC) $(FONTS)
+ scp -p am.html $(DOC) keithp.com:~keithp/public_html/altos
+ scp -p $(FONTS) keithp.com:~keithp/public_html/altos/fonts
+
clean:
- rm -f $(HTML) $(PDF) $(TEMPLATES)
+ rm -f am.html $(HTML) $(HTML_REVHISTORY) $(PDF) $(TEMPLATES_XSL) $(RAW_FILES) $(TELEGPS_RAW_FILES) $(MICROPEAK_RAW_FILES)
-distclean:
+distclean: clean
rm -f $(HTML) $(PDF)
-altusmetrum.html: $(RELNOTES_XSL) $(IMAGES)
-altusmetrum.pdf: $(RELNOTES_XSL) $(IMAGES)
-
-telegps.html: $(RELNOTES_XSL) $(IMAGES)
-telegps.pdf: $(RELNOTES_XSL) $(IMAGES)
-
-$(PDF): $(FOSTYLE) $(TEMPLATES)
-
-indent: altusmetrum.xsl
- xmlindent -i 2 < altusmetrum.xsl > altusmetrum.new
+$(PDF): $(PDF_CONFIG_FILES)
+$(HTML): $(HTML_CONFIG_FILES)
+am.html: Makefile make-am-html $(HTML)
+ sh ./make-am-html $(HTML) > $@
--- /dev/null
+Creating documentation for a new release of AltOS
+
+* Write release notes in release-notes-${version}.inc. Write docinfo
+ for release notes in release-notes-${version}-docinfo.xml. Add to
+ Makefile
+
+* Add references to that as appropriate from each of the
+ documents:
+
+ release-notes.inc
+ easymini-release-notes.inc
+ telegps-release-notes.inc
+
+* Update date and add docinfo short release info for each document as
+ appropriate
+
+ altusmetrum-docinfo.xml
+ companion-docinfo.xml
+ easymini-docinfo.xml
+ micropeak-docinfo.xml
+ telegps-docinfo.xml
+ telemetry-docinfo.xml
+
+* Update copyright year as appropriate
+
+ altusmetrum-docinfo.xml
+ companion-docinfo.xml
+ easymini-docinfo.xml
+ micropeak-docinfo.xml
+ telegps-docinfo.xml
+ telemetry-docinfo.xml
+
+* Add release-notes-${version}.inc and
+ release-notes-${version}-docinfo.xml to git
--- /dev/null
+<subtitle>Altos Metrum Operating System</subtitle>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>05 November 2012</date>
+<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>
+ <?dbhtml filename="altos-revhistory.html"?>
+ <revision>
+ <revnumber>1.1</revnumber>
+ <date>05 November 2012</date>
+ <revremark>Portable version</revremark>
+ </revision>
+ <revision>
+ <revnumber>0.1</revnumber>
+ <date>22 November 2010</date>
+ <revremark>Initial content</revremark>
+ </revision>
+</revhistory>
--- /dev/null
+= AltOS
+:doctype: book
+:toc:
+:numbered:
+
+== Overview
+
+ AltOS is a operating system built for a variety of
+ microcontrollers used in Altus Metrum devices. It has a simple
+ porting layer for each CPU while providing a convenient
+ operating enviroment for the developer. AltOS currently
+ supports three different CPUs:
+
+ * STM32L series from ST Microelectronics. This ARM Cortex-M3
+ based microcontroller offers low power consumption and a
+ wide variety of built-in peripherals. Altus Metrum uses this
+ in the TeleMega, MegaDongle and TeleLCO projects.
+
+ * CC1111 from Texas Instruments. This device includes a
+ fabulous 10mW digital RF transceiver along with an
+ 8051-compatible processor core and a range of
+ peripherals. This is used in the TeleMetrum, TeleMini,
+ TeleDongle and TeleFire projects which share the need for a
+ small microcontroller and an RF interface.
+
+ * ATmega32U4 from Atmel. This 8-bit AVR microcontroller is one
+ of the many used to create Arduino boards. The 32U4 includes
+ a USB interface, making it easy to connect to other
+ computers. Altus Metrum used this in prototypes of the
+ TeleScience and TelePyro boards; those have been switched to
+ the STM32L which is more capable and cheaper.
+
+ Among the features of AltOS are:
+
+ * Multi-tasking. While microcontrollers often don'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.
+
+ * 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.
+
+ * Sleep/wakeup scheduling. Taken directly from ancient
+ Unix designs, these two provide the fundemental scheduling
+ primitive within AltOS.
+
+ * Mutexes. As a locking primitive, mutexes are easier to
+ use than semaphores, at least in my experience.
+
+ * Timers. Tasks can set an alarm which will abort any
+ pending sleep, allowing operations to time-out instead of
+ blocking forever.
+
+ 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:
+
+ ....
+ \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();
+ \}
+ ....
+
+ As you can see, a long sequence of subsystems are initialized
+ and then the scheduler is started.
+
+== AltOS Porting Layer
+
+ AltOS provides a CPU-independent interface to various common
+ microcontroller subsystems, including GPIO pins, interrupts,
+ SPI, I2C, USB and asynchronous serial interfaces. By making
+ these CPU-independent, device drivers, generic OS and
+ application code can all be written that work on any supported
+ CPU. Many of the architecture abstraction interfaces are
+ prefixed with ao_arch.
+
+ === Low-level CPU operations
+
+ These primitive operations provide the abstraction needed to
+ run the multi-tasking framework while providing reliable
+ interrupt delivery.
+
+ ==== ao_arch_block_interrupts/ao_arch_release_interrupts
+
+ ....
+ static inline void
+ ao_arch_block_interrupts(void);
+
+ static inline void
+ ao_arch_release_interrupts(void);
+ ....
+
+ These disable/enable interrupt delivery, they may not
+ discard any interrupts. Use these for sections of code that
+ must be atomic with respect to any code run from an
+ interrupt handler.
+
+ ==== ao_arch_save_regs, ao_arch_save_stack, ao_arch_restore_stack
+
+ ....
+ static inline void
+ ao_arch_save_regs(void);
+
+ static inline void
+ ao_arch_save_stack(void);
+
+ static inline void
+ ao_arch_restore_stack(void);
+ ....
+
+ These provide all of the support needed to switch
+ between tasks.. ao_arch_save_regs must save all CPU
+ registers to the current stack, including the
+ interrupt enable state. ao_arch_save_stack records the
+ current stack location in the current ao_task
+ structure. ao_arch_restore_stack switches back to the
+ saved stack, restores all registers and branches to
+ the saved return address.
+
+ ==== ao_arch_wait_interupt
+
+ ....
+ #define ao_arch_wait_interrupt()
+ ....
+
+ This stops the CPU, leaving clocks and interrupts
+ enabled. When an interrupt is received, this must wake up
+ and handle the interrupt. ao_arch_wait_interrupt is entered
+ with interrupts disabled to ensure that there is no gap
+ between determining that no task wants to run and idling the
+ CPU. It must sleep the CPU, process interrupts and then
+ disable interrupts again. If the CPU doesn't have any
+ reduced power mode, this must at the least allow pending
+ interrupts to be processed.
+
+ === GPIO operations
+
+ These functions provide an abstract interface to configure and
+ manipulate GPIO pins.
+
+ ==== GPIO setup
+
+ These macros may be invoked at system
+ initialization time to configure pins as
+ needed for system operation. One tricky aspect
+ is that some chips provide direct access to
+ specific GPIO pins while others only provide
+ access to a whole register full of pins. To
+ support this, the GPIO macros provide both
+ port+bit and pin arguments. Simply define the
+ arguments needed for the target platform and
+ leave the others undefined.
+
+ ===== ao_enable_output
+
+ ....
+ #define ao_enable_output(port, bit, pin, value)
+ ....
+
+ Set the specified port+bit (also called 'pin')
+ for output, initializing to the specified
+ value. The macro must avoid driving the pin
+ with the opposite value if at all possible.
+
+ ===== ao_enable_input
+
+ ....
+ #define ao_enable_input(port, bit, mode)
+ ....
+
+ Sets the specified port/bit to be an input
+ pin. 'mode' is a combination of one or more of
+ the following. Note that some platforms may
+ not support the desired mode. In that case,
+ the value will not be defined so that the
+ program will fail to compile.
+
+ * AO_EXTI_MODE_PULL_UP. Apply a pull-up to the
+ pin; a disconnected pin will read as 1.
+
+ * AO_EXTI_MODE_PULL_DOWN. Apply a pull-down to
+ the pin; a disconnected pin will read as 0.
+
+ * 0. Don't apply either a pull-up or
+ pull-down. A disconnected pin will read an
+ undetermined value.
+
+ ==== Reading and writing GPIO pins
+
+ These macros read and write individual GPIO pins.
+
+ ===== ao_gpio_set
+
+ ....
+ #define ao_gpio_set(port, bit, pin, value)
+ ....
+
+ Sets the specified port/bit or pin to
+ the indicated value
+
+ ===== ao_gpio_get
+
+ ....
+ #define ao_gpio_get(port, bit, pin)
+ ....
+
+ Returns either 1 or 0 depending on
+ whether the input to the pin is high
+ or low.
+== Programming the 8051 with SDCC
+
+ 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.
+
+ When built on other architectures, the various SDCC-specific
+ symbols are #defined as empty strings so they don't affect the
+ compiler.
+
+ === 8051 memory spaces
+
+ 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.
+
+ ==== __data
+
+ 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.
+
+ ==== __idata
+
+ 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.
+
+ ==== __xdata
+
+ 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.
+
+ ==== __pdata
+
+ 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.
+
+ ==== __code
+
+ 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.
+
+ ==== __bit
+
+ 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.
+
+ ==== __sfr, __sfr16, __sfr32, __sbit
+
+ Access to physical registers in the device use this mode
+ which declares the variable name, its type and the
+ address it lives at. No memory is allocated for these
+ variables.
+
+ === Function calls on the 8051
+
+ 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.
+
+ ==== __reentrant functions
+
+ 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.
+
+ 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.
+
+ ==== Non __reentrant functions
+
+ 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.
+
+ 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.
+
+ ==== __interrupt functions
+
+ 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.
+
+ ==== __critical functions and statements
+
+ 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. AltOS doesn't use this form in shared
+ code as other compilers wouldn't know what to do. Use
+ ao_arch_block_interrupts and ao_arch_release_interrupts instead.
+
+== Task functions
+
+ This chapter documents how to create, destroy and schedule
+ AltOS tasks.
+
+ === ao_add_task
+
+ ....
+ \void
+ \ao_add_task(__xdata struct ao_task * task,
+ \ void (*start)(void),
+ \ __code char *name);
+ ....
+
+ 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.
+
+ === ao_exit
+
+ ....
+ void
+ ao_exit(void)
+ ....
+
+ This terminates the current task.
+
+ === ao_sleep
+
+ ....
+ void
+ ao_sleep(__xdata void *wchan)
+ ....
+
+ 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.
+
+ 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 around the block of code. Here's a complete
+ example:
+
+ ....
+ \ao_arch_block_interrupts();
+ \while (!ao_radio_done)
+ \ ao_sleep(&ao_radio_done);
+ \ao_arch_release_interrupts();
+ ....
+
+ === ao_wakeup
+
+ ....
+ void
+ ao_wakeup(__xdata void *wchan)
+ ....
+
+ 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:
+
+ ....
+ \if (RFIF & RFIF_IM_DONE) {
+ \ ao_radio_done = 1;
+ \ ao_wakeup(&ao_radio_done);
+ \ RFIF &= ~RFIF_IM_DONE;
+ \}
+ ....
+
+ Note that this need not block interrupts 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.
+
+ === ao_alarm
+
+ ....
+ void
+ ao_alarm(uint16_t delay);
+
+ void
+ ao_clear_alarm(void);
+ ....
+
+ 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. ao_clear_alarm
+ resets any pending alarm so that it doesn't fire at
+ some arbitrary point in the future.
+
+ ....
+ ao_alarm(ao_packet_master_delay);
+ ao_arch_block_interrupts();
+ while (!ao_radio_dma_done)
+ if (ao_sleep(&ao_radio_dma_done) != 0)
+ ao_radio_abort();
+ ao_arch_release_interrupts();
+ ao_clear_alarm();
+ ....
+
+ 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.
+
+ === ao_start_scheduler
+
+ ....
+ void
+ ao_start_scheduler(void);
+ ....
+
+ This is called from 'main' when the system is all
+ initialized and ready to run. It will not return.
+
+ === ao_clock_init
+
+ ....
+ void
+ ao_clock_init(void);
+ ....
+
+ This initializes the main CPU clock and switches to it.
+
+== Timer Functions
+
+ AltOS sets up one of the CPU 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 sensors to
+ collect current data readings. Doing this from the ISR ensures
+ that the values are sampled at a regular rate, independent
+ of any scheduling jitter.
+
+ === ao_time
+
+ ....
+ uint16_t
+ ao_time(void)
+ ....
+
+ Returns the current system tick count. Note that this is
+ only a 16 bit value, and so it wraps every 655.36 seconds.
+
+ === ao_delay
+
+ ....
+ void
+ ao_delay(uint16_t ticks);
+ ....
+
+ Suspend the current task for at least 'ticks' clock units.
+
+ === ao_timer_set_adc_interval
+
+ ....
+ void
+ ao_timer_set_adc_interval(uint8_t interval);
+ ....
+
+ 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.
+
+ === ao_timer_init
+
+ ....
+ void
+ ao_timer_init(void)
+ ....
+
+ This turns on the 100Hz tick. It is required for any of the
+ time-based functions to work. It should be called by 'main'
+ before ao_start_scheduler.
+
+== AltOS Mutexes
+
+ 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.
+
+ === ao_mutex_get
+
+ ....
+ void
+ ao_mutex_get(__xdata uint8_t *mutex);
+ ....
+
+ Acquires the specified mutex, blocking if the mutex is
+ owned by another task.
+
+ === ao_mutex_put
+
+ ....
+ void
+ ao_mutex_put(__xdata uint8_t *mutex);
+ ....
+
+ Releases the specified mutex, waking up all tasks waiting
+ for it.
+
+== DMA engine
+
+ The CC1111 and STM32L both contain a useful bit of extra
+ hardware in the form of a number of 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 both internal and external devices.
+
+ Because the CC1111 and STM32L DMA engines are different, the
+ interface to them is also different. As the DMA engines are
+ currently used to implement platform-specific drivers, this
+ isn't yet a problem.
+
+ 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.
+
+ 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.
+
+ === CC1111 DMA Engine
+
+ ==== ao_dma_alloc
+
+ ....
+ uint8_t
+ ao_dma_alloc(__xdata uint8_t *done)
+ ....
+
+ Allocate a DMA engine, returning the
+ identifier. '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.
+
+ ==== ao_dma_set_transfer
+
+ ....
+ void
+ ao_dma_set_transfer(uint8_t id,
+ void __xdata *srcaddr,
+ void __xdata *dstaddr,
+ uint16_t count,
+ uint8_t cfg0,
+ uint8_t cfg1)
+ ....
+
+ 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.
+
+ ==== ao_dma_start
+
+ ....
+ void
+ ao_dma_start(uint8_t id);
+ ....
+
+ Arm the specified DMA engine and await a
+ signal from either hardware or software to
+ start transferring data.
+
+ ==== ao_dma_trigger
+
+ ....
+ void
+ ao_dma_trigger(uint8_t id)
+ ....
+
+ Trigger the specified DMA engine to start
+ copying data.
+
+ ==== ao_dma_abort
+
+ ....
+ void
+ ao_dma_abort(uint8_t id)
+ ....
+
+ Terminate any in-progress DMA transaction,
+ marking its 'done' variable with the
+ AO_DMA_ABORTED bit.
+
+ === STM32L DMA Engine
+
+ ==== ao_dma_alloc
+
+ ....
+ uint8_t ao_dma_done[];
+
+ void
+ ao_dma_alloc(uint8_t index);
+ ....
+
+ Reserve a DMA engine for exclusive use by one
+ driver.
+
+ ==== ao_dma_set_transfer
+
+ ....
+ void
+ ao_dma_set_transfer(uint8_t id,
+ void *peripheral,
+ void *memory,
+ uint16_t count,
+ uint32_t ccr);
+ ....
+
+ Initializes the specified dma engine to copy
+ data between 'peripheral' and 'memory' for
+ 'count' units. 'ccr' is a value directly out
+ of the STM32L documentation and tells the DMA
+ engine what the transfer unit size, direction
+ and step are.
+
+ ==== ao_dma_set_isr
+
+ ....
+ void
+ ao_dma_set_isr(uint8_t index, void (*isr)(int))
+ ....
+
+ This sets a function to be called when the DMA
+ transfer completes in lieu of setting the
+ ao_dma_done bits. Use this when some work
+ needs to be done when the DMA finishes that
+ cannot wait until user space resumes.
+
+ ==== ao_dma_start
+
+ ....
+ void
+ ao_dma_start(uint8_t id);
+ ....
+
+ Arm the specified DMA engine and await a
+ signal from either hardware or software to
+ start transferring data. 'ao_dma_done[index]'
+ 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.
+
+ ==== ao_dma_done_transfer
+
+ ....
+ void
+ ao_dma_done_transfer(uint8_t id);
+ ....
+
+ Signals that a specific DMA engine is done
+ being used. This allows multiple drivers to
+ use the same DMA engine safely.
+
+ ==== ao_dma_abort
+
+ ....
+ void
+ ao_dma_abort(uint8_t id)
+ ....
+
+ Terminate any in-progress DMA transaction,
+ marking its 'done' variable with the
+ AO_DMA_ABORTED bit.
+
+== Stdio interface
+
+ AltOS offers a stdio interface over USB, serial and the RF
+ packet link. This provides for control of the device locally or
+ remotely. This is hooked up to the stdio functions by providing
+ the standard putchar/getchar/flush functions. These
+ automatically multiplex the available communication channels;
+ output is always delivered to the channel which provided the
+ most recent input.
+
+ === putchar
+
+ ....
+ void
+ putchar(char c)
+ ....
+
+ Delivers a single character to the current console
+ device.
+
+ === getchar
+
+ ....
+ char
+ getchar(void)
+ ....
+
+ 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.
+
+ === flush
+
+ ....
+ void
+ flush(void)
+ ....
+
+ Flushes the current console device output buffer. Any
+ pending characters will be delivered to the target device.
+
+ === ao_add_stdio
+
+ ....
+ void
+ ao_add_stdio(char (*pollchar)(void),
+ void (*putchar)(char),
+ void (*flush)(void))
+ ....
+
+ This adds another console device to the available
+ list.
+
+ '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(&ao_stdin_ready) when it receives
+ input to tell getchar that more data is available, at
+ which point 'pollchar' will be called again.
+
+ 'putchar' queues a character for output, flushing if the output buffer is
+ full. It may block in this case.
+
+ 'flush' forces the output buffer to be flushed. It may
+ block until the buffer is delivered, but it is not
+ required to do so.
+
+== Command line interface
+
+ AltOS includes a simple command line parser which is hooked up
+ to the stdio interfaces permitting remote control of the
+ device over USB, serial 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.
+
+ === ao_cmd_register
+
+ ....
+ void
+ ao_cmd_register(__code struct ao_cmds *cmds)
+ ....
+
+ 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:
+
+ ....
+ \struct ao_cmds {
+ \ char cmd;
+ \ void (*func)(void);
+ \ const char *help;
+ \};
+ ....
+ '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:
+
+ ao_cmd_success::
+
+ The command was parsed successfully. There is no need
+ to assign this value, it is the default.
+
+ ao_cmd_lex_error::
+
+ 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.
+
+ ao_syntax_error::
+
+ The command line is invalid for some reason other than
+ invalid tokens.
+
+ === ao_cmd_lex
+
+ ....
+ void
+ ao_cmd_lex(void);
+ ....
+
+ 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.
+
+ === ao_cmd_put16
+
+ ....
+ void
+ ao_cmd_put16(uint16_t v);
+ ....
+
+ Writes 'v' as four hexadecimal characters.
+
+ === ao_cmd_put8
+
+ ....
+ void
+ ao_cmd_put8(uint8_t v);
+ ....
+
+ Writes 'v' as two hexadecimal characters.
+
+ === ao_cmd_white
+
+ ....
+ void
+ ao_cmd_white(void)
+ ....
+
+ 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.
+
+ === ao_cmd_hex
+
+ ....
+ void
+ ao_cmd_hex(void)
+ ....
+
+ 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;
+
+ === ao_cmd_decimal
+
+ ....
+ void
+ ao_cmd_decimal(void)
+ ....
+
+ 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;
+
+ === ao_match_word
+
+ ....
+ uint8_t
+ ao_match_word(__code char *word)
+ ....
+
+ 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.
+
+ === ao_cmd_init
+
+ ....
+ void
+ ao_cmd_init(void
+ ....
+
+ 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.
+
+== USB target device
+
+ AltOS contains a full-speed USB target device driver. 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.
+
+ 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.
+
+ === ao_usb_flush
+
+ ....
+ void
+ ao_usb_flush(void);
+ ....
+
+ 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.
+
+ === ao_usb_putchar
+
+ ....
+ void
+ ao_usb_putchar(char c);
+ ....
+
+ 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.
+
+ === ao_usb_pollchar
+
+ ....
+ char
+ ao_usb_pollchar(void);
+ ....
+
+ 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.
+
+ === ao_usb_getchar
+
+ ....
+ char
+ ao_usb_getchar(void);
+ ....
+
+ This uses ao_pollchar to receive the next character,
+ blocking while ao_pollchar returns AO_READ_AGAIN.
+
+ === ao_usb_disable
+
+ ....
+ void
+ ao_usb_disable(void);
+ ....
+
+ 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.
+
+ Note that neither TeleDongle v0.2 nor TeleMetrum v1
+ 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.
+
+ === ao_usb_enable
+
+ ....
+ void
+ ao_usb_enable(void);
+ ....
+
+ 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.
+
+ === ao_usb_init
+
+ ....
+ void
+ ao_usb_init(void);
+ ....
+
+ 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.
+
+== Serial peripherals
+
+ 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.
+
+ To prevent loss of data, AltOS provides receive and transmit
+ fifos of 32 characters each.
+
+ === ao_serial_getchar
+
+ ....
+ char
+ ao_serial_getchar(void);
+ ....
+
+ Returns the next character from the receive fifo, blocking
+ until a character is received if the fifo is empty.
+
+ === ao_serial_putchar
+
+ ....
+ void
+ ao_serial_putchar(char c);
+ ....
+
+ Adds a character to the transmit fifo, blocking if the
+ fifo is full. Starts transmitting characters.
+
+ === ao_serial_drain
+
+ ....
+ void
+ ao_serial_drain(void);
+ ....
+
+ Blocks until the transmit fifo is empty. Used internally
+ when changing serial speeds.
+
+ === ao_serial_set_speed
+
+ ....
+ void
+ ao_serial_set_speed(uint8_t speed);
+ ....
+
+ 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.
+
+ === ao_serial_init
+
+ ....
+ void
+ ao_serial_init(void)
+ ....
+
+ Initializes the serial peripheral. Call this from 'main'
+ before jumping to ao_start_scheduler. The default speed
+ setting is AO_SERIAL_SPEED_4800.
+
+== CC1111/CC1120/CC1200 Radio peripheral
+
+ === Radio Introduction
+
+ The CC1111, CC1120 and CC1200 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:
+
+ . 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.
+
+ . 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.
+
+ 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.
+
+ 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.
+
+ . 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.
+
+ === ao_radio_set_telemetry
+
+ ....
+ void
+ ao_radio_set_telemetry(void);
+ ....
+
+ 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.
+
+ === ao_radio_set_packet
+
+ ....
+ void
+ ao_radio_set_packet(void);
+ ....
+
+ 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.
+
+ === ao_radio_set_rdf
+
+ ....
+ void
+ ao_radio_set_rdf(void);
+ ....
+
+ 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.
+
+ === ao_radio_idle
+
+ ....
+ void
+ ao_radio_idle(void);
+ ....
+
+ Sets the radio device to idle mode, waiting until it reaches
+ that state. This will terminate any in-progress transmit or
+ receive operation.
+
+ === ao_radio_get
+
+ ....
+ void
+ ao_radio_get(void);
+ ....
+
+ Acquires the radio mutex and then configures the radio
+ frequency using the global radio calibration and channel
+ values.
+
+ === ao_radio_put
+
+ ....
+ void
+ ao_radio_put(void);
+ ....
+
+ Releases the radio mutex.
+
+ === ao_radio_abort
+
+ ....
+ void
+ ao_radio_abort(void);
+ ....
+
+ Aborts any transmission or reception process by aborting the
+ associated DMA object and calling ao_radio_idle to terminate
+ the radio operation.
+
+ === Radio Telemetry
+
+ 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.
+
+ ==== ao_radio_send
+
+ ....
+ void
+ ao_radio_send(__xdata struct ao_telemetry *telemetry);
+ ....
+
+ 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.
+
+ ==== ao_radio_recv
+
+ ....
+ void
+ ao_radio_recv(__xdata struct ao_radio_recv *radio);
+ ....
+
+ 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()).
+
+ === Radio Direction Finding
+
+ In radio direction finding mode, there's just one function to
+ use
+
+ ==== ao_radio_rdf
+
+ ....
+ void
+ ao_radio_rdf(int ms);
+ ....
+
+ This sends an RDF packet lasting for the specified amount
+ of time. The maximum length is 1020 ms.
+
+ === Radio Packet Mode
+
+ 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.
+
+ ==== ao_packet_putchar
+
+ ....
+ void
+ ao_packet_putchar(char c);
+ ....
+
+ 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.
+
+ ==== ao_packet_pollchar
+
+ ....
+ char
+ ao_packet_pollchar(void);
+ ....
+
+ 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.
+
+ ==== ao_packet_slave_start
+
+ ....
+ void
+ ao_packet_slave_start(void);
+ ....
+
+ This is available only on the slave side and starts a task
+ to listen for packet data.
+
+ ==== ao_packet_slave_stop
+
+ ....
+ void
+ ao_packet_slave_stop(void);
+ ....
+
+ Disables the packet slave task, stopping the radio receiver.
+
+ ==== ao_packet_slave_init
+
+ ....
+ void
+ ao_packet_slave_init(void);
+ ....
+
+ 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.
+
+ ==== ao_packet_master_init
+
+ ....
+ void
+ ao_packet_master_init(void);
+ ....
+
+ Adds the 'p' packet forward command to start packet mode.
+++ /dev/null
-<?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>1.1</revnumber>
- <date>05 November 2012</date>
- <revremark>Portable version</revremark>
- </revision>
- <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 a variety of
- microcontrollers used in Altus Metrum devices. It has a simple
- porting layer for each CPU while providing a convenient
- operating enviroment for the developer. AltOS currently
- supports three different CPUs:
- <itemizedlist>
- <listitem>
- <para>
- STM32L series from ST Microelectronics. This ARM Cortex-M3
- based microcontroller offers low power consumption and a
- wide variety of built-in peripherals. Altus Metrum uses
- this in the TeleMega, MegaDongle and TeleLCO projects.
- </para>
- </listitem>
- <listitem>
- <para>
- CC1111 from Texas Instruments. This device includes a
- fabulous 10mW digital RF transceiver along with an
- 8051-compatible processor core and a range of
- peripherals. This is used in the TeleMetrum, TeleMini,
- TeleDongle and TeleFire projects which share the need for
- a small microcontroller and an RF interface.
- </para>
- </listitem>
- <listitem>
- <para>
- ATmega32U4 from Atmel. This 8-bit AVR microcontroller is
- one of the many used to create Arduino boards. The 32U4
- includes a USB interface, making it easy to connect to
- other computers. Altus Metrum used this in prototypes of
- the TeleScience and TelePyro boards; those have been
- switched to the STM32L which is more capable and cheaper.
- </para>
- </listitem>
- </itemizedlist>
- Among the features of AltOS are:
- <itemizedlist>
- <listitem>
- <para>Multi-tasking. While microcontrollers often don'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>AltOS Porting Layer</title>
- <para>
- AltOS provides a CPU-independent interface to various common
- microcontroller subsystems, including GPIO pins, interrupts,
- SPI, I2C, USB and asynchronous serial interfaces. By making
- these CPU-independent, device drivers, generic OS and
- application code can all be written that work on any supported
- CPU. Many of the architecture abstraction interfaces are
- prefixed with ao_arch.
- </para>
- <section>
- <title>Low-level CPU operations</title>
- <para>
- These primitive operations provide the abstraction needed to
- run the multi-tasking framework while providing reliable
- interrupt delivery.
- </para>
- <section>
- <title>ao_arch_block_interrupts/ao_arch_release_interrupts</title>
- <programlisting>
- static inline void
- ao_arch_block_interrupts(void);
-
- static inline void
- ao_arch_release_interrupts(void);
- </programlisting>
- <para>
- These disable/enable interrupt delivery, they may not
- discard any interrupts. Use these for sections of code that
- must be atomic with respect to any code run from an
- interrupt handler.
- </para>
- </section>
- <section>
- <title>ao_arch_save_regs, ao_arch_save_stack,
- ao_arch_restore_stack</title>
- <programlisting>
- static inline void
- ao_arch_save_regs(void);
-
- static inline void
- ao_arch_save_stack(void);
-
- static inline void
- ao_arch_restore_stack(void);
- </programlisting>
- <para>
- These provide all of the support needed to switch between
- tasks.. ao_arch_save_regs must save all CPU registers to the
- current stack, including the interrupt enable
- state. ao_arch_save_stack records the current stack location
- in the current ao_task structure. ao_arch_restore_stack
- switches back to the saved stack, restores all registers and
- branches to the saved return address.
- </para>
- </section>
- <section>
- <title>ao_arch_wait_interupt</title>
- <programlisting>
- #define ao_arch_wait_interrupt()
- </programlisting>
- <para>
- This stops the CPU, leaving clocks and interrupts
- enabled. When an interrupt is received, this must wake up
- and handle the interrupt. ao_arch_wait_interrupt is entered
- with interrupts disabled to ensure that there is no gap
- between determining that no task wants to run and idling the
- CPU. It must sleep the CPU, process interrupts and then
- disable interrupts again. If the CPU doesn't have any
- reduced power mode, this must at the least allow pending
- interrupts to be processed.
- </para>
- </section>
- </section>
- <section>
- <title>GPIO operations</title>
- <para>
- These functions provide an abstract interface to configure and
- manipulate GPIO pins.
- </para>
- <section>
- <title>GPIO setup</title>
- <para>
- These macros may be invoked at system initialization time to
- configure pins as needed for system operation. One tricky
- aspect is that some chips provide direct access to specific
- GPIO pins while others only provide access to a whole
- register full of pins. To support this, the GPIO macros
- provide both port+bit and pin arguments. Simply define the
- arguments needed for the target platform and leave the
- others undefined.
- </para>
- <section>
- <title>ao_enable_output</title>
- <programlisting>
- #define ao_enable_output(port, bit, pin, value)
- </programlisting>
- <para>
- Set the specified port+bit (also called 'pin') for output,
- initializing to the specified value. The macro must avoid
- driving the pin with the opposite value if at all
- possible.
- </para>
- </section>
- <section>
- <title>ao_enable_input</title>
- <programlisting>
- #define ao_enable_input(port, bit, mode)
- </programlisting>
- <para>
- Sets the specified port/bit to be an input pin. 'mode' is
- a combination of one or more of the following. Note that
- some platforms may not support the desired mode. In that
- case, the value will not be defined so that the program
- will fail to compile.
- <itemizedlist>
- <listitem>
-<para>
- AO_EXTI_MODE_PULL_UP. Apply a pull-up to the pin; a
- disconnected pin will read as 1.
-</para>
- </listitem>
- <listitem>
-<para>
- AO_EXTI_MODE_PULL_DOWN. Apply a pull-down to the pin;
- a disconnected pin will read as 0.
-</para>
- </listitem>
- <listitem>
-<para>
- 0. Don't apply either a pull-up or pull-down. A
- disconnected pin will read an undetermined value.
-</para>
- </listitem>
- </itemizedlist>
- </para>
- </section>
- </section>
- <section>
- <title>Reading and writing GPIO pins</title>
- <para>
- These macros read and write individual GPIO pins.
- </para>
- <section>
- <title>ao_gpio_set</title>
- <programlisting>
- #define ao_gpio_set(port, bit, pin, value)
- </programlisting>
- <para>
- Sets the specified port/bit or pin to the indicated value
- </para>
- </section>
- <section>
- <title>ao_gpio_get</title>
- <programlisting>
- #define ao_gpio_get(port, bit, pin)
- </programlisting>
- <para>
- Returns either 1 or 0 depending on whether the input to
- the pin is high or low.
- </para>
- </section>
- </section>
- </section>
- </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>
- <para>
- When built on other architectures, the various SDCC-specific
- symbols are #defined as empty strings so they don't affect the compiler.
- </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, its 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. AltOS doesn't use this form in shared
- code as other compilers wouldn't know what to do. Use
- ao_arch_block_interrupts and ao_arch_release_interrupts instead.
- </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 around the block of code. Here's a complete
- example:
- <programlisting>
- ao_arch_block_interrupts();
- while (!ao_radio_done)
- ao_sleep(&ao_radio_done);
- ao_arch_release_interrupts();
- </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 & RFIF_IM_DONE) {
- ao_radio_done = 1;
- ao_wakeup(&ao_radio_done);
- RFIF &= ~RFIF_IM_DONE;
- }
- </programlisting>
- Note that this need not block interrupts 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);
-
- void
- ao_clear_alarm(void);
- </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. ao_clear_alarm resets any pending
- alarm so that it doesn't fire at some arbitrary point in the
- future.
- <programlisting>
- ao_alarm(ao_packet_master_delay);
- ao_arch_block_interrupts();
- while (!ao_radio_dma_done)
- if (ao_sleep(&ao_radio_dma_done) != 0)
- ao_radio_abort();
- ao_arch_release_interrupts();
- ao_clear_alarm();
- </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 initializes the main CPU clock and switches to it.
- </para>
- </section>
- </chapter>
- <chapter>
- <title>Timer Functions</title>
- <para>
- AltOS sets up one of the CPU 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 sensors to
- collect current data readings. Doing this from the ISR ensures
- that the 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. 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>DMA engine</title>
- <para>
- The CC1111 and STM32L both contain a useful bit of extra
- hardware in the form of a number of 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 both internal and external devices.
- </para>
- <para>
- Because the CC1111 and STM32L DMA engines are different, the
- interface to them is also different. As the DMA engines are
- currently used to implement platform-specific drivers, this
- isn't yet a problem.
- </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>CC1111 DMA Engine</title>
- <section>
- <title>ao_dma_alloc</title>
- <programlisting>
- uint8_t
- ao_dma_alloc(__xdata uint8_t *done)
- </programlisting>
- <para>
- Allocate a DMA engine, returning the identifier. '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 transaction, marking its
- 'done' variable with the AO_DMA_ABORTED bit.
- </para>
- </section>
- </section>
- <section>
- <title>STM32L DMA Engine</title>
- <section>
- <title>ao_dma_alloc</title>
- <programlisting>
- uint8_t ao_dma_done[];
-
- void
- ao_dma_alloc(uint8_t index);
- </programlisting>
- <para>
- Reserve a DMA engine for exclusive use by one
- driver.
- </para>
- </section>
- <section>
- <title>ao_dma_set_transfer</title>
- <programlisting>
- void
- ao_dma_set_transfer(uint8_t id,
- void *peripheral,
- void *memory,
- uint16_t count,
- uint32_t ccr);
- </programlisting>
- <para>
- Initializes the specified dma engine to copy data between
- 'peripheral' and 'memory' for 'count' units. 'ccr' is a
- value directly out of the STM32L documentation and tells the
- DMA engine what the transfer unit size, direction and step
- are.
- </para>
- </section>
- <section>
- <title>ao_dma_set_isr</title>
- <programlisting>
- void
- ao_dma_set_isr(uint8_t index, void (*isr)(int))
- </programlisting>
- <para>
- This sets a function to be called when the DMA transfer
- completes in lieu of setting the ao_dma_done bits. Use this
- when some work needs to be done when the DMA finishes that
- cannot wait until user space resumes.
- </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.
- 'ao_dma_done[index]' 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_done_transfer</title>
- <programlisting>
- void
- ao_dma_done_transfer(uint8_t id);
- </programlisting>
- <para>
- Signals that a specific DMA engine is done being used. This
- allows multiple drivers to use the same DMA engine safely.
- </para>
- </section>
- <section>
- <title>ao_dma_abort</title>
- <programlisting>
- void
- ao_dma_abort(uint8_t id)
- </programlisting>
- <para>
- Terminate any in-progress DMA transaction, marking its
- 'done' variable with the AO_DMA_ABORTED bit.
- </para>
- </section>
- </section>
- </chapter>
- <chapter>
- <title>Stdio interface</title>
- <para>
- AltOS offers a stdio interface over USB, serial and the RF
- packet link. This provides for control of the device locally or
- remotely. This is hooked up to the stdio functions by providing
- the standard putchar/getchar/flush functions. These
- automatically multiplex the 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.
- </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(&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, serial 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>
- <term>ao_cmd_success</term>
- <listitem>
- <para>
- The command was parsed successfully. There is no
- need to assign this value, it is the default.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>ao_cmd_lex_error</term>
- <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>
- <term>ao_syntax_error</term>
- <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>USB target device</title>
- <para>
- AltOS contains a full-speed USB target device driver. 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>Serial peripherals</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>
- <section>
- <title>Radio Introduction</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>
- <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>
- <section>
- <title>Radio Telemetry</title>
- <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>
- </section>
- <section>
- <title>Radio Direction Finding</title>
- <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>
- </section>
- <section>
- <title>Radio Packet Mode</title>
- <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>
- </section>
- </chapter>
-</book>
--- /dev/null
+== AltosDroid
+
+ AltosDroid provides the same flight monitoring capabilities as
+ AltosUI, but runs on Android devices. AltosDroid is designed
+ to connect to a TeleBT receiver over Bluetooth™ and (on
+ Android devices supporting USB On-the-go) TeleDongle and
+ TeleBT devices over USB. AltosDroid monitors telemetry data,
+ logging it to internal storage in the Android device, and
+ presents that data in a UI similar to the 'Monitor Flight'
+ window in AltosUI.
+
+ This manual will explain how to configure AltosDroid, connect
+ to TeleBT or TeleDongle, operate the flight monitoring
+ interface and describe what the displayed data means.
+
+ === Installing AltosDroid
+
+ AltosDroid is available from the Google Play store. To
+ install it on your Android device, open the Google
+ Play Store application and search for
+ “altosdroid”. Make sure you don't have a space between
+ “altos” and “droid” or you probably won't find what
+ you want. That should bring you to the right page from
+ which you can download and install the application.
+
+ === Charging TeleBT Battery
+
+ Before using TeleBT with AltosDroid, make sure the
+ internal TeleBT battery is charged. To do this,
+ attach a micro USB cable from a computer or other USB
+ power source to TeleBT. A dual LED on the circuit
+ board should illuminate, showing red while the battery
+ is charging, green when charging is completed, and
+ both red and green on at the same time if there is a
+ battery fault.
+
+ === Connecting to TeleBT over Bluetooth™
+
+ Press the Android 'Menu' button or soft-key to see the
+ configuration options available. Select the 'Connect a
+ device' option and then the 'Scan for devices' entry
+ at the bottom to look for your TeleBT device. Select
+ your device, and when it asks for the code, enter
+ '1234'.
+
+ Subsequent connections will not require you to enter
+ that code, and your 'paired' device will appear in the
+ list without scanning.
+
+ === Connecting to TeleDongle or TeleBT over USB
+
+ Get a special USB On-the-go adapter cable. These
+ cables have a USB micro-B male connector on one end
+ and a standard A female connector on the other
+ end. Plug in your TeleDongle or TeleBT device to the
+ adapter cable and the adapter cable into your phone
+ and AltosDroid should automatically start up. If it
+ doesn't, the most likely reason is that your Android
+ device doesn't support USB On-the-go.
+
+ === Configuring AltosDroid
+
+ There are several configuration and operation
+ parameters available in the AltosDroid menu.
+
+ Select radio frequency::
+
+ This selects which frequency to listen on by bringing
+ up a menu of pre-set radio frequencies. Pick the one
+ which matches your altimeter.
+
+ Select data rate::
+
+ Altus Metrum transmitters can be configured to operate
+ at lower data rates to improve transmission range. If
+ you have configured your device to do this, this menu
+ item allows you to change the receiver to match.
+
+ Change units::
+
+ This toggles between metric and imperial units.
+
+ Load maps::
+
+ Brings up a dialog allowing you to download offline
+ map tiles so that you can have maps available even if
+ you have no network connectivity at the launch site.
+
+ Map type::
+
+ Displays a menu of map types and lets you select
+ one. Hybrid maps include satellite images with a
+ roadmap overlaid. Satellite maps dispense with the
+ roadmap overlay. Roadmap shows just the roads. Terrain
+ includes roads along with shadows indicating changes
+ in elevation, and other geographical features.
+
+ Toggle Online/Offline maps::
+
+ Switches between online and offline maps. Online maps
+ will show a 'move to current position' icon in the
+ upper right corner, while offline maps will have
+ copyright information all over the map. Otherwise,
+ they're pretty similar.
+
+ Select Tracker::
+
+ Switches the information displays to show data for a
+ different transmitting device. The map will always
+ show all of the devices in view. Trackers are shown
+ and selected by serial number, so make sure you note
+ the serial number of devices in each airframe.
+
+ Delete Track::
+
+ Deletes all information about a transmitting device.
+
+ === AltosDroid Flight Monitoring
+
+ AltosDroid is designed to mimic the AltosUI flight
+ monitoring display, providing separate tabs for each
+ stage of your rocket flight along with a tab
+ containing a map of the local area with icons marking
+ the current location of the altimeter and the Android
+ device.
+
+ === Pad
+
+ The '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.
+
+ When the pad tab is selected, the voice responses will
+ include status changes to the igniters and GPS
+ reception, letting you know if the rocket is still
+ ready for launch.
+
+ Battery::
+
+ This indicates whether the Li-Po battery powering the
+ transmitter has sufficient charge to last for the
+ duration of the flight. A value of more than 3.8V is
+ required for a 'GO' status.
+
+ Receiver Battery::
+
+ This indicates whether the Li-Po battery powering the
+ TeleBT has sufficient charge to last for the duration
+ of the flight. A value of more than 3.8V is required
+ for a 'GO' status.
+
+ 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
+ and TeleMega can store multiple flights, depending on
+ the configured maximum flight log size. TeleGPS logs
+ data continuously. 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.
+
+ GPS Locked::
+
+ For a TeleMetrum or TeleMega 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.
+
+ GPS Ready::
+
+ For a TeleMetrum or TeleMega 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.
+
+ Apogee Igniter::
+
+ 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.
+
+ Main Igniter::
+
+ 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.
+
+ Igniter A-D::
+
+ This indicates whether the indicated additional pyro
+ channel 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.
+
+ The Pad tab also shows the location of the Android
+ device.
+
+ === Flight
+
+ The 'Flight' tab shows information used to evaluate
+ and spot a rocket while in flight. It displays speed
+ and height data to monitor the health of the rocket,
+ along with elevation, range and bearing to help locate
+ the rocket in the sky.
+
+ While the Flight tab is displayed, the voice
+ announcements will include current speed, height,
+ elevation and bearing information.
+
+ Speed::
+
+ Shows current vertical speed. During descent, the
+ speed values are averaged over a fairly long time to
+ try and make them steadier.
+
+ Height::
+
+ Shows the current height above the launch pad.
+
+ Max Speed::
+
+ Shows the maximum vertical speed seen during the
+ flight.
+
+ Max Height::
+
+ Shows the maximum height above launch pad.
+
+ Elevation::
+
+ This is the angle above the horizon from the android
+ devices current position.
+
+ Range::
+
+ The total distance from the android device to the
+ rocket, including both ground distance and difference
+ in altitude. Use this to gauge how large the rocket is
+ likely to appear in the sky.
+
+ Bearing::
+
+ This is the aziumuth from true north for the rocket
+ from the android device. Use this in combination with
+ the Elevation value to help locate the rocket in the
+ sky, or at least to help point the antenna in the
+ general direction. This is provided in both degrees
+ and a compass point (like West South West). You'll
+ want to know which direction is true north before
+ launching your rocket.
+
+ Ground Distance::
+
+ This shows the distance across the ground to the
+ lat/lon where the rocket is located. Use this to
+ estimate what is currently under the rocket.
+
+ Latitude/Longitude::
+
+ Displays the last known location of the rocket.
+
+ Apogee Igniter::
+
+ 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.
+
+ Main Igniter::
+
+ 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.
+
+ === Recover
+
+ The 'Recover' tab shows information used while
+ recovering the rocket on the ground after flight.
+
+ While the Recover tab is displayed, the voice
+ announcements will include distance along with either
+ bearing or direction, depending on whether you are
+ moving.
+
+ Bearing::
+
+ This is the aziumuth from true north for the rocket
+ from the android device. Use this in combination with
+ the Elevation value to help locate the rocket in the
+ sky, or at least to help point the antenna in the
+ general direction. This is provided in both degrees
+ and a compass point (like West South West). You'll
+ want to know which direction is true north before
+ launching your rocket.
+
+ Direction::
+
+ When you are in motion, this provides the angle from
+ your current direction of motion towards the rocket.
+
+ Distance::
+
+ Distance over the ground to the rocket.
+
+ Tar Lat/Tar Lon::
+
+ Displays the last known location of the rocket.
+
+ My Lat/My Lon::
+
+ Displays the location of the Android device.
+
+ Max Height::
+
+ Shows the maximum height above launch pad.
+
+ Max Speed::
+
+ Shows the maximum vertical speed seen during the
+ flight.
+
+ Max Accel::
+
+ Shows the maximum vertical acceleration seen during
+ the flight.
+
+ === Map
+
+ The 'Map' tab shows a map of the area around the
+ rocket being tracked along with information needed to
+ recover it.
+
+ On the map itself, icons showing the location of the
+ android device along with the last known location of
+ each tracker. A blue line is drawn from the android
+ device location to the currently selected tracker.
+
+ Below the map, the distance and either bearing or
+ direction along with the lat/lon of the target and the
+ android device are shown
+
+ The Map tab provides the same voice announcements as
+ the Recover tab.
+
+ === Downloading Flight Logs
+
+ AltosDroid always saves every bit of telemetry data it
+ receives. To download that to a computer for use with
+ AltosUI, remove the SD card from your Android device,
+ or connect your device to your computer's USB port and
+ browse the files on that device. You will find
+ '.telem' files in the TeleMetrum directory that will
+ work with AltosUI directly.
--- /dev/null
+== AltosUI
+
+ .AltosUI Main Window
+ image::altosui.png[width="4.6in"]
+
+ The AltosUI program provides a graphical user interface for
+ interacting with the Altus Metrum product family. AltosUI can
+ monitor telemetry data, configure devices and many other
+ tasks. The primary interface window provides a selection of
+ buttons, one for each major activity in the system. This
+ chapter is split into sections, each of which documents one of
+ the tasks provided from the top-level toolbar.
+
+ ifdef::radio[]
+ === Monitor Flight
+ ////
+ <subtitle>Receive, Record and Display Telemetry Data</subtitle>
+ ////
+
+ 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.
+
+ .Device Selection Dialog
+ image::device-selection.png[width="3.1in"]
+
+ 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.
+
+ 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.
+
+ Below the TeleDongle frequency selector, the window
+ contains a few significant pieces of information about
+ the altimeter providing the telemetry data stream:
+
+ * The configured call-sign
+
+ * The device serial number
+
+ * The flight number. Each altimeter remembers how
+ many times it has flown.
+
+ * The rocket flight state. Each flight passes through
+ several states including Pad, Boost, Fast, Coast,
+ Drogue, Main and Landed.
+
+ * The Received Signal Strength Indicator value. This
+ lets you know how strong a signal TeleDongle is
+ receiving. At the default data rate, 38400 bps, in
+ bench testing, the radio inside TeleDongle v0.2
+ operates down to about -106dBm, while the v3 radio
+ works down to about -111dBm. Weaker signals, or an
+ environment with radio noise may cause the data to
+ not be received. The packet link uses error
+ detection and correction techniques which prevent
+ incorrect data from being reported.
+
+ * The age of the displayed data, in seconds since the
+ last successfully received telemetry packet. In
+ normal operation this will stay in the low single
+ digits. If the number starts counting up, then you
+ are no longer receiving data over the radio link
+ from the flight computer.
+
+ 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.
+
+ ==== Launch Pad
+
+ .Monitor Flight Launch Pad View
+ image::launch-pad.png[width="5.5in"]
+
+ 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:
+
+ Battery Voltage::
+ This indicates whether the Li-Po battery powering the
+ flight computer has sufficient charge to last for
+ the duration of the flight. A value of more than
+ 3.8V is required for a 'GO' status.
+
+ 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.
+
+ 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.
+
+ 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. Most of our
+ flight computers can store multiple flights, depending
+ on the configured maximum flight log size. TeleMini
+ v1.0 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 even if the
+ flight data storage is full.
+
+ GPS Locked::
+ For a TeleMetrum or TeleMega 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.
+
+ GPS Ready::
+
+ For a TeleMetrum or TeleMega 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.
+
+ The Launchpad tab also shows the computed launch pad
+ position and altitude, averaging many reported
+ positions to improve the accuracy of the fix.
+
+ ==== Ascent
+
+ .Monitor Flight Ascent View
+ image::ascent.png[width="5.5in"]
+
+ This tab is shown during Boost, Fast and Coast
+ phases. The information displayed here helps monitor the
+ rocket as it heads towards apogee.
+
+ The height, speed, acceleration and tilt 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.
+
+ The current latitude and longitude reported by the 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.
+
+ 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.
+
+ ==== Descent
+
+ .Monitor Flight Descent View
+ image::descent.png[width="5.5in"]
+
+ 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.
+
+ 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.
+
+ With GPS-equipped flight computers, 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. Ground Distance
+ shows how far it is to a point directly under the
+ rocket and can help figure out where the rocket is
+ likely to land. 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.
+
+ 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.
+
+ ==== Landed
+
+ .Monitor Flight Landed View
+ image::landed.png[width="5.5in"]
+
+ 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.
+
+ 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.
+
+ Our flight computers 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.
+
+ 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 may yield more precise results.
+
+ 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.
+
+ ==== Table
+
+ .Monitor Flight Table View
+ image::table.png[width="5.5in"]
+
+ The table view shows all of the data available from the
+ flight computer. Probably the most useful data on
+ this tab is the detailed GPS information, which includes
+ horizontal dilution of precision information, and
+ information about the signal being received from the satellites.
+
+ ==== Site Map
+
+ .Monitor Flight Site Map View
+ image::site-map.png[width="5.5in"]
+
+ 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.
+
+ The map's default 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.
+
+ You can adjust the style of map and the zoom level
+ with buttons on the right side of the map window. You
+ can draw a line on the map by moving the mouse over
+ the map with a button other than the left one pressed,
+ or by pressing the left button while also holding down
+ the shift key. The length of the line in real-world
+ units will be shown at the start of the line.
+
+ 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.
+
+ You can pre-load images for your favorite launch sites
+ before you leave home; check out <<_load_maps>>.
+
+ ==== Igniter
+
+ .Monitor Flight Additional Igniter View
+ image::ignitor.png[width="5.5in"]
+
+ TeleMega includes four additional programmable pyro
+ channels. The Ignitor tab shows whether each of them has
+ continuity. If an ignitor has a low resistance, then the
+ voltage measured here will be close to the pyro battery
+ voltage. A value greater than 3.2V is required for a 'GO'
+ status.
+ endif::radio[]
+
+
+ === Save Flight Data
+
+ The altimeter records flight data to its internal
+ flash memory.
+ ifdef::radio[]
+ Data logged on board 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.
+ endif::radio[]
+ The 'Save Flight Data' button allows you to
+ read the flash memory and write it to disk.
+
+ Clicking on the 'Save Flight Data' button brings up a
+ list of connected flight computers and TeleDongle
+ devices. If you select a flight computer, the flight
+ data will be downloaded from that device directly.
+ ifdef::radio[]
+ If you select a TeleDongle device, flight data will be
+ downloaded from a flight computer over radio link via
+ the specified TeleDongle. See
+ <<_controlling_an_altimeter_over_the_radio_link>> for
+ more information.
+ endif::radio[]
+
+ 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.
+
+ The file name for each flight log is computed
+ automatically from the recorded flight date, altimeter
+ serial number and flight number information.
+
+ === Replay Flight
+
+ 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.
+
+ Once a flight record is selected, the flight monitor interface
+ is displayed and the flight is re-enacted in real
+ time.
+ ifdef::radio[]
+ Check
+ <<_monitor_flight>> to learn how this window operates.
+ endif::radio[]
+
+ === Graph Data
+
+ 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.
+
+ 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.
+
+ Once a flight record is selected, a window with multiple tabs is
+ opened.
+
+ ==== Flight Graph
+
+ .Flight Data Graph
+ image::graph.png[width="5.5in"]
+
+ By default, the graph contains acceleration (blue),
+ velocity (green) and altitude (red).
+
+ 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.
+
+ ==== Configure Graph
+
+ .Flight Graph Configuration
+ image::graph-configure.png[width="5.5in"]
+
+ This selects which graph elements to show, and, at the
+ very bottom, lets you switch between metric and
+ imperial units
+
+ ==== Flight Statistics
+
+ .Flight Statistics
+ image::graph-stats.png[width="5.5in"]
+
+ Shows overall data computed from the flight.
+
+ ifdef::gps[]
+ ==== Map
+
+ .Flight Map
+ image::graph-map.png[width="5.5in"]
+
+ Shows a satellite image of the flight area overlaid
+ with the path of the flight. The red concentric
+ circles mark the launch pad, the black concentric
+ circles mark the landing location.
+ endif::gps[]
+
+ === Export Data
+
+ 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,
+ which can be either a .eeprom or .telem. The .eeprom
+ files contain higher resolution and more continuous
+ data, while .telem files contain receiver signal
+ strength information. Next, a second dialog appears
+ which is used to select where to write the resulting
+ file.
+ ifdef::gps[]
+ It has a selector to choose between CSV and KML
+ file formats.
+ endif::gps[]
+
+ ==== Comma Separated Value Format
+
+ 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.
+
+ 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.
+
+ ifdef::gps[]
+ ==== Keyhole Markup Language (for Google Earth)
+
+ 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.
+ endif::gps[]
+
+ === Configure Altimeter
+
+ .Altimeter Configuration
+ image::configure-altimeter.png[width="3.6in"]
+
+ ifdef::radio[]
+ Select this button and then select either an altimeter or
+ TeleDongle Device from the list provided. Selecting a TeleDongle
+ device will use the radio link to configure a remote
+ altimeter.
+ endif::radio[]
+ ifndef::radio[]
+ Select this button and then select an altimeter.
+ endif::radio[]
+
+ 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.
+
+ At the bottom of the dialog, there are four buttons:
+
+ 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.
+
+ Reset::
+ This resets the dialog to the most recently saved
+ values, erasing any changes you have made.
+
+ 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.
+
+ Close::
+
+ This closes the dialog. Any unsaved changes will be
+ lost.
+
+ The rest of the dialog contains the parameters to be configured.
+
+ include::config-device.raw[]
+
+
+ === Configure AltosUI
+
+ .Configure AltosUI Dialog
+ image::configure-altosui.png[width="2.4in"]
+
+ This button presents a dialog so that you can
+ configure the AltosUI global settings.
+
+ include::config-ui.raw[]
+
+ ifdef::radio[]
+ === Configure Groundstation
+
+ .Configure Groundstation Dialog
+ image::configure-groundstation.png[width="3.1in"]
+
+ Select this button and then select a TeleDongle or
+ TeleBT Device from the list provided.
+
+ 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.
+
+ Note that TeleDongle and TeleBT don't save any
+ configuration data, the settings here are recorded on
+ the local machine in the Java preferences
+ database. Moving the device to another machine, or
+ using a different user account on the same machine
+ will cause settings made here to have no effect.
+
+ At the bottom of the dialog, there are three
+ buttons:
+
+ Save::
+ This writes any changes to the local Java
+ preferences file. If you don't press this
+ button, any changes you make will be lost.
+
+ Reset::
+ This resets the dialog to the most recently
+ saved values, erasing any changes you have
+ made.
+
+ Close::
+ This closes the dialog. Any unsaved changes
+ will be lost.
+
+ The rest of the dialog contains the parameters
+ to be configured.
+
+ ==== Frequency
+
+ This configures the frequency to use for both
+ telemetry and packet command mode. Set this
+ before starting any operation involving packet
+ command mode so that it will use the right
+ frequency. Telemetry monitoring mode also
+ provides a menu to change the frequency, and
+ that menu also sets the same Java preference
+ value used here.
+
+ ==== RF Calibration
+
+ The radios in every Altus Metrum device are
+ calibrated at the factory to ensure that they
+ transmit and receive on the specified
+ frequency. To change a TeleDongle or TeleBT's
+ calibration, you must reprogram the unit
+ completely, so this entry simply shows the
+ current value and doesn't allow any changes.
+
+ ==== Telemetry Rate
+
+ This lets you match the telemetry and packet
+ link rate from the transmitter. If they don't
+ match, the device won't receive any data.
+ endif::radio[]
+
+ === Flash Image
+
+ This reprograms Altus Metrum devices with new
+ firmware.
+ ifdef::telemetrum,telemini[]
+ TeleMetrum v1.x, TeleDongle v0.2, TeleMini
+ and TeleBT are all reprogrammed by using another
+ similar unit as a programming dongle (pair
+ programming).
+ endif::telemetrum,telemini[]
+ ifdef::telemega,easymega,telemetrum[]
+ TeleMega, EasyMega, TeleMetrum v2,
+ EasyMini and TeleDongle v3 are all
+ endif::telemega,easymega,telemetrum[]
+ ifndef::telemega,easymega,telemetrum[]
+ EasyMini is
+ endif::telemega,easymega,telemetrum[]
+ programmed directly
+ over USB (self programming). Please read
+ the directions for flashing devices in
+ <<_updating_device_firmware>>.
+
+ === Fire Igniter
+
+ .Fire Igniter Window
+ image::fire-igniter.png[width="1.2in"]
+
+ This activates the igniter circuits in the flight
+ computer to help test recovery systems
+ deployment.
+ ifdef::radio[]
+ 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.
+ endif::radio[]
+
+ Selecting the 'Fire Igniter' button brings up the
+ usual device selection dialog. Pick the desired
+ device. This brings up another window which shows the
+ current continuity test status for all of the pyro
+ channels.
+
+ Next, select the desired igniter to fire. This will
+ enable the 'Arm' button.
+
+ 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.
+
+ ifdef::radio[]
+ === Scan Channels
+
+ .Scan Channels Window
+ image::scan-channels.png[width="3.2in"]
+
+ 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 baud rates and telemetry formats should
+ be tried; by default, it only listens at 38400 baud
+ with the standard telemetry format used in v1.0 and
+ later firmware.
+ endif::radio[]
+
+ ifdef::gps[]
+ include::load-maps.raw[]
+ endif::gps[]
+
+ ifdef::radio[]
+ === Monitor Idle
+
+ .Monitor Idle Window
+ image::monitor-idle.png[width="5.2in"]
+
+ 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. Because this uses command mode, it needs to
+ have the TeleDongle and flight computer callsigns
+ match exactly. If you can receive telemetry, but
+ cannot manage to run Monitor Idle, then it's very
+ likely that your callsigns are different in some way.
+
+ You can change the frequency and callsign used to
+ communicate with the flight computer; they must both
+ match the configuration in the flight computer
+ exactly.
+ endif::radio[]
--- /dev/null
+<subtitle>An Owner's Manual for Altus Metrum Rocketry Electronics</subtitle>
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<author>
+ <firstname>Bob</firstname>
+ <surname>Finch</surname>
+</author>
+<author>
+ <firstname>Anthony</firstname>
+ <surname>Towns</surname>
+</author>
+<copyright>
+ <year>2016</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="../themes/background.png" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+
+<corpauthor>
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="4in"/>
+ </imageobject>
+ </inlinemediaobject>
+</corpauthor>
+
+<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>
+ <?dbhtml filename="altusmetrum-revhistory.html"?>
+ <revision>
+ <revnumber>1.6.2</revnumber>
+ <date>10 January 2016</date>
+ <revremark>
+ Minor release adding TeleMega v2.0 support.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.6.1</revnumber>
+ <date>15 July 2015</date>
+ <revremark>
+ Minor release adding TeleBT v3.0 support.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.6</revnumber>
+ <date>8 January 2015</date>
+ <revremark>
+ Major release adding TeleDongle v3.0 support.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.5</revnumber>
+ <date>6 September 2014</date>
+ <revremark>
+ Major release adding EasyMega support.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.4.2</revnumber>
+ <date>17 August 2014</date>
+ <revremark>
+ Minor release fixing some Windows installation bugs.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.4.1</revnumber>
+ <date>20 June 2014</date>
+ <revremark>
+ Minor release fixing some installation bugs.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.4</revnumber>
+ <date>15 June 2014</date>
+ <revremark>
+ Major release adding TeleGPS support.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.3.2</revnumber>
+ <date>24 January 2014</date>
+ <revremark>
+ Bug fixes for TeleMega and AltosUI.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.3.1</revnumber>
+ <date>21 January 2014</date>
+ <revremark>
+ Bug fixes for TeleMega and TeleMetrum v2.0 along with a few
+ small UI improvements.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.3</revnumber>
+ <date>12 November 2013</date>
+ <revremark>
+ Updated for software version 1.3. Version 1.3 adds support
+ for TeleMega, TeleMetrum v2.0 and EasyMini
+ and fixes bugs in AltosUI and the AltOS firmware.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.2.1</revnumber>
+ <date>21 May 2013</date>
+ <revremark>
+ Updated for software version 1.2. Version 1.2 adds support
+ for TeleBT and AltosDroid. It also adds a few minor features
+ and fixes bugs in AltosUI and the AltOS firmware.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.2</revnumber>
+ <date>18 April 2013</date>
+ <revremark>
+ Updated for software version 1.2. Version 1.2 adds support
+ for MicroPeak and the MicroPeak USB interface.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.1.1</revnumber>
+ <date>16 September 2012</date>
+ <revremark>
+ Updated for software version 1.1.1 Version 1.1.1 fixes a few
+ bugs found in version 1.1.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.1</revnumber>
+ <date>13 September 2012</date>
+ <revremark>
+ Updated for software version 1.1. Version 1.1 has new
+ features but is otherwise compatible with version 1.0.
+ </revremark>
+ </revision>
+ <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>
+ <revision>
+ <revnumber>0.7.1</revnumber>
+ <date>29 September 2010</date>
+ <revremark>Added AltosUI</revremark>
+ </revision>
+</revhistory>
--- /dev/null
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ width="444"
+ height="98"
+ version="1.0"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="altusmetrum-oneline.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/keithp/src/cc1111/altus-logo/bottom.png"
+ inkscape:export-xdpi="119.89881"
+ inkscape:export-ydpi="119.89881">
+ <metadata
+ id="metadata14">
+ <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>
+ <defs
+ id="defs12">
+ <linearGradient
+ id="linearGradient4171">
+ <stop
+ id="stop4173"
+ offset="0"
+ style="stop-color:#da7000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#a63852;stop-opacity:1;"
+ offset="0.24528302"
+ id="stop4175" />
+ <stop
+ id="stop4177"
+ offset="1"
+ style="stop-color:#7200a4;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3165">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3167" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3169" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3177">
+ <stop
+ style="stop-color:#da7000;stop-opacity:1;"
+ offset="0"
+ id="stop3179" />
+ <stop
+ id="stop3447"
+ offset="0.24528302"
+ style="stop-color:#a63852;stop-opacity:1;" />
+ <stop
+ style="stop-color:#7200a4;stop-opacity:1;"
+ offset="1"
+ id="stop3181" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3169">
+ <stop
+ style="stop-color:#ff8a00;stop-opacity:1;"
+ offset="0"
+ id="stop3171" />
+ <stop
+ id="stop3445"
+ offset="0.71698111"
+ style="stop-color:#c24573;stop-opacity:0.98039216;" />
+ <stop
+ style="stop-color:#8500e7;stop-opacity:0.96078432;"
+ offset="1"
+ id="stop3173" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 121 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="191 : 121 : 1"
+ inkscape:persp3d-origin="95.5 : 80.666667 : 1"
+ id="perspective16" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient3175"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3177"
+ id="linearGradient3183"
+ x1="170.6575"
+ y1="110.17125"
+ x2="614.24878"
+ y2="110.17125"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient3171"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3177"
+ id="linearGradient3781"
+ x1="193.16029"
+ y1="121.50799"
+ x2="589.83154"
+ y2="121.50799"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient3008"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient3010"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient3012"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient3014"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient3016"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient3018"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4171"
+ id="linearGradient4229"
+ x1="47.299"
+ y1="31.709364"
+ x2="129.17451"
+ y2="31.709364"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4171"
+ id="linearGradient4176"
+ gradientUnits="userSpaceOnUse"
+ x1="47.299"
+ y1="31.709364"
+ x2="129.17451"
+ y2="31.709364" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4171"
+ id="linearGradient4178"
+ gradientUnits="userSpaceOnUse"
+ x1="47.299"
+ y1="31.709364"
+ x2="129.17451"
+ y2="31.709364" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4171"
+ id="linearGradient4180"
+ gradientUnits="userSpaceOnUse"
+ x1="47.299"
+ y1="31.709364"
+ x2="129.17451"
+ y2="31.709364" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:cy="-41.854765"
+ inkscape:cx="115.51489"
+ inkscape:zoom="1.7366335"
+ inkscape:window-height="1404"
+ inkscape:window-width="1799"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:window-x="343"
+ inkscape:window-y="171"
+ inkscape:current-layer="svg2"
+ inkscape:window-maximized="0"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ units="px" />
+ <g
+ id="g4218"
+ style="fill:url(#linearGradient4229);fill-opacity:1"
+ transform="translate(20.153936,16.360317)">
+ <path
+ d="m 59.744607,35.548307 c 6.934865,0 15.789201,4.210453 17.399081,13.126708 0.619184,3.343596 1.362205,5.139231 4.458127,5.139231 2.167146,0 3.715107,-1.733717 3.715107,-4.953475 0,-1.919472 -1.671798,-13.064791 -9.783114,-28.358645 -3.529351,-6.687191 -5.634578,-9.845031 -9.225847,-9.845031 -4.334291,0 -6.315681,3.15784 -9.845032,9.845031 -8.111315,15.293854 -9.163928,26.439173 -9.163928,28.358645 0,2.972085 0.681102,4.953475 4.024698,4.953475 2.229064,0 3.529351,-1.362206 3.777025,-3.653188 0.433429,-4.148535 1.362205,-10.092705 3.034003,-14.612751 l 1.60988,0 z m 0.247673,-6.191844 c 1.60988,-3.838943 3.653188,-7.55405 6.129926,-11.269156 3.034003,4.829638 5.386904,10.030787 7.244457,15.355773 l -0.123837,0.123837 C 69.156209,30.223321 63.831224,29.356463 60.79722,29.356463 l -0.80494,0 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient4176);fill-opacity:1;stroke:none"
+ id="path3362"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 99.370471,13.62918 c 0,-2.229064 -1.17645,-4.0246989 -3.715106,-4.0246989 -2.538656,0 -3.715106,1.7956349 -3.715106,4.0246989 l 0,36.160367 c 0,2.229064 1.17645,4.024699 3.715106,4.024699 2.538656,0 3.715106,-1.795635 3.715106,-4.024699 l 0,-36.160367 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient4178);fill-opacity:1;stroke:none"
+ id="path3364"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 123.29227,28.861115 c 1.98139,0 3.59127,-1.052613 3.59127,-3.343595 0,-2.290983 -1.60988,-3.343596 -3.59127,-3.343596 l -5.44882,0 0,-5.263067 c 0,-2.229064 -1.17645,-4.024699 -3.71511,-4.024699 -2.53865,0 -3.7151,1.795635 -3.7151,4.024699 l 0,5.263067 -2.10523,0 c -2.04331,0 -3.65319,1.052613 -3.65319,3.343596 0,2.290982 1.60988,3.343595 3.65319,3.343595 l 2.10523,0 0,13.374383 c 0,11.392992 4.33429,11.392992 13.74589,11.392992 3.3436,0 5.01539,-1.114531 5.01539,-3.529351 0,-2.414819 -1.67179,-3.52935 -3.77702,-3.52935 l -3.96278,0 c -2.84825,0 -3.59127,-1.733717 -3.59127,-5.448823 l 0,-12.259851 5.44882,0 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient4180);fill-opacity:1;stroke:none"
+ id="path3366"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g4231"
+ style="fill:#78079a;fill-opacity:1"
+ transform="translate(20.153936,16.360317)">
+ <path
+ d="m 158.87506,25.827112 c 0,-2.229064 -1.17645,-4.024699 -3.71511,-4.024699 -2.53865,0 -3.7151,1.795635 -3.7151,4.024699 l 0,12.817116 c 0,5.758415 -2.72442,8.668582 -6.93487,8.668582 -3.3436,0 -5.01539,-2.105227 -5.01539,-6.439518 l 0,-15.04618 c 0,-2.229064 -1.17645,-4.024699 -3.71511,-4.024699 -2.53866,0 -3.71511,1.795635 -3.71511,4.024699 l 0,17.02757 c 0,6.315681 4.3343,11.145319 11.02149,11.145319 3.40551,0 5.88225,-0.990695 8.35899,-3.343596 0,1.547961 1.17645,3.343596 3.7151,3.343596 2.53866,0 3.71511,-1.795635 3.71511,-4.024698 l 0,-24.148191 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ id="path3368"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 179.78124,53.62849 c 6.99678,0 12.19793,-3.15784 12.19793,-10.649971 0,-13.06479 -19.50431,-8.297071 -19.50431,-12.569443 0,-1.486042 1.54796,-1.547961 2.66249,-1.547961 l 10.83573,0 c 1.98139,0 3.59127,-1.052613 3.59127,-3.343595 0,-2.290983 -1.60988,-3.343596 -3.59127,-3.343596 l -10.4023,0 c -6.81103,0 -10.52613,2.538656 -10.52613,8.173234 0,12.940953 19.50431,6.191844 19.50431,12.569443 0,3.343595 -2.3529,4.024698 -5.32499,4.024698 l -11.14532,0 c -2.04331,0 -3.65319,1.052614 -3.65319,3.343596 0,2.290982 1.60988,3.343595 3.65319,3.343595 l 11.70259,0 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ id="path3370"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 216.06544,26.446296 c -2.53866,-3.095922 -4.0247,-7.058702 -6.12993,-12.197932 -0.9907,-2.414819 -2.47674,-3.405514 -4.95348,-3.405514 -4.76771,0 -4.95347,3.653188 -5.94417,9.597358 -1.17645,6.996783 -2.22906,19.132797 -2.22906,26.191499 0,4.334291 0.30959,7.182539 3.83894,7.182539 3.46744,0 3.96278,-2.352901 3.96278,-5.263067 l 0,-9.783114 c 0,-5.386904 0.61919,-10.959563 1.48605,-16.656059 l 0.12383,0 c 0.9907,3.15784 5.51074,13.498219 9.84504,13.498219 4.33429,0 8.85433,-10.340379 9.84503,-13.498219 l 0.12383,0 c 0.86686,5.696496 1.48605,11.269155 1.48605,16.656059 l 0,9.783114 c 0,2.910166 0.49534,5.263067 3.96278,5.263067 3.52935,0 3.83894,-2.848248 3.83894,-7.182539 0,-7.058702 -1.05261,-19.194716 -2.22906,-26.191499 -0.9907,-5.94417 -1.17645,-9.597358 -5.94417,-9.597358 -2.47674,0 -3.96278,0.990695 -4.95348,3.405514 -2.10523,5.13923 -3.59127,9.10201 -6.12992,12.197932 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ id="path3372"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 266.81728,53.62849 c 1.98139,0 3.59127,-1.052613 3.59127,-3.343595 0,-2.290982 -1.60988,-3.343596 -3.59127,-3.343596 l -7.98748,0 c -5.20115,0 -9.59735,-1.547961 -10.0927,-7.368294 l 18.94704,0 c 2.60057,0 3.034,-1.547961 3.034,-3.653188 0,-7.244457 -4.27237,-14.117404 -14.61275,-14.117404 -9.47352,0 -15.54153,7.244458 -15.54153,16.532223 0,9.225848 6.19185,15.293854 17.21333,15.293854 l 9.04009,0 z M 249.23245,34.000346 c 0.86685,-3.715107 3.96278,-6.006089 6.87294,-6.006089 2.91017,0 6.00609,2.290982 6.81103,6.006089 l -13.68397,0 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ id="path3374"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 291.99582,28.861115 c 1.98139,0 3.59127,-1.052613 3.59127,-3.343595 0,-2.290983 -1.60988,-3.343596 -3.59127,-3.343596 l -5.44882,0 0,-5.263067 c 0,-2.229064 -1.17645,-4.024699 -3.7151,-4.024699 -2.53866,0 -3.71511,1.795635 -3.71511,4.024699 l 0,5.263067 -2.10523,0 c -2.04331,0 -3.65319,1.052613 -3.65319,3.343596 0,2.290982 1.60988,3.343595 3.65319,3.343595 l 2.10523,0 0,13.374383 c 0,11.392992 4.33429,11.392992 13.74589,11.392992 3.3436,0 5.0154,-1.114531 5.0154,-3.529351 0,-2.414819 -1.6718,-3.52935 -3.77703,-3.52935 l -3.96278,0 c -2.84825,0 -3.59127,-1.733717 -3.59127,-5.448823 l 0,-12.259851 5.44882,0 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ id="path3376"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 301.26328,49.603792 c 0,2.414819 1.36221,4.210454 3.71511,4.210454 2.3529,0 3.7151,-1.795635 3.7151,-4.210454 l 0,-13.560138 c 0,-5.696496 1.79564,-7.182539 5.44883,-7.182539 2.66249,0 4.27237,-1.114532 4.27237,-3.467432 0,-2.105227 -1.11453,-3.59127 -3.83894,-3.59127 -3.46744,0 -5.82034,1.486043 -6.31568,4.891557 l -0.12384,0 -0.12384,-1.919472 c -0.24767,-2.786329 -1.98139,-2.972085 -3.34359,-2.972085 -2.16715,0 -3.40552,1.238369 -3.40552,3.777025 l 0,24.024354 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ id="path3378"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 348.2584,25.827112 c 0,-2.229064 -1.17645,-4.024699 -3.71511,-4.024699 -2.53866,0 -3.71511,1.795635 -3.71511,4.024699 l 0,12.817116 c 0,5.758415 -2.72441,8.668582 -6.93486,8.668582 -3.3436,0 -5.01539,-2.105227 -5.01539,-6.439518 l 0,-15.04618 c 0,-2.229064 -1.17645,-4.024699 -3.71511,-4.024699 -2.53866,0 -3.71511,1.795635 -3.71511,4.024699 l 0,17.02757 c 0,6.315681 4.33429,11.145319 11.02149,11.145319 3.40551,0 5.88225,-0.990695 8.35898,-3.343596 0,1.547961 1.17645,3.343596 3.71511,3.343596 2.53866,0 3.71511,-1.795635 3.71511,-4.024698 l 0,-24.148191 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ id="path3380"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 355.79019,49.789547 c 0,2.229064 1.17645,4.024699 3.7151,4.024699 2.53866,0 3.71511,-1.795635 3.71511,-4.024699 l 0,-12.631361 c 0,-5.820333 2.66249,-8.668581 5.94417,-8.668581 4.14853,0 5.01539,3.281677 5.01539,7.554049 l 0,13.745893 c 0,2.229064 1.17645,4.024699 3.71511,4.024699 2.53865,0 3.7151,-1.795635 3.7151,-4.024699 l 0,-12.631361 c 0,-5.820333 2.6625,-8.668581 5.94417,-8.668581 4.14854,0 5.0154,3.281677 5.0154,7.554049 l 0,13.745893 c 0,2.229064 1.17645,4.024699 3.7151,4.024699 2.53866,0 3.71511,-1.795635 3.71511,-4.024699 l 0,-16.841815 c 0,-6.315681 -4.33429,-11.145319 -11.02148,-11.145319 -4.08662,0 -7.30638,2.167146 -9.96887,4.643883 -2.84825,-3.529351 -5.07731,-4.643883 -8.66858,-4.643883 -3.03401,0 -5.6965,1.238369 -7.86364,3.343596 0,-1.733716 -1.05262,-3.343596 -3.3436,-3.343596 -2.29098,0 -3.34359,1.60988 -3.34359,3.59127 l 0,24.395864 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ id="path3382"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="matrix(0.02211373,0,0,0.02211373,20.216433,16.77932)"
+ id="g3"
+ style="fill:url(#radialGradient3175);fill-opacity:1;stroke:url(#radialGradient3171);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none">
+ <g
+ transform="translate(20.61545,-27.69425)"
+ style="fill:url(#radialGradient3016);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3018);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g5">
+ <path
+ d="m 931.07168,1164.597 248.86992,-331.80265 416.1687,1338.32935 286.6484,267.1042 -520.4224,0 -270.2797,-262.2181 0,-1033.0627 -160.98492,106.6818 -160.98492,-106.6818 0,1033.0627 -270.2797,262.2181 -520.4224,0 286.6484,-267.1042 416.1687,-1338.32935 248.86992,331.80265 z"
+ id="path7"
+ style="fill:url(#radialGradient3008);fill-opacity:1;stroke:url(#radialGradient3010);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 931.07168,27.69425 224.03682,720.46517 -63.341,76.00913 L 931.07168,486.3269 770.37586,824.16855 707.03486,748.15942 931.07168,27.69425 Z"
+ id="path9"
+ style="fill:url(#radialGradient3012);fill-opacity:1;stroke:url(#radialGradient3014);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
--- /dev/null
+= The Altus Metrum System
+:doctype: book
+:numbered:
+:altusmetrum: 1
+:radio: 1
+:gps: 1
+:telemetrum: 1
+:telemini: 1
+:easymini: 1
+:telemega: 1
+:easymega: 1
+:telegps: 1
+:application: AltosUI
+
+ include::dedication.raw[]
+
+ include::intro.raw[]
+
+ include::getting-started.raw[]
+
+ include::usage.raw[]
+
+ include::telemetrum.raw[]
+
+ include::telemini-v1.0.raw[]
+
+ include::easymini-device.raw[]
+
+ include::telemega.raw[]
+
+ include::easymega.raw[]
+
+ include::installation.raw[]
+
+ include::using-am-products.raw[]
+
+ include::altosui.raw[]
+
+ include::altosdroid.raw[]
+
+ include::system-operation.raw[]
+
+ include::handling.raw[]
+
+ include::updating-firmware.raw[]
+
+ include::flight-data-recording.raw[]
+
+ include::specs.raw[]
+
+ include::release-notes.raw[]
+++ /dev/null
-<?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 Altus Metrum Rocketry Electronics</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>2015</year>
- <holder>Bdale Garbee and Keith Packard</holder>
- </copyright>
- <mediaobject>
- <imageobject>
- <imagedata fileref="../themes/background.png" width="6.0in"/>
- </imageobject>
- </mediaobject>
- <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.6.1</revnumber>
- <date>15 July 2015</date>
- <revremark>
- Minor release adding TeleBT v3.0 support.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.6</revnumber>
- <date>8 January 2015</date>
- <revremark>
- Major release adding TeleDongle v3.0 support.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.5</revnumber>
- <date>6 September 2014</date>
- <revremark>
- Major release adding EasyMega support.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.4.1</revnumber>
- <date>20 June 2014</date>
- <revremark>
- Minor release fixing some installation bugs.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.4</revnumber>
- <date>15 June 2014</date>
- <revremark>
- Major release adding TeleGPS support.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.3.2</revnumber>
- <date>24 January 2014</date>
- <revremark>
- Bug fixes for TeleMega and AltosUI.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.3.1</revnumber>
- <date>21 January 2014</date>
- <revremark>
- Bug fixes for TeleMega and TeleMetrum v2.0 along with a few
- small UI improvements.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.3</revnumber>
- <date>12 November 2013</date>
- <revremark>
- Updated for software version 1.3. Version 1.3 adds support
- for TeleMega, TeleMetrum v2.0, TeleMini v2.0 and EasyMini
- and fixes bugs in AltosUI and the AltOS firmware.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.2.1</revnumber>
- <date>21 May 2013</date>
- <revremark>
- Updated for software version 1.2. Version 1.2 adds support
- for TeleBT and AltosDroid. It also adds a few minor features
- and fixes bugs in AltosUI and the AltOS firmware.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.2</revnumber>
- <date>18 April 2013</date>
- <revremark>
- Updated for software version 1.2. Version 1.2 adds support
- for MicroPeak and the MicroPeak USB interface.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.1.1</revnumber>
- <date>16 September 2012</date>
- <revremark>
- Updated for software version 1.1.1 Version 1.1.1 fixes a few
- bugs found in version 1.1.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.1</revnumber>
- <date>13 September 2012</date>
- <revremark>
- Updated for software version 1.1. Version 1.1 has new
- features but is otherwise compatible with version 1.0.
- </revremark>
- </revision>
- <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>
- <dedication>
- <title>Acknowledgments</title>
- <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>
- </dedication>
- <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. The latest version
- of TeleMetrum, v2.0, has all of the same features but with
- improved sensors and radio to offer increased performance.
- </para>
- <para>
- Our second device was TeleMini, a dual deploy altimeter with
- radio telemetry and radio direction finding. The first version
- of this device was only 13mm by 38mm (½ inch by 1½ inches) and
- could fit easily in an 18mm air-frame. The latest version, v2.0,
- includes a beeper, USB data download and extended on-board
- flight logging, along with an improved barometric sensor.
- </para>
- <para>
- TeleMega is our most sophisticated device, including six pyro
- channels (four of which are fully programmable), integrated GPS,
- integrated gyroscopes for staging/air-start inhibit and high
- performance telemetry.
- </para>
- <para>
- EasyMini is a dual-deploy altimeter with logging and built-in
- USB data download.
- </para>
- <para>
- EasyMega is essentially a TeleMega board with the GPS receiver
- and telemetry transmitter removed. It offers the same 6 pyro
- channels and integrated gyroscopes for staging/air-start inhibit.
- </para>
- <para>
- TeleDongle v0.2 was our first ground station, providing a USB to RF
- interfaces 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. The latest version, TeleDongle
- v3, has all new electronics with a higher performance radio
- for improved range.
- </para>
- <para>
- For a slightly more portable ground station experience that also
- provides direct rocket recovery support, TeleBT offers flight
- monitoring and data logging using a Bluetooth™ connection between
- the receiver and an Android device that has the AltosDroid
- application installed from the Google Play store.
- </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>
- For TeleMetrum, TeleMega and EasyMega, the battery can be charged by plugging it into the
- corresponding socket of the device and then using the USB
- cable to plug the flight computer into your computer's USB socket. The
- on-board circuitry will charge the battery whenever it is plugged
- in, because the on-off switch does NOT control the
- charging circuitry.
- </para>
- <para>
- On TeleMetrum v1 boards, when the GPS chip is initially
- searching for satellites, TeleMetrum will consume more current
- than it pulls 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>
- TeleMetrum v2.0, TeleMega and EasyMega use a higher power battery charger,
- allowing them to charge the battery while running the board at
- maximum power. When the battery is charging, or when the board
- is consuming a lot of power, the red LED will be lit. When the
- battery is fully charged, the green LED will be lit. When the
- battery is damaged or missing, both LEDs will be lit, which
- appears yellow.
- </para>
- <para>
- The Lithium Polymer TeleMini and EasyMini battery can be charged by
- disconnecting it from the board and plugging it into a
- standalone battery charger such as the LipoCharger product
- included in TeleMini Starter Kits, and connecting that via a USB
- cable to a laptop or other USB power source.
- </para>
- <para>
- You can also choose to use another battery with TeleMini v2.0
- and EasyMini, anything supplying between 4 and 12 volts should
- work fine (like a standard 9V battery), but if you are planning
- to fire pyro charges, ground testing is required to verify that
- the battery supplies enough current to fire your chosen e-matches.
- </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 an older version of Linux and are having
- problems, try moving to a fresher kernel (2.6.33 or newer).
- </para>
- <para>
- Next you should obtain and install the AltOS software. The AltOS
- distribution includes the AltosUI ground station program, current
- firmware
- images for all of the hardware, 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>
- <para>
- If you're using a TeleBT instead of the TeleDongle, you'll want to
- install the AltosDroid application from the Google Play store on an
- Android device. You don't need a data plan to use AltosDroid, but
- without network access, the Map view will be less useful as it
- won't contain any map data. You can also use TeleBT connected
- over USB with your laptop computer; it acts exactly like a
- TeleDongle. Anywhere this manual talks about TeleDongle, you can
- also read that as 'and TeleBT when connected via USB'.
- </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 all of our flight computers are
- sensitive to sunlight. In normal mounting situations, the baro sensor
- 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 when designing an
- installation in an air-frame with a see-through plastic payload bay. It
- is particularly important to
- consider this with TeleMini v1.0, 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>Altus Metrum Hardware</title>
- <section>
- <title>General Usage Instructions</title>
- <para>
- Here are general instructions for hooking up an Altus Metrum
- flight computer. Instructions specific to each model will be
- found in the section devoted to that model below.
- </para>
- <para>
- To prevent electrical interference from affecting the
- operation of the flight computer, it's important to always
- twist pairs of wires connected to the board. Twist the switch
- leads, the pyro leads and the battery leads. This reduces
- interference through a mechanism called common mode rejection.
- </para>
- <section>
- <title>Hooking Up Lithium Polymer Batteries</title>
- <para>
- All Altus Metrum flight computers have a two pin JST PH
- series connector to connect up a single-cell Lithium Polymer
- cell (3.7V nominal). You can purchase matching batteries
- from the Altus Metrum store, or other vendors, or you can
- make your own. Pin 1 of the connector is positive, pin 2 is
- negative. Spark Fun sells a cable with the connector
- attached, which they call a <ulink
- url="https://www.sparkfun.com/products/9914">JST Jumper 2
- Wire Assembly</ulink>.
- </para>
- <para>
- Many RC vendors also sell lithium polymer batteries with
- this same connector. All that we have found use the opposite
- polarity, and if you use them that way, you will damage or
- destroy the flight computer.
- </para>
- </section>
- <section>
- <title>Hooking Up Pyro Charges</title>
- <para>
- Altus Metrum flight computers always have two screws for
- each pyro charge. This means you shouldn't need to put two
- wires into a screw terminal or connect leads from pyro
- charges together externally.
- </para>
- <para>
- On the flight computer, one lead from each charge is hooked
- to the positive battery terminal through the power switch.
- The other lead is connected through the pyro circuit, which
- is connected to the negative battery terminal when the pyro
- circuit is fired.
- </para>
- </section>
- <section>
- <title>Hooking Up a Power Switch</title>
- <para>
- Altus Metrum flight computers need an external power switch
- to turn them on. This disconnects both the computer and the
- pyro charges from the battery, preventing the charges from
- firing when in the Off position. The switch is in-line with
- the positive battery terminal.
- </para>
- <section>
- <title>Using an External Active Switch Circuit</title>
- <para>
- You can use an active switch circuit, such as the
- Featherweight Magnetic Switch, with any Altus Metrum
- flight computer. These require three connections, one to
- the battery, one to the positive power input on the flight
- computer and one to ground. Find instructions on how to
- hook these up for each flight computer below. The follow
- the instructions that come with your active switch to
- connect it up.
- </para>
- </section>
- </section>
- <section>
- <title>Using a Separate Pyro Battery</title>
- <para>
- As mentioned above in the section on hooking up pyro
- charges, one lead for each of the pyro charges is connected
- through the power switch directly to the positive battery
- terminal. The other lead is connected to the pyro circuit,
- which connects it to the negative battery terminal when the
- pyro circuit is fired. The pyro circuit on all of the flight
- computers is designed to handle up to 16V.
- </para>
- <para>
- To use a separate pyro battery, connect the negative pyro
- battery terminal to the flight computer ground terminal,
- the positive battery terminal to the igniter and the other
- igniter lead to the negative pyro terminal on the flight
- computer. When the pyro channel fires, it will complete the
- circuit between the negative pyro terminal and the ground
- terminal, firing the igniter. Specific instructions on how
- to hook this up will be found in each section below.
- </para>
- </section>
- <section>
- <title>Using a Different Kind of Battery</title>
- <para>
- EasyMini and TeleMini v2 are designed to use either a
- lithium polymer battery or any other battery producing
- between 4 and 12 volts, such as a rectangular 9V
- battery. TeleMega, EasyMega and TeleMetrum are not designed for this,
- and must only be powered by a lithium polymer battery. Find
- instructions on how to use other batteries in the EasyMini
- and TeleMini sections below.
- </para>
- </section>
- </section>
- <section>
- <title>Specifications</title>
- <para>
- Here's the full set of Altus Metrum products, both in
- production and retired.
- </para>
- <table frame='all'>
- <title>Altus Metrum Electronics</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='8' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Device'/>
- <colspec align='center' colwidth='*' colname='Barometer'/>
- <colspec align='center' colwidth='*' colname='Z-axis accelerometer'/>
- <colspec align='center' colwidth='*' colname='GPS'/>
- <colspec align='center' colwidth='*' colname='3D sensors'/>
- <colspec align='center' colwidth='*' colname='Storage'/>
- <colspec align='center' colwidth='*' colname='RF'/>
- <colspec align='center' colwidth='*' colname='Battery'/>
- <thead>
- <row>
- <entry align='center'>Device</entry>
- <entry align='center'>Barometer</entry>
- <entry align='center'>Z-axis accelerometer</entry>
- <entry align='center'>GPS</entry>
- <entry align='center'>3D sensors</entry>
- <entry align='center'>Storage</entry>
- <entry align='center'>RF Output</entry>
- <entry align='center'>Battery</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>TeleMetrum v1.0</entry>
- <entry><para>MP3H6115 10km (33k')</para></entry>
- <entry><para>MMA2202 50g</para></entry>
- <entry>SkyTraq</entry>
- <entry>-</entry>
- <entry>1MB</entry>
- <entry>10mW</entry>
- <entry>3.7V</entry>
- </row>
- <row>
- <entry>TeleMetrum v1.1</entry>
- <entry><para>MP3H6115 10km (33k')</para></entry>
- <entry><para>MMA2202 50g</para></entry>
- <entry>SkyTraq</entry>
- <entry>-</entry>
- <entry>2MB</entry>
- <entry>10mW</entry>
- <entry>3.7V</entry>
- </row>
- <row>
- <entry>TeleMetrum v1.2</entry>
- <entry><para>MP3H6115 10km (33k')</para></entry>
- <entry><para>ADXL78 70g</para></entry>
- <entry>SkyTraq</entry>
- <entry>-</entry>
- <entry>2MB</entry>
- <entry>10mW</entry>
- <entry>3.7V</entry>
- </row>
- <row>
- <entry>TeleMetrum v2.0</entry>
- <entry><para>MS5607 30km (100k')</para></entry>
- <entry><para>MMA6555 102g</para></entry>
- <entry>uBlox Max-7Q</entry>
- <entry>-</entry>
- <entry>8MB</entry>
- <entry>40mW</entry>
- <entry>3.7V</entry>
- </row>
- <row>
- <entry><para>TeleMini <?linebreak?>v1.0</para></entry>
- <entry><para>MP3H6115 10km (33k')</para></entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>5kB</entry>
- <entry>10mW</entry>
- <entry>3.7V</entry>
- </row>
- <row>
- <entry>TeleMini <?linebreak?>v2.0</entry>
- <entry><para>MS5607 30km (100k')</para></entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>1MB</entry>
- <entry>10mW</entry>
- <entry>3.7-12V</entry>
- </row>
- <row>
- <entry>EasyMini <?linebreak?>v1.0</entry>
- <entry><para>MS5607 30km (100k')</para></entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>1MB</entry>
- <entry>-</entry>
- <entry>3.7-12V</entry>
- </row>
- <row>
- <entry>TeleMega <?linebreak?>v1.0</entry>
- <entry><para>MS5607 30km (100k')</para></entry>
- <entry><para>MMA6555 102g</para></entry>
- <entry>uBlox Max-7Q</entry>
- <entry><para>MPU6000 HMC5883</para></entry>
- <entry>8MB</entry>
- <entry>40mW</entry>
- <entry>3.7V</entry>
- </row>
- <row>
- <entry>EasyMega <?linebreak?>v1.0</entry>
- <entry><para>MS5607 30km (100k')</para></entry>
- <entry><para>MMA6555 102g</para></entry>
- <entry>-</entry>
- <entry><para>MPU6000 HMC5883</para></entry>
- <entry>8MB</entry>
- <entry>-</entry>
- <entry>3.7V</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <table frame='all'>
- <title>Altus Metrum Boards</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='6' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Device'/>
- <colspec align='center' colwidth='*' colname='Connectors'/>
- <colspec align='center' colwidth='*' colname='Screw Terminals'/>
- <colspec align='center' colwidth='*' colname='Width'/>
- <colspec align='center' colwidth='*' colname='Length'/>
- <colspec align='center' colwidth='*' colname='Tube Size'/>
- <thead>
- <row>
- <entry align='center'>Device</entry>
- <entry align='center'>Connectors</entry>
- <entry align='center'>Screw Terminals</entry>
- <entry align='center'>Width</entry>
- <entry align='center'>Length</entry>
- <entry align='center'>Tube Size</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>TeleMetrum</entry>
- <entry><para>
- Antenna<?linebreak?>
- Debug<?linebreak?>
- Companion<?linebreak?>
- USB<?linebreak?>
- Battery
- </para></entry>
- <entry><para>Apogee pyro <?linebreak?>Main pyro <?linebreak?>Switch</para></entry>
- <entry>1 inch (2.54cm)</entry>
- <entry>2 ¾ inch (6.99cm)</entry>
- <entry>29mm coupler</entry>
- </row>
- <row>
- <entry><para>TeleMini <?linebreak?>v1.0</para></entry>
- <entry><para>
- Antenna<?linebreak?>
- Debug<?linebreak?>
- Battery
- </para></entry>
- <entry><para>
- Apogee pyro <?linebreak?>
- Main pyro
- </para></entry>
- <entry>½ inch (1.27cm)</entry>
- <entry>1½ inch (3.81cm)</entry>
- <entry>18mm coupler</entry>
- </row>
- <row>
- <entry>TeleMini <?linebreak?>v2.0</entry>
- <entry><para>
- Antenna<?linebreak?>
- Debug<?linebreak?>
- USB<?linebreak?>
- Battery
- </para></entry>
- <entry><para>
- Apogee pyro <?linebreak?>
- Main pyro <?linebreak?>
- Battery <?linebreak?>
- Switch
- </para></entry>
- <entry>0.8 inch (2.03cm)</entry>
- <entry>1½ inch (3.81cm)</entry>
- <entry>24mm coupler</entry>
- </row>
- <row>
- <entry>EasyMini</entry>
- <entry><para>
- Debug<?linebreak?>
- USB<?linebreak?>
- Battery
- </para></entry>
- <entry><para>
- Apogee pyro <?linebreak?>
- Main pyro <?linebreak?>
- Battery <?linebreak?>
- Switch
- </para></entry>
- <entry>0.8 inch (2.03cm)</entry>
- <entry>1½ inch (3.81cm)</entry>
- <entry>24mm coupler</entry>
- </row>
- <row>
- <entry>TeleMega</entry>
- <entry><para>
- Antenna<?linebreak?>
- Debug<?linebreak?>
- Companion<?linebreak?>
- USB<?linebreak?>
- Battery
- </para></entry>
- <entry><para>
- Apogee pyro <?linebreak?>
- Main pyro<?linebreak?>
- Pyro A-D<?linebreak?>
- Switch<?linebreak?>
- Pyro battery
- </para></entry>
- <entry>1¼ inch (3.18cm)</entry>
- <entry>3¼ inch (8.26cm)</entry>
- <entry>38mm coupler</entry>
- </row>
- <row>
- <entry>EasyMega</entry>
- <entry><para>
- Debug<?linebreak?>
- Companion<?linebreak?>
- USB<?linebreak?>
- Battery
- </para></entry>
- <entry><para>
- Apogee pyro <?linebreak?>
- Main pyro<?linebreak?>
- Pyro A-D<?linebreak?>
- Switch<?linebreak?>
- Pyro battery
- </para></entry>
- <entry>1¼ inch (3.18cm)</entry>
- <entry>2¼ inch (5.62cm)</entry>
- <entry>38mm coupler</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>TeleMetrum</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telemetrum-v1.1-thside.jpg" width="5.5in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- TeleMetrum is a 1 inch by 2¾ 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 ¼
- 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>
- <section>
- <title>TeleMetrum Screw Terminals</title>
- <para>
- TeleMetrum has six screw terminals on the end of the board
- opposite the telemetry antenna. Two are for the power
- switch, and two each for the apogee and main igniter
- circuits. Using the picture above and starting from the top,
- the terminals are as follows:
- </para>
- <table frame='all'>
- <title>TeleMetrum Screw Terminals</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='3' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Pin #'/>
- <colspec align='center' colwidth='2*' colname='Pin Name'/>
- <colspec align='left' colwidth='5*' colname='Description'/>
- <thead>
- <row>
- <entry align='center'>Terminal #</entry>
- <entry align='center'>Terminal Name</entry>
- <entry align='center'>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>1</entry>
- <entry>Switch Output</entry>
- <entry>Switch connection to flight computer</entry>
- </row>
- <row>
- <entry>2</entry>
- <entry>Switch Input</entry>
- <entry>Switch connection to positive battery terminal</entry>
- </row>
- <row>
- <entry>3</entry>
- <entry>Main +</entry>
- <entry>Main pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>4</entry>
- <entry>Main -</entry>
- <entry>Main pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>5</entry>
- <entry>Apogee +</entry>
- <entry>Apogee pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>6</entry>
- <entry>Apogee -</entry>
- <entry>Apogee pyro channel connection to pyro circuit</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>Using a Separate Pyro Battery with TeleMetrum</title>
- <para>
- As described above, using an external pyro battery involves
- connecting the negative battery terminal to the flight
- computer ground, connecting the positive battery terminal to
- one of the igniter leads and connecting the other igniter
- lead to the per-channel pyro circuit connection.
- </para>
- <para>
- To connect the negative battery terminal to the TeleMetrum
- ground, insert a small piece of wire, 24 to 28 gauge
- stranded, into the GND hole just above the screw terminal
- strip and solder it in place.
- </para>
- <para>
- Connecting the positive battery terminal to the pyro
- charges must be done separate from TeleMetrum, by soldering
- them together or using some other connector.
- </para>
- <para>
- The other lead from each pyro charge is then inserted into
- the appropriate per-pyro channel screw terminal (terminal 4 for the
- Main charge, terminal 6 for the Apogee charge).
- </para>
- </section>
- <section>
- <title>Using an Active Switch with TeleMetrum</title>
- <para>
- As explained above, an external active switch requires three
- connections, one to the positive battery terminal, one to
- the flight computer positive input and one to ground.
- </para>
- <para>
- The positive battery terminal is available on screw terminal
- 2, the positive flight computer input is on terminal 1. To
- hook a lead to ground, solder a piece of wire, 24 to 28
- gauge stranded, to the GND hole just above terminal 1.
- </para>
- </section>
- </section>
- <section>
- <title>TeleMini v1.0</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telemini-v1-top.jpg" width="5.5in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- TeleMini v1.0 is ½ inches by 1½ inches. 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 ¼ wave UHF wire antenna attached to
- the center of one end of the board is about 7 inches long. Two
- wires for the power switch are connected to holes in the
- middle of the board. Screw terminals for 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>
- <section>
- <title>TeleMini v1.0 Screw Terminals</title>
- <para>
- TeleMini v1.0 has four screw terminals on the end of the
- board opposite the telemetry antenna. Two are for the apogee
- and two are for main igniter circuits. There are also wires
- soldered to the board for the power switch. Using the
- picture above and starting from the top for the terminals
- and from the left for the power switch wires, the
- connections are as follows:
- </para>
- <table frame='all'>
- <title>TeleMini v1.0 Connections</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='3' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Pin #'/>
- <colspec align='center' colwidth='2*' colname='Pin Name'/>
- <colspec align='left' colwidth='5*' colname='Description'/>
- <thead>
- <row>
- <entry align='center'>Terminal #</entry>
- <entry align='center'>Terminal Name</entry>
- <entry align='center'>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>1</entry>
- <entry>Apogee -</entry>
- <entry>Apogee pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>2</entry>
- <entry>Apogee +</entry>
- <entry>Apogee pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>3</entry>
- <entry>Main -</entry>
- <entry>Main pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>4</entry>
- <entry>Main +</entry>
- <entry>Main pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Left</entry>
- <entry>Switch Output</entry>
- <entry>Switch connection to flight computer</entry>
- </row>
- <row>
- <entry>Right</entry>
- <entry>Switch Input</entry>
- <entry>Switch connection to positive battery terminal</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>Using a Separate Pyro Battery with TeleMini v1.0</title>
- <para>
- As described above, using an external pyro battery involves
- connecting the negative battery terminal to the flight
- computer ground, connecting the positive battery terminal to
- one of the igniter leads and connecting the other igniter
- lead to the per-channel pyro circuit connection. Because
- there is no solid ground connection to use on TeleMini, this
- is not recommended.
- </para>
- <para>
- The only available ground connection on TeleMini v1.0 are
- the two mounting holes next to the telemetry
- antenna. Somehow connect a small piece of wire to one of
- those holes and hook it to the negative pyro battery terminal.
- </para>
- <para>
- Connecting the positive battery terminal to the pyro
- charges must be done separate from TeleMini v1.0, by soldering
- them together or using some other connector.
- </para>
- <para>
- The other lead from each pyro charge is then inserted into
- the appropriate per-pyro channel screw terminal (terminal 3 for the
- Main charge, terminal 1 for the Apogee charge).
- </para>
- </section>
- <section>
- <title>Using an Active Switch with TeleMini v1.0</title>
- <para>
- As explained above, an external active switch requires three
- connections, one to the positive battery terminal, one to
- the flight computer positive input and one to ground. Again,
- because TeleMini doesn't have any good ground connection,
- this is not recommended.
- </para>
- <para>
- The positive battery terminal is available on the Right
- power switch wire, the positive flight computer input is on
- the left power switch wire. Hook a lead to either of the
- mounting holes for a ground connection.
- </para>
- </section>
- </section>
- <section>
- <title>TeleMini v2.0</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telemini-v2-top.jpg" width="5.5in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- TeleMini v2.0 is 0.8 inches by 1½ inches. It adds more
- on-board data logging memory, a built-in USB connector and
- screw terminals for the battery and power switch. The larger
- board fits in a 24mm coupler. There's also a battery connector
- for a LiPo battery if you want to use one of those.
- </para>
- <section>
- <title>TeleMini v2.0 Screw Terminals</title>
- <para>
- TeleMini v2.0 has two sets of four screw terminals on the end of the
- board opposite the telemetry antenna. Using the picture
- above, the top four have connections for the main pyro
- circuit and an external battery and the bottom four have
- connections for the apogee pyro circuit and the power
- switch. Counting from the left, the connections are as follows:
- </para>
- <table frame='all'>
- <title>TeleMini v2.0 Connections</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='3' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Pin #'/>
- <colspec align='center' colwidth='2*' colname='Pin Name'/>
- <colspec align='left' colwidth='5*' colname='Description'/>
- <thead>
- <row>
- <entry align='center'>Terminal #</entry>
- <entry align='center'>Terminal Name</entry>
- <entry align='center'>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Top 1</entry>
- <entry>Main -</entry>
- <entry>Main pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Top 2</entry>
- <entry>Main +</entry>
- <entry>Main pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Top 3</entry>
- <entry>Battery +</entry>
- <entry>Positive external battery terminal</entry>
- </row>
- <row>
- <entry>Top 4</entry>
- <entry>Battery -</entry>
- <entry>Negative external battery terminal</entry>
- </row>
- <row>
- <entry>Bottom 1</entry>
- <entry>Apogee -</entry>
- <entry>Apogee pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Bottom 2</entry>
- <entry>Apogee +</entry>
- <entry>Apogee pyro channel common connection to
- battery +</entry>
- </row>
- <row>
- <entry>Bottom 3</entry>
- <entry>Switch Output</entry>
- <entry>Switch connection to flight computer</entry>
- </row>
- <row>
- <entry>Bottom 4</entry>
- <entry>Switch Input</entry>
- <entry>Switch connection to positive battery terminal</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>Using a Separate Pyro Battery with TeleMini v2.0</title>
- <para>
- As described above, using an external pyro battery involves
- connecting the negative battery terminal to the flight
- computer ground, connecting the positive battery terminal to
- one of the igniter leads and connecting the other igniter
- lead to the per-channel pyro circuit connection.
- </para>
- <para>
- To connect the negative pyro battery terminal to TeleMini
- ground, connect it to the negative external battery
- connection, top terminal 4.
- </para>
- <para>
- Connecting the positive battery terminal to the pyro
- charges must be done separate from TeleMini v2.0, by soldering
- them together or using some other connector.
- </para>
- <para>
- The other lead from each pyro charge is then inserted into
- the appropriate per-pyro channel screw terminal (top
- terminal 1 for the Main charge, bottom terminal 1 for the
- Apogee charge).
- </para>
- </section>
- <section>
- <title>Using an Active Switch with TeleMini v2.0</title>
- <para>
- As explained above, an external active switch requires three
- connections, one to the positive battery terminal, one to
- the flight computer positive input and one to ground. Use
- the negative external battery connection, top terminal 4 for
- ground.
- </para>
- <para>
- The positive battery terminal is available on bottom
- terminal 4, the positive flight computer input is on the
- bottom terminal 3.
- </para>
- </section>
- </section>
- <section>
- <title>EasyMini</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="easymini-top.jpg" width="5.5in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- EasyMini is built on a 0.8 inch by 1½ inch circuit board. It's
- designed to fit in a 24mm coupler tube. The connectors and
- screw terminals match TeleMini v2.0, so you can easily swap between
- EasyMini and TeleMini.
- </para>
- <section>
- <title>EasyMini Screw Terminals</title>
- <para>
- EasyMini has two sets of four screw terminals on the end of the
- board opposite the telemetry antenna. Using the picture
- above, the top four have connections for the main pyro
- circuit and an external battery and the bottom four have
- connections for the apogee pyro circuit and the power
- switch. Counting from the left, the connections are as follows:
- </para>
- <table frame='all'>
- <title>EasyMini Connections</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='3' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Pin #'/>
- <colspec align='center' colwidth='2*' colname='Pin Name'/>
- <colspec align='left' colwidth='5*' colname='Description'/>
- <thead>
- <row>
- <entry align='center'>Terminal #</entry>
- <entry align='center'>Terminal Name</entry>
- <entry align='center'>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Top 1</entry>
- <entry>Main -</entry>
- <entry>Main pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Top 2</entry>
- <entry>Main +</entry>
- <entry>Main pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Top 3</entry>
- <entry>Battery +</entry>
- <entry>Positive external battery terminal</entry>
- </row>
- <row>
- <entry>Top 4</entry>
- <entry>Battery -</entry>
- <entry>Negative external battery terminal</entry>
- </row>
- <row>
- <entry>Bottom 1</entry>
- <entry>Apogee -</entry>
- <entry>Apogee pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Bottom 2</entry>
- <entry>Apogee +</entry>
- <entry>Apogee pyro channel common connection to
- battery +</entry>
- </row>
- <row>
- <entry>Bottom 3</entry>
- <entry>Switch Output</entry>
- <entry>Switch connection to flight computer</entry>
- </row>
- <row>
- <entry>Bottom 4</entry>
- <entry>Switch Input</entry>
- <entry>Switch connection to positive battery terminal</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>Using a Separate Pyro Battery with EasyMini</title>
- <para>
- As described above, using an external pyro battery involves
- connecting the negative battery terminal to the flight
- computer ground, connecting the positive battery terminal to
- one of the igniter leads and connecting the other igniter
- lead to the per-channel pyro circuit connection.
- </para>
- <para>
- To connect the negative pyro battery terminal to TeleMini
- ground, connect it to the negative external battery
- connection, top terminal 4.
- </para>
- <para>
- Connecting the positive battery terminal to the pyro
- charges must be done separate from EasyMini, by soldering
- them together or using some other connector.
- </para>
- <para>
- The other lead from each pyro charge is then inserted into
- the appropriate per-pyro channel screw terminal (top
- terminal 1 for the Main charge, bottom terminal 1 for the
- Apogee charge).
- </para>
- </section>
- <section>
- <title>Using an Active Switch with EasyMini</title>
- <para>
- As explained above, an external active switch requires three
- connections, one to the positive battery terminal, one to
- the flight computer positive input and one to ground. Use
- the negative external battery connection, top terminal 4 for
- ground.
- </para>
- <para>
- The positive battery terminal is available on bottom
- terminal 4, the positive flight computer input is on the
- bottom terminal 3.
- </para>
- </section>
- </section>
- <section>
- <title>TeleMega</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telemega-v1.0-top.jpg" width="5.5in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- TeleMega is a 1¼ inch by 3¼ inch circuit board. It was
- designed to easily fit in a 38mm coupler. Like TeleMetrum,
- TeleMega has an accelerometer and so it must be mounted so that
- the board is aligned with the flight axis. It can be mounted
- either antenna up or down.
- </para>
- <section>
- <title>TeleMega Screw Terminals</title>
- <para>
- TeleMega has two sets of nine screw terminals on the end of
- the board opposite the telemetry antenna. They are as follows:
- </para>
- <table frame='all'>
- <title>TeleMega Screw Terminals</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='3' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Pin #'/>
- <colspec align='center' colwidth='2*' colname='Pin Name'/>
- <colspec align='left' colwidth='5*' colname='Description'/>
- <thead>
- <row>
- <entry align='center'>Terminal #</entry>
- <entry align='center'>Terminal Name</entry>
- <entry align='center'>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Top 1</entry>
- <entry>Switch Input</entry>
- <entry>Switch connection to positive battery terminal</entry>
- </row>
- <row>
- <entry>Top 2</entry>
- <entry>Switch Output</entry>
- <entry>Switch connection to flight computer</entry>
- </row>
- <row>
- <entry>Top 3</entry>
- <entry>GND</entry>
- <entry>Ground connection for use with external active switch</entry>
- </row>
- <row>
- <entry>Top 4</entry>
- <entry>Main -</entry>
- <entry>Main pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Top 5</entry>
- <entry>Main +</entry>
- <entry>Main pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Top 6</entry>
- <entry>Apogee -</entry>
- <entry>Apogee pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Top 7</entry>
- <entry>Apogee +</entry>
- <entry>Apogee pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Top 8</entry>
- <entry>D -</entry>
- <entry>D pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Top 9</entry>
- <entry>D +</entry>
- <entry>D pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Bottom 1</entry>
- <entry>GND</entry>
- <entry>Ground connection for negative pyro battery terminal</entry>
- </row>
- <row>
- <entry>Bottom 2</entry>
- <entry>Pyro</entry>
- <entry>Positive pyro battery terminal</entry>
- </row>
- <row>
- <entry>Bottom 3</entry>
- <entry>Lipo</entry>
- <entry>
- Power switch output. Use to connect main battery to
- pyro battery input
- </entry>
- </row>
- <row>
- <entry>Bottom 4</entry>
- <entry>A -</entry>
- <entry>A pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Bottom 5</entry>
- <entry>A +</entry>
- <entry>A pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Bottom 6</entry>
- <entry>B -</entry>
- <entry>B pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Bottom 7</entry>
- <entry>B +</entry>
- <entry>B pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Bottom 8</entry>
- <entry>C -</entry>
- <entry>C pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Bottom 9</entry>
- <entry>C +</entry>
- <entry>C pyro channel common connection to battery +</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>Using a Separate Pyro Battery with TeleMega</title>
- <para>
- TeleMega provides explicit support for an external pyro
- battery. All that is required is to remove the jumper
- between the lipo terminal (Bottom 3) and the pyro terminal
- (Bottom 2). Then hook the negative pyro battery terminal to ground
- (Bottom 1) and the positive pyro battery to the pyro battery
- input (Bottom 2). You can then use the existing pyro screw
- terminals to hook up all of the pyro charges.
- </para>
- </section>
- <section>
- <title>Using Only One Battery With TeleMega</title>
- <para>
- Because TeleMega has built-in support for a separate pyro
- battery, if you want to fly with just one battery running
- both the computer and firing the charges, you need to
- connect the flight computer battery to the pyro
- circuit. TeleMega has two screw terminals for this—hook a
- wire from the Lipo terminal (Bottom 3) to the Pyro terminal
- (Bottom 2).
- </para>
- </section>
- <section>
- <title>Using an Active Switch with TeleMega</title>
- <para>
- As explained above, an external active switch requires three
- connections, one to the positive battery terminal, one to
- the flight computer positive input and one to ground.
- </para>
- <para>
- The positive battery terminal is available on Top terminal
- 1, the positive flight computer input is on Top terminal
- 2. Ground is on Top terminal 3.
- </para>
- </section>
- </section>
- <section>
- <title>EasyMega</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="easymega-v1.0-top.jpg" width="4.5in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- EasyMega is a 1¼ inch by 2¼ inch circuit board. It was
- designed to easily fit in a 38mm coupler. Like TeleMetrum,
- EasyMega has an accelerometer and so it must be mounted so that
- the board is aligned with the flight axis. It can be mounted
- either antenna up or down.
- </para>
- <section>
- <title>EasyMega Screw Terminals</title>
- <para>
- EasyMega has two sets of nine screw terminals on the end of
- the board opposite the telemetry antenna. They are as follows:
- </para>
- <table frame='all'>
- <title>EasyMega Screw Terminals</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='3' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Pin #'/>
- <colspec align='center' colwidth='2*' colname='Pin Name'/>
- <colspec align='left' colwidth='5*' colname='Description'/>
- <thead>
- <row>
- <entry align='center'>Terminal #</entry>
- <entry align='center'>Terminal Name</entry>
- <entry align='center'>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Top 1</entry>
- <entry>Switch Input</entry>
- <entry>Switch connection to positive battery terminal</entry>
- </row>
- <row>
- <entry>Top 2</entry>
- <entry>Switch Output</entry>
- <entry>Switch connection to flight computer</entry>
- </row>
- <row>
- <entry>Top 3</entry>
- <entry>GND</entry>
- <entry>Ground connection for use with external active switch</entry>
- </row>
- <row>
- <entry>Top 4</entry>
- <entry>Main -</entry>
- <entry>Main pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Top 5</entry>
- <entry>Main +</entry>
- <entry>Main pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Top 6</entry>
- <entry>Apogee -</entry>
- <entry>Apogee pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Top 7</entry>
- <entry>Apogee +</entry>
- <entry>Apogee pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Top 8</entry>
- <entry>D -</entry>
- <entry>D pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Top 9</entry>
- <entry>D +</entry>
- <entry>D pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Bottom 1</entry>
- <entry>GND</entry>
- <entry>Ground connection for negative pyro battery terminal</entry>
- </row>
- <row>
- <entry>Bottom 2</entry>
- <entry>Pyro</entry>
- <entry>Positive pyro battery terminal</entry>
- </row>
- <row>
- <entry>Bottom 3</entry>
- <entry>Lipo</entry>
- <entry>
- Power switch output. Use to connect main battery to
- pyro battery input
- </entry>
- </row>
- <row>
- <entry>Bottom 4</entry>
- <entry>A -</entry>
- <entry>A pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Bottom 5</entry>
- <entry>A +</entry>
- <entry>A pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Bottom 6</entry>
- <entry>B -</entry>
- <entry>B pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Bottom 7</entry>
- <entry>B +</entry>
- <entry>B pyro channel common connection to battery +</entry>
- </row>
- <row>
- <entry>Bottom 8</entry>
- <entry>C -</entry>
- <entry>C pyro channel connection to pyro circuit</entry>
- </row>
- <row>
- <entry>Bottom 9</entry>
- <entry>C +</entry>
- <entry>C pyro channel common connection to battery +</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>Using a Separate Pyro Battery with EasyMega</title>
- <para>
- EasyMega provides explicit support for an external pyro
- battery. All that is required is to remove the jumper
- between the lipo terminal (Bottom 3) and the pyro terminal
- (Bottom 2). Then hook the negative pyro battery terminal to ground
- (Bottom 1) and the positive pyro battery to the pyro battery
- input (Bottom 2). You can then use the existing pyro screw
- terminals to hook up all of the pyro charges.
- </para>
- </section>
- <section>
- <title>Using Only One Battery With EasyMega</title>
- <para>
- Because EasyMega has built-in support for a separate pyro
- battery, if you want to fly with just one battery running
- both the computer and firing the charges, you need to
- connect the flight computer battery to the pyro
- circuit. EasyMega has two screw terminals for this—hook a
- wire from the Lipo terminal (Bottom 3) to the Pyro terminal
- (Bottom 2).
- </para>
- </section>
- <section>
- <title>Using an Active Switch with EasyMega</title>
- <para>
- As explained above, an external active switch requires three
- connections, one to the positive battery terminal, one to
- the flight computer positive input and one to ground.
- </para>
- <para>
- The positive battery terminal is available on Top terminal
- 1, the positive flight computer input is on Top terminal
- 2. Ground is on Top terminal 3.
- </para>
- </section>
- </section>
- <section>
- <title>Flight Data Recording</title>
- <para>
- Each flight computer logs data at 100 samples per second
- during ascent and 10 samples per second during descent, except
- for TeleMini v1.0, which records ascent at 10 samples per
- second and descent at 1 sample per second. Data are logged to
- an on-board flash memory part, which can be partitioned into
- several equal-sized blocks, one for each flight.
- </para>
- <table frame='all'>
- <title>Data Storage on Altus Metrum altimeters</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='4' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Device'/>
- <colspec align='center' colwidth='*' colname='Bytes per sample'/>
- <colspec align='center' colwidth='*' colname='Total storage'/>
- <colspec align='center' colwidth='*' colname='Minutes of
- full-rate'/>
- <thead>
- <row>
- <entry align='center'>Device</entry>
- <entry align='center'>Bytes per Sample</entry>
- <entry align='center'>Total Storage</entry>
- <entry align='center'>Minutes at Full Rate</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>TeleMetrum v1.0</entry>
- <entry>8</entry>
- <entry>1MB</entry>
- <entry>20</entry>
- </row>
- <row>
- <entry>TeleMetrum v1.1 v1.2</entry>
- <entry>8</entry>
- <entry>2MB</entry>
- <entry>40</entry>
- </row>
- <row>
- <entry>TeleMetrum v2.0</entry>
- <entry>16</entry>
- <entry>8MB</entry>
- <entry>80</entry>
- </row>
- <row>
- <entry>TeleMini v1.0</entry>
- <entry>2</entry>
- <entry>5kB</entry>
- <entry>4</entry>
- </row>
- <row>
- <entry>TeleMini v2.0</entry>
- <entry>16</entry>
- <entry>1MB</entry>
- <entry>10</entry>
- </row>
- <row>
- <entry>EasyMini</entry>
- <entry>16</entry>
- <entry>1MB</entry>
- <entry>10</entry>
- </row>
- <row>
- <entry>TeleMega</entry>
- <entry>32</entry>
- <entry>8MB</entry>
- <entry>40</entry>
- </row>
- <row>
- <entry>EasyMega</entry>
- <entry>32</entry>
- <entry>8MB</entry>
- <entry>40</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <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 you can store more flights.
- </para>
- <para>
- Configuration data is also stored in the flash memory on
- TeleMetrum v1.x, TeleMini and EasyMini. This consumes 64kB
- of flash space. This configuration space is not available
- for storing flight log data. TeleMetrum v2.0, TeleMega and EasyMega
- store configuration data in a bit of eeprom available within
- the processor chip, leaving that space available in flash for
- more flight data.
- </para>
- <para>
- To compute the amount of space needed for a single flight, you
- can multiply the expected ascent time (in seconds) by 100
- times bytes-per-sample, multiply the expected descent time (in
- seconds) by 10 times the bytes per sample and add the two
- together. That will slightly under-estimate the storage (in
- bytes) needed for the flight. For instance, a TeleMetrum v2.0 flight spending
- 20 seconds in ascent and 150 seconds in descent will take
- about (20 * 1600) + (150 * 160) = 56000 bytes of storage. You
- could store dozens of these flights in the on-board flash.
- </para>
- <para>
- The default size allows for several flights on each flight
- computer, except for TeleMini v1.0, which only holds data for a
- single flight. You can adjust the size.
- </para>
- <para>
- Altus Metrum flight computers will not overwrite existing
- flight data, so be sure to download flight data and erase it
- from the flight computer before it fills up. The flight
- computer will still successfully control the flight even if it
- cannot log data, so the only thing you will lose is the data.
- </para>
- </section>
- <section>
- <title>Installation</title>
- <para>
- A typical installation involves attaching
- only a suitable 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. TeleMini v2.0 and EasyMini may also be used with other
- batteries as long as they supply between 4 and 12 volts.
- </para>
- <para>
- The battery connectors are a standard 2-pin JST connector and
- match batteries sold by Spark Fun. These batteries are
- single-cell Lithium Polymer batteries that nominally provide 3.7
- volts. Other vendors sell similar batteries for RC aircraft
- using mating connectors, however the polarity for those is
- generally reversed from the batteries used by Altus Metrum
- products. In particular, the Tenergy batteries supplied for use
- in Featherweight flight computers are not compatible with Altus
- Metrum flight computers or battery chargers. <emphasis>Check
- polarity and voltage before connecting any battery not purchased
- from Altus Metrum or Spark Fun.</emphasis>
- </para>
- <para>
- By default, we use the unregulated output of the 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>
- Except for TeleMini v1.0, the flight computers also use the
- screw terminal block for the power switch leads. On TeleMini v1.0,
- 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
- replace the stock UHF antenna wire with an edge-launched SMA connector,
- and, on TeleMetrum v1, you can unplug the integrated GPS
- antenna and select an appropriate off-board GPS antenna with
- cable terminating in a U.FL connector.
- </para>
- </section>
- </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, TeleMega and EasyMega, which have accelerometers, 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
- the flight computer 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 v2.0 and EasyMini don't have an
- accelerometer we can use to determine orientation, “idle” mode
- is selected if the board is connected via USB to a computer,
- otherwise the board enters “flight” mode. TeleMini v1.0
- selects “idle” mode if it receives a command packet within the
- first five seconds of operation.
- </para>
- <para>
- At power on, the altimeter will beep out the battery voltage
- to the nearest tenth of a volt. Each digit is represented by
- a sequence of short “dit” beeps, with a pause between
- digits. A zero digit is represented with one long “dah”
- beep. Then there will be a short pause while the altimeter
- completes initialization and self test, and decides which mode
- to enter next.
- </para>
- <para>
- Here's a short summary of all of the modes and the beeping (or
- flashing, in the case of TeleMini v1) that accompanies each
- mode. In the description of the beeping pattern, “dit” means a
- short beep while "dah" means a long beep (three times as
- long). “Brap” means a long dissonant tone.
- <table frame='all'>
- <title>AltOS Modes</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='4' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Mode Name'/>
- <colspec align='center' colwidth='*' colname='Letter'/>
- <colspec align='center' colwidth='*' colname='Beeps'/>
- <colspec align='center' colwidth='*' colname='Description'/>
- <thead>
- <row>
- <entry>Mode Name</entry>
- <entry>Abbreviation</entry>
- <entry>Beeps</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Startup</entry>
- <entry>S</entry>
- <entry>battery voltage in decivolts</entry>
- <entry>
- <para>
- Calibrating sensors, detecting orientation.
- </para>
- </entry>
- </row>
- <row>
- <entry>Idle</entry>
- <entry>I</entry>
- <entry>dit dit</entry>
- <entry>
- <para>
- Ready to accept commands over USB or radio link.
- </para>
- </entry>
- </row>
- <row>
- <entry>Pad</entry>
- <entry>P</entry>
- <entry>dit dah dah dit</entry>
- <entry>
- <para>
- Waiting for launch. Not listening for commands.
- </para>
- </entry>
- </row>
- <row>
- <entry>Boost</entry>
- <entry>B</entry>
- <entry>dah dit dit dit</entry>
- <entry>
- <para>
- Accelerating upwards.
- </para>
- </entry>
- </row>
- <row>
- <entry>Fast</entry>
- <entry>F</entry>
- <entry>dit dit dah dit</entry>
- <entry>
- <para>
- Decelerating, but moving faster than 200m/s.
- </para>
- </entry>
- </row>
- <row>
- <entry>Coast</entry>
- <entry>C</entry>
- <entry>dah dit dah dit</entry>
- <entry>
- <para>
- Decelerating, moving slower than 200m/s
- </para>
- </entry>
- </row>
- <row>
- <entry>Drogue</entry>
- <entry>D</entry>
- <entry>dah dit dit</entry>
- <entry>
- <para>
- Descending after apogee. Above main height.
- </para>
- </entry>
- </row>
- <row>
- <entry>Main</entry>
- <entry>M</entry>
- <entry>dah dah</entry>
- <entry>
- <para>
- Descending. Below main height.
- </para>
- </entry>
- </row>
- <row>
- <entry>Landed</entry>
- <entry>L</entry>
- <entry>dit dah dit dit</entry>
- <entry>
- <para>
- Stable altitude for at least ten seconds.
- </para>
- </entry>
- </row>
- <row>
- <entry>Sensor error</entry>
- <entry>X</entry>
- <entry>dah dit dit dah</entry>
- <entry>
- <para>
- Error detected during sensor calibration.
- </para>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </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 which is made by rapidly
- alternating between two tones 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
- in idle mode over either USB or the radio link
- equivalently. TeleMini v1.0 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>
- In “Idle” and “Pad” modes, once the mode indication
- beeps/flashes and continuity indication has been sent, if
- there is no space available to log the flight in on-board
- memory, the flight computer will emit a warbling tone (much
- slower than the “no continuity tone”)
- </para>
- <para>
- Here's a summary of all of the “pad” and “idle” mode indications.
- <table frame='all'>
- <title>Pad/Idle Indications</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='3' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Name'/>
- <colspec align='center' colwidth='*' colname='Beeps'/>
- <colspec align='center' colwidth='*' colname='Description'/>
- <thead>
- <row>
- <entry>Name</entry>
- <entry>Beeps</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Neither</entry>
- <entry>brap</entry>
- <entry>
- <para>
- No continuity detected on either apogee or main
- igniters.
- </para>
- </entry>
- </row>
- <row>
- <entry>Apogee</entry>
- <entry>dit</entry>
- <entry>
- <para>
- Continuity detected only on apogee igniter.
- </para>
- </entry>
- </row>
- <row>
- <entry>Main</entry>
- <entry>dit dit</entry>
- <entry>
- <para>
- Continuity detected only on main igniter.
- </para>
- </entry>
- </row>
- <row>
- <entry>Both</entry>
- <entry>dit dit dit</entry>
- <entry>
- <para>
- Continuity detected on both igniters.
- </para>
- </entry>
- </row>
- <row>
- <entry>Storage Full</entry>
- <entry>warble</entry>
- <entry>
- <para>
- On-board data logging storage is full. This will
- not prevent the flight computer from safely
- controlling the flight or transmitting telemetry
- signals, but no record of the flight will be
- stored in on-board flash.
- </para>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </para>
- <para>
- Once landed, the flight computer will signal that by emitting
- the “Landed” sound described above, after which it will beep
- out the apogee height (in meters). Each digit is represented
- by a sequence of short “dit” beeps, with a pause between
- digits. A zero digit is represented with one long “dah”
- beep. The flight computer will continue to report landed mode
- and beep out the maximum height until turned off.
- </para>
- <para>
- One “neat trick” of particular value when TeleMetrum, TeleMega
- or EasyMega are 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>
- <para>
- TeleMini v1.0 is configured solely via the radio link. Of course, that
- means you need to know the TeleMini radio configuration values
- or you won't be able to communicate with it. For situations
- when you don't have the radio configuration values, TeleMini v1.0
- offers an 'emergency recovery' mode. In this mode, TeleMini is
- configured as follows:
- <itemizedlist>
- <listitem>
- <para>
- Sets the radio frequency to 434.550MHz
- </para>
- </listitem>
- <listitem>
- <para>
- Sets the radio calibration back to the factory value.
- </para>
- </listitem>
- <listitem>
- <para>
- Sets the callsign to N0CALL
- </para>
- </listitem>
- <listitem>
- <para>
- Does not go to 'pad' mode after five seconds.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- To get into 'emergency recovery' mode, first find the row of
- four small holes opposite the switch wiring. Using a short
- piece of small gauge wire, connect the outer two holes
- together, then power TeleMini up. Once the red LED is lit,
- disconnect the wire and the board should signal that it's in
- 'idle' mode after the initial five second startup period.
- </para>
- </section>
- <section>
- <title>GPS </title>
- <para>
- TeleMetrum and TeleMega include 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 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>
- The flight computers provide 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
- 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 a flight computer can
- either be done with the device directly connected to the
- computer via the USB cable, or through the radio
- link. TeleMini v1.0 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, main deploy heights
- and additional pyro event conditions
- to respond to changing launch conditions. You can also
- 'reboot' the altimeter. Use this to remotely enable the
- flight computer by turning TeleMetrum or TeleMega 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 assemble 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>
- The flight computers only enable radio commanding in 'idle' mode.
- TeleMetrum and TeleMega use the accelerometer to detect which orientation they
- start up in, so make sure you have the flight computer lying horizontally when you turn
- it on. Otherwise, it 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 transmitted, 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 TeleMega, 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 TeleMega, or
- selecting 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>
- Our flight computers all incorporate 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 generally 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 forward error
- correction and interleaving, this allows us to have a very
- robust 19.2 kilobit data link with only 10-40 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 with our 10mW units and over 100k feet AGL with the
- 40mW devices. 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>APRS</title>
- <para>
- TeleMetrum v2.0 and TeleMega can send APRS if desired, and the
- interval between APRS packets can be configured. As each APRS
- packet takes a full second to transmit, we recommend an
- interval of at least 5 seconds to avoid consuming too much
- battery power or radio channel bandwidth. You can configure
- the APRS interval using AltosUI; that process is described in
- the Configure Altimeter section of the AltosUI chapter.
- </para>
- <para>
- AltOS uses the APRS compressed position report data format,
- which provides for higher position precision and shorter
- packets than the original APRS format. It also includes
- altitude data, which is invaluable when tracking rockets. We
- haven't found a receiver which doesn't handle compressed
- positions, but it's just possible that you have one, so if you
- have an older device that can receive the raw packets but
- isn't displaying position information, it's possible that this
- is the cause.
- </para>
- <para>
- APRS packets include an SSID (Secondary Station Identifier)
- field that allows one operator to have multiple
- transmitters. AltOS allows you to set this to a single digit
- from 0 to 9, allowing you to fly multiple transmitters at the
- same time while keeping the identify of each one separate in
- the receiver. By default, the SSID is set to the last digit of
- the device serial number.
- </para>
- <para>
- The APRS packet format includes a comment field that can have
- arbitrary text in it. AltOS uses this to send status
- information about the flight computer. It sends four fields as
- shown in the following table.
- </para>
- <table frame='all'>
- <title>Altus Metrum APRS Comments</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='3' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Field'/>
- <colspec align='center' colwidth='*' colname='Example'/>
- <colspec align='center' colwidth='4*' colname='Description'/>
- <thead>
- <row>
- <entry align='center'>Field</entry>
- <entry align='center'>Example</entry>
- <entry align='center'>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>1</entry>
- <entry>L</entry>
- <entry>GPS Status U for unlocked, L for locked</entry>
- </row>
- <row>
- <entry>2</entry>
- <entry>6</entry>
- <entry>Number of Satellites in View</entry>
- </row>
- <row>
- <entry>3</entry>
- <entry>B4.0</entry>
- <entry>Altimeter Battery Voltage</entry>
- </row>
- <row>
- <entry>4</entry>
- <entry>A3.7</entry>
- <entry>Apogee Igniter Voltage</entry>
- </row>
- <row>
- <entry>5</entry>
- <entry>M3.7</entry>
- <entry>Main Igniter Voltage</entry>
- </row>
- <row>
- <entry>6</entry>
- <entry>1286</entry>
- <entry>Device Serial Number</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>
- Here's an example of an APRS comment showing GPS lock with 6
- satellites in view, a primary battery at 4.0V, and
- apogee and main igniters both at 3.7V from device 1286.
- <screen>
- L6 B4.0 A3.7 M3.7 1286
- </screen>
- </para>
- <para>
- Make sure your primary battery is above 3.8V, any connected
- igniters are above 3.5V and GPS is locked with at least 5 or 6
- satellites in view before flying. If GPS is switching between
- L and U regularly, then it doesn't have a good lock and you
- should wait until it becomes stable.
- </para>
- <para>
- If the GPS receiver loses lock, the APRS data transmitted will
- contain the last position for which GPS lock was
- available. You can tell that this has happened by noticing
- that the GPS status character switches from 'L' to 'U'. Before
- GPS has locked, APRS will transmit zero for latitude,
- longitude and altitude.
- </para>
- </section>
- <section>
- <title>Configurable Parameters</title>
- <para>
- Configuring an Altus Metrum altimeter for flight is very
- simple. Even on our baro-only TeleMini and EasyMini boards,
- 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. Read
- the Configure Altimeter section in the AltosUI chapter below
- for more information.
- </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>Callsign</title>
- <para>
- This sets the callsign used for telemetry, APRS and the
- packet link. For telemetry and APRS, this is used to
- identify the device. For the packet link, the callsign must
- match that configured in AltosUI or the link will not
- work. This is to prevent accidental configuration of another
- Altus Metrum flight computer operating on the same frequency nearby.
- </para>
- </section>
- <section>
- <title>Telemetry/RDF/APRS Enable</title>
- <para>
- You can completely disable the radio while in flight, if
- necessary. This doesn't disable the packet link in idle
- mode.
- </para>
- </section>
- <section>
- <title>Telemetry baud rate</title>
- <para>
- This sets the modulation bit rate for data transmission for
- both telemetry and packet link mode. Lower bit
- rates will increase range while reducing the amount of data
- that can be sent and increasing battery consumption. All
- telemetry is done using a rate 1/2 constraint 4 convolution
- code, so the actual data transmission rate is 1/2 of the
- modulation bit rate specified here.
- </para>
- </section>
- <section>
- <title>APRS Interval</title>
- <para>
- This selects how often APRS packets are transmitted. Set
- this to zero to disable APRS without also disabling the
- regular telemetry and RDF transmissions. As APRS takes a
- full second to transmit a single position report, we
- recommend sending packets no more than once every 5 seconds.
- </para>
- </section>
- <section>
- <title>APRS SSID</title>
- <para>
- This selects the SSID reported in APRS packets. By default,
- it is set to the last digit of the serial number, but you
- can change this to any value from 0 to 9.
- </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>Apogee Lockout</title>
- <para>
- Apogee lockout is the number of seconds after boost where
- the flight computer will not fire the apogee charge, even if
- the rocket appears to be at apogee. This is often called
- 'Mach Delay', as it is intended to prevent a flight computer
- from unintentionally firing apogee charges due to the pressure
- spike that occurrs across a mach transition. Altus Metrum
- flight computers include a Kalman filter which is not fooled
- by this sharp pressure increase, and so this setting should
- be left at the default value of zero to disable it.
- </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>
- Changing this value will set the maximum amount of flight
- log storage that an individual flight will use. The
- available storage is divided into as many flights of the
- specified size as can fit in the available space. You can
- download and erase individual flight logs. If you fill up
- the available storage, future flights will not get logged
- until you erase some of the stored ones.
- </para>
- <para>
- Even though our flight computers (except TeleMini v1.0) can store
- multiple flights, we strongly recommend downloading and saving
- flight data after each flight.
- </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 Bdale designed that
- had two altimeters, 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, TeleMega and EasyMega measure 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, the
- altimeter must be explicitly configured for either Antenna
- Up or Antenna Down. The default, Antenna Up, expects the end
- of the 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>
- <title>Configurable Pyro Channels</title>
- <para>
- In addition to the usual Apogee and Main pyro channels,
- TeleMega and EasyMega have four additional channels that can be configured
- to activate when various flight conditions are
- satisfied. You can select as many conditions as necessary;
- all of them must be met in order to activate the
- channel. The conditions available are:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Acceleration away from the ground. Select a value, and
- then choose whether acceleration should be above or
- below that value. Acceleration is positive upwards, so
- accelerating towards the ground would produce negative
- numbers. Acceleration during descent is noisy and
- inaccurate, so be careful when using it during these
- phases of the flight.
- </para>
- </listitem>
- <listitem>
- <para>
- Vertical speed. Select a value, and then choose whether
- vertical speed should be above or below that
- value. Speed is positive upwards, so moving towards the
- ground would produce negative numbers. Speed during
- descent is a bit noisy and so be careful when using it
- during these phases of the flight.
- </para>
- </listitem>
- <listitem>
- <para>
- Height. Select a value, and then choose whether the
- height above the launch pad should be above or below
- that value.
- </para>
- </listitem>
- <listitem>
- <para>
- Orientation. TeleMega and EasyMega contain a 3-axis gyroscope and
- accelerometer which is used to measure the current
- angle. Note that this angle is not the change in angle
- from the launch pad, but rather absolute relative to
- gravity; the 3-axis accelerometer is used to compute the
- angle of the rocket on the launch pad and initialize the
- system. Because this value is computed by integrating
- rate gyros, it gets progressively less accurate as the
- flight goes on. It should have an accumulated error of
- less than 0.2°/second (after 10 seconds of flight, the
- error should be less than 2°).
- </para>
- <para>
- The usual use of the orientation configuration is to
- ensure that the rocket is traveling mostly upwards when
- deciding whether to ignite air starts or additional
- stages. For that, choose a reasonable maximum angle
- (like 20°) and set the motor igniter to require an angle
- of less than that value.
- </para>
- </listitem>
- <listitem>
- <para>
- Flight Time. Time since boost was detected. Select a
- value and choose whether to activate the pyro channel
- before or after that amount of time.
- </para>
- </listitem>
- <listitem>
- <para>
- Ascending. A simple test saying whether the rocket is
- going up or not. This is exactly equivalent to testing
- whether the speed is > 0.
- </para>
- </listitem>
- <listitem>
- <para>
- Descending. A simple test saying whether the rocket is
- going down or not. This is exactly equivalent to testing
- whether the speed is < 0.
- </para>
- </listitem>
- <listitem>
- <para>
- After Motor. The flight software counts each time the
- rocket starts accelerating and then decelerating
- (presumably due to a motor or motors burning). Use this
- value for multi-staged or multi-airstart launches.
- </para>
- </listitem>
- <listitem>
- <para>
- Delay. This value doesn't perform any checks, instead it
- inserts a delay between the time when the other
- parameters become true and when the pyro channel is
- activated.
- </para>
- </listitem>
- <listitem>
- <para>
- Flight State. The flight software tracks the flight
- through a sequence of states:
- <orderedlist>
- <listitem>
- <para>
- Boost. The motor has lit and the rocket is
- accelerating upwards.
- </para>
- </listitem>
- <listitem>
- <para>
- Fast. The motor has burned out and the rocket is
- decelerating, but it is going faster than 200m/s.
- </para>
- </listitem>
- <listitem>
- <para>
- Coast. The rocket is still moving upwards and
- decelerating, but the speed is less than 200m/s.
- </para>
- </listitem>
- <listitem>
- <para>
- Drogue. The rocket has reached apogee and is heading
- back down, but is above the configured Main
- altitude.
- </para>
- </listitem>
- <listitem>
- <para>
- Main. The rocket is still descending, and is below
- the Main altitude
- </para>
- </listitem>
- <listitem>
- <para>
- Landed. The rocket is no longer moving.
- </para>
- </listitem>
- </orderedlist>
- </para>
- <para>
- You can select a state to limit when the pyro channel
- may activate; note that the check is based on when the
- rocket transitions <emphasis>into</emphasis> the state, and so checking for
- “greater than Boost” means that the rocket is currently
- in boost or some later state.
- </para>
- <para>
- When a motor burns out, the rocket enters either Fast or
- Coast state (depending on how fast it is moving). If the
- computer detects upwards acceleration again, it will
- move back to Boost state.
- </para>
- </listitem>
- </itemizedlist>
- </section>
- </section>
-
- </chapter>
- <chapter>
- <title>AltosUI</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="altosui.png" width="4.6in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- The AltosUI program provides a graphical user interface for
- interacting with the Altus Metrum product family. AltosUI can
- monitor telemetry data, configure devices and many other
- tasks. The primary interface window provides a selection of
- buttons, one for each major activity in the system. This chapter
- is split into sections, 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>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="device-selection.png" width="3.1in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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. At
- the default data rate, 38400 bps, in bench testing, the
- radio inside TeleDongle v0.2 operates down to about
- -106dBm, while the v3 radio works down to about -111dBm.
- Weaker signals, or an environment with radio noise may
- cause the data to not be received. The packet link uses
- error detection and correction techniques which prevent
- incorrect data from being reported.
- </para>
- </listitem>
- <listitem>
- <para>
- The age of the displayed data, in seconds since the last
- successfully received telemetry packet. In normal operation
- this will stay in the low single digits. If the number starts
- counting up, then you are no longer receiving data over the radio
- link from the flight computer.
- </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>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="launch-pad.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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:
- <variablelist>
- <varlistentry>
- <term>Battery Voltage</term>
- <listitem>
- <para>
- This indicates whether the Li-Po battery powering the
- flight computer has sufficient charge to last for
- the duration of the flight. A value of more than
- 3.8V is required for a 'GO' status.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Apogee Igniter Voltage</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- <varlistentry>
- <term>Main Igniter Voltage</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- <varlistentry>
- <term>On-board Data Logging</term>
- <listitem>
- <para>
- 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. Most of our flight computers can store multiple
- flights, depending on the configured maximum flight log
- size. TeleMini v1.0 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 even if the flight
- data storage is full.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>GPS Locked</term>
- <listitem>
- <para>
- For a TeleMetrum or TeleMega 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>
- </varlistentry>
- <varlistentry>
- <term>GPS Ready</term>
- <listitem>
- <para>
- For a TeleMetrum or TeleMega 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>
- </varlistentry>
- </variablelist>
- </para>
- <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>
- </section>
- <section>
- <title>Ascent</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="ascent.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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, acceleration and tilt 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 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>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="descent.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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>
- With GPS-equipped flight computers, 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. Ground Distance shows how far it is to a point
- directly under the rocket and can help figure out where the
- rocket is likely to land. 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>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="landed.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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>
- Our flight computers 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 may 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>Table</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="table.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- The table view shows all of the data available from the
- flight computer. Probably the most useful data on
- this tab is the detailed GPS information, which includes
- horizontal dilution of precision information, and
- information about the signal being received from the satellites.
- </para>
- </section>
- <section>
- <title>Site Map</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="site-map.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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 default 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>
- You can adjust the style of map and the zoom level with
- buttons on the right side of the map window. You can draw a
- line on the map by moving the mouse over the map with a
- button other than the left one pressed, or by pressing the
- left button while also holding down the shift key. The
- length of the line in real-world units will be shown at the
- start of the line.
- </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>
- <title>Ignitor</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="ignitor.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- TeleMega includes four additional programmable pyro
- channels. The Ignitor tab shows whether each of them has
- continuity. If an ignitor has a low resistance, then the
- voltage measured here will be close to the pyro battery
- voltage. A value greater than 3.2V is required for a 'GO'
- status.
- </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.
- </para>
- <para>
- Clicking on the 'Save Flight Data' button brings up a list of
- connected flight computers and TeleDongle devices. If you select a
- flight computer, the flight data will be downloaded from that
- device directly. If you select a TeleDongle device, flight data
- will be downloaded from a flight computer 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>
- 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>
- <para>
- Once a flight record is selected, a window with multiple tabs is
- opened.
- </para>
- <section>
- <title>Flight Graph</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="graph.png" width="6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- By default, the graph contains acceleration (blue),
- velocity (green) and altitude (red).
- </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>
- </section>
- <section>
- <title>Configure Graph</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="graph-configure.png" width="6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- This selects which graph elements to show, and, at the
- very bottom, lets you switch between metric and
- imperial units
- </para>
- </section>
- <section>
- <title>Flight Statistics</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="graph-stats.png" width="6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- Shows overall data computed from the flight.
- </para>
- </section>
- <section>
- <title>Map</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="graph-map.png" width="6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- Shows a satellite image of the flight area overlaid
- with the path of the flight. The red concentric
- circles mark the launch pad, the black concentric
- circles mark the landing location.
- </para>
- </section>
- </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, which can be either a .eeprom or .telem.
- The .eeprom files contain higher resolution and more continuous data,
- while .telem files contain receiver signal strength information.
- 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>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="configure-altimeter.png" width="3.6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- Select this button and then select either an altimeter 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>
- <variablelist>
- <varlistentry>
- <term>Save</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- <varlistentry>
- <term>Reset</term>
- <listitem>
- <para>
- This resets the dialog to the most recently saved values,
- erasing any changes you have made.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Reboot</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- <varlistentry>
- <term>Close</term>
- <listitem>
- <para>
- This closes the dialog. Any unsaved changes will be
- lost.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- <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>Apogee Lockoug</title>
- <para>
- Apogee lockout is the number of seconds after boost where
- the flight computer will not fire the apogee charge, even if
- the rocket appears to be at apogee. This is often called
- 'Mach Delay', as it is intended to prevent a flight computer
- from unintentionally firing apogee charges due to the pressure
- spike that occurrs across a mach transition. Altus Metrum
- flight computers include a Kalman filter which is not fooled
- by this sharp pressure increase, and so this setting should
- be left at the default value of zero to disable it.
- </para>
- </section>
- <section>
- <title>Frequency</title>
- <para>
- This configures which of the frequencies to use for both
- telemetry and packet command mode. Note that if you set this
- value via packet command mode, the TeleDongle frequency will
- also be automatically reconfigured to match so that
- communication will continue afterwards.
- </para>
- </section>
- <section>
- <title>RF 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>Telemetry/RDF/APRS Enable</title>
- <para>
- Enables the radio for transmission during flight. When
- disabled, the radio will not transmit anything during flight
- at all.
- </para>
- </section>
- <section>
- <title>Telemetry baud rate</title>
- <para>
- This sets the modulation bit rate for data transmission for
- both telemetry and packet link mode. Lower bit
- rates will increase range while reducing the amount of data
- that can be sent and increasing battery consumption. All
- telemetry is done using a rate 1/2 constraint 4 convolution
- code, so the actual data transmission rate is 1/2 of the
- modulation bit rate specified here.
- </para>
- </section>
- <section>
- <title>APRS Interval</title>
- <para>
- How often to transmit GPS information via APRS (in
- seconds). When set to zero, APRS transmission is
- disabled. This option is available on TeleMetrum v2 and
- TeleMega boards. TeleMetrum v1 boards cannot transmit APRS
- packets. Note that a single APRS packet takes nearly a full
- second to transmit, so enabling this option will prevent
- sending any other telemetry during that time.
- </para>
- </section>
- <section>
- <title>APRS SSID</title>
- <para>
- Which SSID to report in APRS packets. By default, this is
- set to the last digit of the serial number, but can be
- configured to any value from 0 to 9.
- </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>Ignitor Firing Mode</title>
- <para>
- This configuration parameter allows the two standard ignitor
- channels (Apogee and Main) to be used in different
- configurations.
- </para>
- <variablelist>
- <varlistentry>
- <term>Dual Deploy</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- <varlistentry>
- <term>Redundant Apogee</term>
- <listitem>
- <para>
- This fires both channels at
- apogee, the 'apogee' channel first followed after a two second
- delay by the 'main' channel.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Redundant Main</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- </variablelist>
- </section>
- <section>
- <title>Pad Orientation</title>
- <para>
- Because they include accelerometers, TeleMetrum,
- TeleMega and EasyMega are sensitive to the orientation of the board. By
- default, they expect 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>
- <variablelist>
- <varlistentry>
- <term>Antenna Up</term>
- <listitem>
- <para>
- In this mode, the antenna end of the
- flight computer must point forward, in line with the
- expected flight path.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Antenna Down</term>
- <listitem>
- <para>
- In this mode, the antenna end of the
- flight computer must point aft, in line with the
- expected flight path.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </section>
- <section>
- <title>Beeper Frequency</title>
- <para>
- The beeper on all Altus Metrum flight computers works best
- at 4000Hz, however if you have more than one flight computer
- in a single airframe, having all of them sound at the same
- frequency can be confusing. This parameter lets you adjust
- the base beeper frequency value.
- </para>
- </section>
- <section>
- <title>Configure Pyro Channels</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="configure-pyro.png" width="6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- This opens a separate window to configure the additional
- pyro channels available on TeleMega and EasyMega. One column is
- presented for each channel. Each row represents a single
- parameter, if enabled the parameter must meet the specified
- test for the pyro channel to be fired. See the Pyro Channels
- section in the System Operation chapter above for a
- description of these parameters.
- </para>
- <para>
- Select conditions and set the related value; the pyro
- channel will be activated when <emphasis>all</emphasis> of the
- conditions are met. Each pyro channel has a separate set of
- configuration values, so you can use different values for
- the same condition with different channels.
- </para>
- <para>
- At the bottom of the window, the 'Pyro Firing Time'
- configuration sets the length of time (in seconds) which
- each of these pyro channels will fire for.
- </para>
- <para>
- Once you have selected the appropriate configuration for all
- of the necessary pyro channels, you can save the pyro
- configuration along with the rest of the flight computer
- configuration by pressing the 'Save' button in the main
- Configure Flight Computer window.
- </para>
- </section>
- </section>
- <section>
- <title>Configure AltosUI</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="configure-altosui.png" width="2.4in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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>
- <variablelist>
- <varlistentry>
- <term>Enable</term>
- <listitem>
- <para>Turns all voice announcements on and off</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Test Voice</term>
- <listitem>
- <para>
- Plays a short message allowing you to verify
- that the audio system is working and the volume settings
- are reasonable
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </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>
- <para>
- Note that to successfully command a flight computer over the radio
- (to configure the altimeter, monitor idle, or fire pyro charges),
- the callsign configured here must exactly match the callsign
- configured in the flight computer. This matching is case
- sensitive.
- </para>
- </section>
- <section>
- <title>Imperial Units</title>
- <para>
- This switches between metric units (meters) and imperial
- units (feet and miles). This affects the display of values
- use during flight monitoring, configuration, data graphing
- and all of the voice announcements. It does not change the
- units used when exporting to CSV files, those are always
- produced in metric units.
- </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>Configure Groundstation</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="configure-groundstation.png" width="3.1in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- Select this button and then select a TeleDongle or TeleBT Device from the list provided.
- </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>
- Note that TeleDongle and TeleBT don't save any configuration
- data, the settings here are recorded on the local machine in
- the Java preferences database. Moving the device to
- another machine, or using a different user account on the same
- machine will cause settings made here to have no effect.
- </para>
- <para>
- At the bottom of the dialog, there are three buttons:
- </para>
- <variablelist>
- <varlistentry>
- <term>Save</term>
- <listitem>
- <para>
- This writes any changes to the
- local Java preferences file. If you don't
- press this button, any changes you make will be lost.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Reset</term>
- <listitem>
- <para>
- This resets the dialog to the most recently saved values,
- erasing any changes you have made.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Close</term>
- <listitem>
- <para>
- This closes the dialog. Any unsaved changes will be
- lost.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- <para>
- The rest of the dialog contains the parameters to be configured.
- </para>
- <section>
- <title>Frequency</title>
- <para>
- This configures the frequency to use for both telemetry and
- packet command mode. Set this before starting any operation
- involving packet command mode so that it will use the right
- frequency. Telemetry monitoring mode also provides a menu to
- change the frequency, and that menu also sets the same Java
- preference value used here.
- </para>
- </section>
- <section>
- <title>RF 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. To change a TeleDongle or TeleBT's calibration,
- you must reprogram the unit completely, so this entry simply
- shows the current value and doesn't allow any changes.
- </para>
- </section>
- <section>
- <title>Telemetry Rate</title>
- <para>
- This lets you match the telemetry and packet link rate from
- the transmitter. If they don't match, the device won't
- receive any data.
- </para>
- </section>
- </section>
- <section>
- <title>Flash Image</title>
- <para>
- This reprograms Altus Metrum devices with new
- firmware. TeleMetrum v1.x, TeleDongle v0.2, TeleMini and
- TeleBT are all reprogrammed by using another similar unit as a
- programming dongle (pair programming). TeleMega, EasyMega,
- TeleMetrum v2, EasyMini and TeleDongle v3 are all programmed
- directly over their USB ports (self programming). Please read
- the directions for flashing devices in the Updating Device
- Firmware chapter below.
- </para>
- </section>
- <section>
- <title>Fire Igniter</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="fire-igniter.png" width="1.2in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- This activates the igniter circuits in the flight computer 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 device. This brings up another
- window which shows the current continuity test status for all
- of the pyro channels.
- </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>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="scan-channels.png" width="3.2in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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 baud rates
- and telemetry formats should be tried; by default, it only listens
- at 38400 baud with the standard telemetry format used in v1.0 and later
- firmware.
- </para>
- </section>
- <section>
- <title>Load Maps</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="load-maps.png" width="5.2in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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.
- </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 from our server at run-time, so as new sites are sent
- in, they'll get automatically added to this list.
- If the launch site isn't in the list, you can manually enter the lat/lon values
- </para>
- <para>
- There are four different kinds of maps you can view; you can
- select which to download by selecting as many as you like from
- the available types:
- <variablelist>
- <varlistentry>
- <term>Hybrid</term>
- <listitem>
- <para>
- A combination of satellite imagery and road data. This
- is the default view.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Satellite</term>
- <listitem>
- <para>
- Just the satellite imagery without any annotation.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Roadmap</term>
- <listitem>
- <para>
- Roads, political boundaries and a few geographic features.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Terrain</term>
- <listitem>
- <para>
- Contour intervals and shading that show hills and
- valleys.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <para>
- You can specify the range of zoom levels to download; smaller
- numbers show more area with less resolution. The default
- level, 0, shows about 3m/pixel. One zoom level change
- doubles or halves that number. Larger zoom levels show more
- detail, smaller zoom levels less.
- </para>
- <para>
- The Map Radius value sets how large an area around the center
- point to download. Select a value large enough to cover any
- plausible flight from that site. Be aware that loading a large
- area with a high maximum zoom level can attempt to download a
- lot of data. Loading hybrid maps with a 10km radius at a
- minimum zoom of -2 and a maximum zoom of 2 consumes about
- 120MB of space. Terrain and road maps consume about 1/10 as
- much space as satellite or hybrid maps.
- </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>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="monitor-idle.png" width="5.2in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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. Because this uses command
- mode, it needs to have the TeleDongle and flight computer
- callsigns match exactly. If you can receive telemetry, but
- cannot manage to run Monitor Idle, then it's very likely that
- your callsigns are different in some way.
- </para>
- <para>
- You can change the frequency and callsign used to communicate
- with the flight computer; they must both match the
- configuration in the flight computer exactly.
- </para>
- </section>
- </chapter>
- <chapter>
- <title>AltosDroid</title>
- <para>
- AltosDroid provides the same flight monitoring capabilities as
- AltosUI, but runs on Android devices. AltosDroid is designed to connect
- to a TeleBT receiver over Bluetooth™ and (on Android devices supporting
- USB On-the-go) TeleDongle and TeleBT devices over USB. AltosDroid monitors
- telemetry data, logging it to internal storage in the Android
- device, and presents that data in a UI similar to the 'Monitor
- Flight' window in AltosUI.
- </para>
- <para>
- This manual will explain how to configure AltosDroid, connect to
- TeleBT or TeleDongle, operate the flight monitoring interface
- and describe what the displayed data means.
- </para>
- <section>
- <title>Installing AltosDroid</title>
- <para>
- AltosDroid is available from the Google Play store. To install
- it on your Android device, open the Google Play Store
- application and search for “altosdroid”. Make sure you don't
- have a space between “altos” and “droid” or you probably won't
- find what you want. That should bring you to the right page
- from which you can download and install the application.
- </para>
- </section>
- <section>
- <title>Charging TeleBT Battery</title>
- <para>
- Before using TeleBT with AltosDroid, make sure the internal
- TeleBT battery is charged. To do this, attach a micro USB
- cable from a computer or other USB power source to TeleBT.
- A dual LED on the circuit board should illuminate, showing
- red while the battery is charging, green when charging is
- completed, and both red and green on at the same time if
- there is a battery fault.
- </para>
- </section>
- <section>
- <title>Connecting to TeleBT over Bluetooth™</title>
- <para>
- Press the Android 'Menu' button or soft-key to see the
- configuration options available. Select the 'Connect a device'
- option and then the 'Scan for devices' entry at the bottom to
- look for your TeleBT device. Select your device, and when it
- asks for the code, enter '1234'.
- </para>
- <para>
- Subsequent connections will not require you to enter that
- code, and your 'paired' device will appear in the list without
- scanning.
- </para>
- </section>
- <section>
- <title>Connecting to TeleDongle or TeleBT over USB</title>
- <para>
- Get a special USB On-the-go adapter cable. These cables have a USB
- micro-B male connector on one end and a standard A female
- connector on the other end. Plug in your TeleDongle or TeleBT
- device to the adapter cable and the adapter cable into your
- phone and AltosDroid should automatically start up. If it
- doesn't, the most likely reason is that your Android device
- doesn't support USB On-the-go.
- </para>
- </section>
- <section>
- <title>Configuring AltosDroid</title>
- <para>
- There are several configuration and operation parameters
- available in the AltosDroid menu.
- </para>
- <section>
- <title>Select radio frequency</title>
- <para>
- This selects which frequency to listen on by bringing up a
- menu of pre-set radio frequencies. Pick the one which matches
- your altimeter.
- </para>
- </section>
- <section>
- <title>Select data rate</title>
- <para>
- Altus Metrum transmitters can be configured to operate at
- lower data rates to improve transmission range. If you have
- configured your device to do this, this menu item allows you
- to change the receiver to match.
- </para>
- </section>
- <section>
- <title>Change units</title>
- <para>
- This toggles between metric and imperial units.
- </para>
- </section>
- <section>
- <title>Load maps</title>
- <para>
- Brings up a dialog allowing you to download offline map
- tiles so that you can have maps available even if you have
- no network connectivity at the launch site.
- </para>
- </section>
- <section>
- <title>Map type</title>
- <para>
- Displays a menu of map types and lets you select one. Hybrid
- maps include satellite images with a roadmap
- overlaid. Satellite maps dispense with the roadmap
- overlay. Roadmap shows just the roads. Terrain includes
- roads along with shadows indicating changes in elevation,
- and other geographical features.
- </para>
- </section>
- <section>
- <title>Toggle Online/Offline maps</title>
- <para>
- Switches between online and offline maps. Online maps will
- show a 'move to current position' icon in the upper right
- corner, while offline maps will have copyright information
- all over the map. Otherwise, they're pretty similar.
- </para>
- </section>
- <section>
- <title>Select Tracker</title>
- <para>
- Switches the information displays to show data for a
- different transmitting device. The map will always show all
- of the devices in view. Trackers are shown and selected by
- serial number, so make sure you note the serial number of
- devices in each airframe.
- </para>
- </section>
- <section>
- <title>Delete Track</title>
- <para>
- Deletes all information about a transmitting device.
- </para>
- </section>
- </section>
- <section>
- <title>AltosDroid Flight Monitoring</title>
- <para>
- AltosDroid is designed to mimic the AltosUI flight monitoring
- display, providing separate tabs for each stage of your rocket
- flight along with a tab containing a map of the local area
- with icons marking the current location of the altimeter and
- the Android device.
- </para>
- <section>
- <title>Pad</title>
- <para>
- The '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.
- </para>
- <para>
- When the pad tab is selected, the voice responses will
- include status changes to the igniters and GPS reception,
- letting you know if the rocket is still ready for launch.
- </para>
- <variablelist>
- <varlistentry>
- <term>Battery</term>
- <listitem>
- <para>
- This indicates whether the Li-Po battery
- powering the transmitter has sufficient charge to last for
- the duration of the flight. A value of more than
- 3.8V is required for a 'GO' status.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Receiver Battery</term>
- <listitem>
- <para>
- This indicates whether the Li-Po battery
- powering the TeleBT has sufficient charge to last for
- the duration of the flight. A value of more than
- 3.8V is required for a 'GO' status.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Data Logging</term>
- <listitem>
- <para>
- 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 and TeleMega can store multiple
- flights, depending on the configured maximum flight
- log size. TeleGPS logs data continuously. 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>
- </varlistentry>
- <varlistentry>
- <term>GPS Locked</term>
- <listitem>
- <para>
- For a TeleMetrum or TeleMega 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>
- </varlistentry>
- <varlistentry>
- <term>GPS Ready</term>
- <listitem>
- <para>
- For a TeleMetrum or TeleMega 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>
- </varlistentry>
- <varlistentry>
- <term>Apogee Igniter</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- <varlistentry>
- <term>Main Igniter</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- <varlistentry>
- <term>Igniter A-D</term>
- <listitem>
- <para>
- This indicates whether the indicated additional pyro
- channel 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>
- </varlistentry>
- </variablelist>
- <para>
- The Pad tab also shows the location of the Android device.
- </para>
- </section>
- <section>
- <title>Flight</title>
- <para>
- The 'Flight' tab shows information used to evaluate and spot
- a rocket while in flight. It displays speed and height data
- to monitor the health of the rocket, along with elevation,
- range and bearing to help locate the rocket in the sky.
- </para>
- <para>
- While the Flight tab is displayed, the voice announcements
- will include current speed, height, elevation and bearing
- information.
- </para>
- <variablelist>
- <varlistentry>
- <term>Speed</term>
- <listitem>
- <para>
- Shows current vertical speed. During descent, the
- speed values are averaged over a fairly long time to
- try and make them steadier.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Height</term>
- <listitem>
- <para>
- Shows the current height above the launch pad.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Max Speed</term>
- <listitem>
- <para>
- Shows the maximum vertical speed seen during the flight.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Max Height</term>
- <listitem>
- <para>
- Shows the maximum height above launch pad.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Elevation</term>
- <listitem>
- <para>
- This is the angle above the horizon from the android
- devices current position.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Range</term>
- <listitem>
- <para>
- The total distance from the android device to the
- rocket, including both ground distance and
- difference in altitude. Use this to gauge how large
- the rocket is likely to appear in the sky.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Bearing</term>
- <listitem>
- <para>
- This is the aziumuth from true north for the rocket
- from the android device. Use this in combination
- with the Elevation value to help locate the rocket
- in the sky, or at least to help point the antenna in
- the general direction. This is provided in both
- degrees and a compass point (like West South
- West). You'll want to know which direction is true
- north before launching your rocket.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Ground Distance</term>
- <listitem>
- <para>
- This shows the distance across the ground to the
- lat/lon where the rocket is located. Use this to
- estimate what is currently under the rocket.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Latitude/Longitude</term>
- <listitem>
- <para>
- Displays the last known location of the rocket.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Apogee Igniter</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- <varlistentry>
- <term>Main Igniter</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- </variablelist>
- </section>
- <section>
- <title>Recover</title>
- <para>
- The 'Recover' tab shows information used while recovering the
- rocket on the ground after flight.
- </para>
- <para>
- While the Recover tab is displayed, the voice announcements
- will include distance along with either bearing or
- direction, depending on whether you are moving.
- </para>
- <variablelist>
- <varlistentry>
- <term>Bearing</term>
- <listitem>
- <para>
- This is the aziumuth from true north for the rocket
- from the android device. Use this in combination
- with the Elevation value to help locate the rocket
- in the sky, or at least to help point the antenna in
- the general direction. This is provided in both
- degrees and a compass point (like West South
- West). You'll want to know which direction is true
- north before launching your rocket.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Direction</term>
- <listitem>
- <para>
- When you are in motion, this provides the angle from
- your current direction of motion towards the rocket.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Distance</term>
- <listitem>
- <para>
- Distance over the ground to the rocket.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Tar Lat/Tar Lon</term>
- <listitem>
- <para>
- Displays the last known location of the rocket.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>My Lat/My Lon</term>
- <listitem>
- <para>
- Displays the location of the Android device.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Max Height</term>
- <listitem>
- <para>
- Shows the maximum height above launch pad.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Max Speed</term>
- <listitem>
- <para>
- Shows the maximum vertical speed seen during the flight.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Max Accel</term>
- <listitem>
- <para>
- Shows the maximum vertical acceleration seen during the flight.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </section>
- <section>
- <title>Map</title>
- <para>
- The 'Map' tab shows a map of the area around the rocket
- being tracked along with information needed to recover it.
- </para>
- <para>
- On the map itself, icons showing the location of the android
- device along with the last known location of each tracker. A
- blue line is drawn from the android device location to the
- currently selected tracker.
- </para>
- <para>
- Below the map, the distance and either bearing or direction
- along with the lat/lon of the target and the android device
- are shown
- </para>
- <para>
- The Map tab provides the same voice announcements as the
- Recover tab.
- </para>
- </section>
- </section>
- <section>
- <title>Downloading Flight Logs</title>
- <para>
- AltosDroid always saves every bit of telemetry data it
- receives. To download that to a computer for use with AltosUI,
- remove the SD card from your Android device, or connect your
- device to your computer's USB port and browse the files on
- that device. You will find '.telem' files in the TeleMetrum
- directory that will work with AltosUI directly.
- </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 flight computer 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, TeleMega or EasyMega for hours.
- A 110mAh battery weighs less than a triple A battery and is a good
- choice for use with TeleMini or EasyMini.
- </para>
- <para>
- By default, we ship TeleMini, TeleMetrum and TeleMega flight computers 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 prefer to
- install an SMA connector so that you can run a coaxial cable to an
- antenna mounted elsewhere in the rocket. However, note that the
- GPS antenna is fixed on all current products, so you really want
- to install the flight computer in a bay made of RF-transparent
- materials if at all possible.
- </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. If possible, use an SMA to BNC
- adapter instead of feedline between the antenna feedpoint and
- TeleDongle, as this will give you the best performance. 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>
- Alternatively, a TeleBT attached with an SMA to BNC adapter at the
- feed point of a hand-held yagi used in conjunction with an Android
- device running AltosDroid makes an outstanding ground station.
- </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 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. AltosDroid on an Android device
- with GPS receiver works great for this, too!
- </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
- currently uses a Yaesu FT1D, Bdale has a Yaesu VX-7R, which
- is a nicer radio in most ways but doesn't support APRS.
- </para>
- <para>
- So, to recap, on the ground the hardware you'll need includes:
- <orderedlist inheritnum='inherit' numeration='arabic'>
- <listitem>
- <para>
- an antenna and feed-line or adapter
- </para>
- </listitem>
- <listitem>
- <para>
- a TeleDongle
- </para>
- </listitem>
- <listitem>
- <para>
- a notebook computer
- </para>
- </listitem>
- <listitem>
- <para>
- optionally, a hand-held GPS receiver
- </para>
- </listitem>
- <listitem>
- <para>
- optionally, an HT or receiver covering 435 MHz
- </para>
- </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. TeleDongle and an SMA to BNC adapter fit perfectly
- between the driven element and reflector of Arrow antennas.
- </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>
- We have designed and prototyped several “companion boards” that
- can attach to the companion connector on TeleMetrum,
- TeleMega and EasyMega
- flight computers to collect more data, provide more pyro channels,
- and so forth. We do not yet know if or when any of these boards
- will be produced in enough quantity to sell. If you have specific
- interests for data collection or control of events in your rockets
- beyond the capabilities of our existing productions, please let
- us know!
- </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>
- <para>
- Watch our
- <ulink url="http://altusmetrum.org/">web site</ulink> for more news
- and information as our family of products evolves!
- </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 some creativity and/or compromise may be required. This chapter
- contains some suggestions about how to install Altus Metrum
- products into a 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 most of our products, we
- prefer nylon standoffs and nylon screws; they're good to at least 50G
- and cannot cause any electrical issues on the board. Metal screws
- and standoffs are fine, too, just be careful to avoid electrical
- shorts! For TeleMini v1.0, we usually cut small pieces of 1/16 inch
- 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>
- <para>
- Make sure accelerometer-equipped products like TeleMetrum,
- TeleMega and EasyMega are aligned precisely along the axis of
- acceleration so that the accelerometer can accurately
- capture data during the flight.
- </para>
- </listitem>
- <listitem>
- <para>
- 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.
- </para>
- </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 should 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 UHF 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 used in TeleMetrum and TeleMega is
- highly sensitive and normally have no trouble tracking enough
- satellites to provide accurate position information for
- recovering the rocket. However, there are many ways the GPS signal
- can end up attenuated, negatively affecting GPS performance.
- <orderedlist inheritnum='inherit' numeration='arabic'>
- <listitem>
- <para>
- 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.
- </para>
- </listitem>
- <listitem>
- <para>
- 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.
- </para>
- </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>
- <para>
- Keep wires from different circuits apart. Moving circuits
- further apart will reduce RFI.
- </para>
- </listitem>
- <listitem>
- <para>
- 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.
- </para>
- </listitem>
- <listitem>
- <para>
- 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.
- </para>
- </listitem>
- <listitem>
- <para>
- Avoid resonant lengths. Know what frequencies are present
- in the environment and avoid having wire lengths near a
- natural resonant length. Altus Metrum products transmit on the
- 70cm amateur band, so you should avoid lengths that are a
- simple ratio of that length; essentially any multiple of ¼
- of the wavelength (17.5cm).
- </para>
- </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>
- All barometric sensors are 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>
- TeleMega, TeleMetrum v2, EasyMega, EasyMini and TeleDongle v3
- are all programmed directly over their USB connectors (self
- programming). TeleMetrum v1, TeleMini and TeleDongle v0.2 are
- all programmed by using another device as a programmer (pair
- programming). It's important to recognize which kind of devices
- you have before trying to reprogram them.
- </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>
- If you need to update the firmware on a TeleDongle v0.2, we recommend
- updating the altimeter first, before updating TeleDongle. However,
- note that TeleDongle rarely need to be updated. Any firmware version
- 1.0.1 or later will work, version 1.2.1 may have improved receiver
- performance slightly.
- </para>
- <para>
- Self-programmable devices (TeleMega, TeleMetrum v2, EasyMega and EasyMini)
- are reprogrammed by connecting them to your computer over USB
- </para>
- <section>
- <title>
- Updating TeleMega, TeleMetrum v2, EasyMega, EasyMini or
- TeleDongle v3 Firmware
- </title>
- <orderedlist inheritnum='inherit' numeration='arabic'>
- <listitem>
- <para>
- Attach a battery if necessary and power switch to the target
- device. Power up the device.
- </para>
- </listitem>
- <listitem>
- <para>
- Using a Micro USB cable, connect the target device to your
- computer's USB socket.
- </para>
- </listitem>
- <listitem>
- <para>
- Run AltosUI, and select 'Flash Image' from the File menu.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the target device in the Device Selection dialog.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the image you want to flash to the device, which
- should have a name in the form
- <product>-v<product-version>-<software-version>.ihx, such
- as TeleMega-v1.0-1.3.0.ihx.
- </para>
- </listitem>
- <listitem>
- <para>
- 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.
- </para>
- </listitem>
- <listitem>
- <para>
- Hit the 'OK' button and the software should proceed to flash
- the device with new firmware, showing a progress bar.
- </para>
- </listitem>
- <listitem>
- <para>
- Verify that the device is working by using the 'Configure
- Altimeter' or 'Configure Groundstation' item to check over
- the configuration.
- </para>
- </listitem>
- </orderedlist>
- <section>
- <title>Recovering From Self-Flashing Failure</title>
- <para>
- If the firmware loading fails, it can leave the device
- unable to boot. Not to worry, you can force the device to
- start the boot loader instead, which will let you try to
- flash the device again.
- </para>
- <para>
- On each device, connecting two pins from one of the exposed
- connectors will force the boot loader to start, even if the
- regular operating system has been corrupted in some way.
- </para>
- <variablelist>
- <varlistentry>
- <term>TeleMega</term>
- <listitem>
- <para>
- Connect pin 6 and pin 1 of the companion connector. Pin 1
- can be identified by the square pad around it, and then
- the pins could sequentially across the board. Be very
- careful to <emphasis>not</emphasis> short pin 8 to
- anything as that is connected directly to the battery. Pin
- 7 carries 3.3V and the board will crash if that is
- connected to pin 1, but shouldn't damage the board.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>EasyMega</term>
- <listitem>
- <para>
- Connect pin 6 and pin 1 of the companion connector. Pin 1
- can be identified by the square pad around it, and then
- the pins could sequentially across the board. Be very
- careful to <emphasis>not</emphasis> short pin 8 to
- anything as that is connected directly to the battery. Pin
- 7 carries 3.3V and the board will crash if that is
- connected to pin 1, but shouldn't damage the board.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>TeleMetrum v2</term>
- <listitem>
- <para>
- Connect pin 6 and pin 1 of the companion connector. Pin 1
- can be identified by the square pad around it, and then
- the pins could sequentially across the board. Be very
- careful to <emphasis>not</emphasis> short pin 8 to
- anything as that is connected directly to the battery. Pin
- 7 carries 3.3V and the board will crash if that is
- connected to pin 1, but shouldn't damage the board.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>EasyMini</term>
- <listitem>
- <para>
- Connect pin 6 and pin 1 of the debug connector, which is
- the six holes next to the beeper. Pin 1 can be identified
- by the square pad around it, and then the pins could
- sequentially across the board, making Pin 6 the one on the
- other end of the row.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>TeleDongle v3</term>
- <listitem>
- <para>
- Connect pin 32 on the CPU to ground. Pin 32 is closest
- to the USB wires on the row of pins towards the center
- of the board. Ground is available on the capacitor
- next to it, on the end towards the USB wires.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- <para>
- Once you've located the right pins:
- </para>
- <orderedlist inheritnum='inherit' numeration='arabic'>
- <listitem>
- <para>
- Turn the altimeter power off.
- </para>
- </listitem>
- <listitem>
- <para>
- Connect a battery.
- </para>
- </listitem>
- <listitem>
- <para>
- Connect the indicated terminals together with a short
- piece of wire. Take care not to accidentally connect
- anything else.
- </para>
- </listitem>
- <listitem>
- <para>
- Connect USB
- </para>
- </listitem>
- <listitem>
- <para>
- Turn the board power on.
- </para>
- </listitem>
- <listitem>
- <para>
- The board should now be visible over USB as 'AltosFlash'
- and be ready to receive firmware.
- </para>
- </listitem>
- <listitem>
- <para>
- Once the board has been powered up, you can remove the
- piece of wire.
- </para>
- </listitem>
- </orderedlist>
- </section>
- </section>
- <section>
- <title>Pair Programming</title>
- <para>
- The big concept to understand is that you have to use a
- TeleMetrum v1.0, TeleBT v1.0 or TeleDongle v0.2 as a
- programmer to update a pair programmed device. Due to limited
- memory resources in the cc1111, we don't support programming
- directly over USB for these devices.
- </para>
- </section>
- <section>
- <title>Updating TeleMetrum v1.x Firmware</title>
- <orderedlist inheritnum='inherit' numeration='arabic'>
- <listitem>
- <para>
- 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.
- </para>
- </listitem>
- <listitem>
- <para>
- Take the 2 screws out of the TeleDongle v0.2 or TeleBT v1.0
- case to get access to the circuit board.
- </para>
- </listitem>
- <listitem>
- <para>
- Plug the 8-pin end of the programming cable to the
- matching connector on the TeleDongle v0.2 or TeleBT v1.0, 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.
- </para>
- </listitem>
- <listitem>
- <para>
- Attach a battery to the TeleMetrum board.
- </para>
- </listitem>
- <listitem>
- <para>
- Plug the TeleDongle v0.2 or TeleBT v1.0 into your computer's USB port, and power
- up the TeleMetrum.
- </para>
- </listitem>
- <listitem>
- <para>
- Run AltosUI, and select 'Flash Image' from the File menu.
- </para>
- </listitem>
- <listitem>
- <para>
- Pick the TeleDongle v0.2 or TeleBT v1.0 device from the list, identifying it as the
- programming device.
- </para>
- </listitem>
- <listitem>
- <para>
- 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.
- </para>
- </listitem>
- <listitem>
- <para>
- 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.
- </para>
- </listitem>
- <listitem>
- <para>
- Hit the 'OK' button and the software should proceed to flash
- the TeleMetrum with new firmware, showing a progress bar.
- </para>
- </listitem>
- <listitem>
- <para>
- 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.
- </para>
- </listitem>
- <listitem>
- <para>
- If something goes wrong, give it another try.
- </para>
- </listitem>
- </orderedlist>
- </section>
- <section>
- <title>Updating TeleMini Firmware</title>
- <orderedlist inheritnum='inherit' numeration='arabic'>
- <listitem>
-<para>
- You'll need a special 'programming cable' to reprogram the
- TeleMini. You can make your own using an 8-pin MicroMaTch
- connector on one end and a set of four pins on the other.
- </para>
-</listitem>
- <listitem>
-<para>
- Take the 2 screws out of the TeleDongle v0.2 or TeleBT v1.0 case to get access
- to the circuit board.
- </para>
-</listitem>
- <listitem>
-<para>
- Plug the 8-pin end of the programming cable to the matching
- connector on the TeleDongle v0.2 or TeleBT v1.0, 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Attach a battery to the TeleMini board.
- </para>
-</listitem>
- <listitem>
-<para>
- Plug the TeleDongle v0.2 or TeleBT v1.0 into your computer's USB port, and power
- up the TeleMini
- </para>
-</listitem>
- <listitem>
-<para>
- Run AltosUI, and select 'Flash Image' from the File menu.
- </para>
-</listitem>
- <listitem>
-<para>
- Pick the TeleDongle v0.2 or TeleBT v1.0 device from the list, identifying it as the
- programming device.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Hit the 'OK' button and the software should proceed to flash
- the TeleMini with new firmware, showing a progress bar.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- If something goes wrong, give it another try.
- </para>
-</listitem>
- </orderedlist>
- </section>
- <section>
- <title>Updating TeleDongle v0.2 Firmware</title>
- <para>
- Updating TeleDongle v0.2 firmware is just like updating
- TeleMetrum v1.x or TeleMini
- firmware, but you use either a TeleMetrum v1.x, TeleDongle
- v0.2 or TeleBT v1.0 as the programmer.
- </para>
- <orderedlist inheritnum='inherit' numeration='arabic'>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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
- v1.x, TeleDongle v0.2 or TeleBT v1.0.
- </para>
-</listitem>
- <listitem>
-<para>
- Take the 2 screws out of the TeleDongle v0.2 or TeleBT v1.0 case to get access
- to the circuit board.
- </para>
-</listitem>
- <listitem>
-<para>
- 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 v0.2.
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Attach a battery to the TeleMetrum v1.x board if you're using one.
- </para>
-</listitem>
- <listitem>
-<para>
- Plug both the programmer and the TeleDongle into your computer's USB
- ports, and power up the programmer.
- </para>
-</listitem>
- <listitem>
-<para>
- Run AltosUI, and select 'Flash Image' from the File menu.
- </para>
-</listitem>
- <listitem>
-<para>
- Pick the programmer device from the list, identifying it as the
- programming device.
- </para>
-</listitem>
- <listitem>
-<para>
- Select the image you want put on the TeleDongle v0.2, 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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 v0.2
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Hit the 'OK' button and the software should proceed to flash
- the TeleDongle v0.2 with new firmware, showing a progress bar.
- </para>
-</listitem>
- <listitem>
-<para>
- Confirm that the TeleDongle v0.2 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 v0.2.
- </para>
-</listitem>
- <listitem>
-<para>
- If something goes wrong, give it another try.
- </para>
-</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>
- TeleMega Specifications
- </title>
- <itemizedlist>
- <listitem>
- <para>
- Recording altimeter for model rocketry.
- </para>
- </listitem>
- <listitem>
- <para>
- Supports dual deployment and four auxiliary pyro channels
- (a total of 6 events).
- </para>
- </listitem>
- <listitem>
- <para>
- 70cm 40mW ham-band transceiver for telemetry down-link.
- </para>
- </listitem>
- <listitem>
- <para>
- Barometric pressure sensor good to 100k feet MSL.
- </para>
- </listitem>
- <listitem>
- <para>
- 1-axis high-g accelerometer for motor characterization, capable of
- +/- 102g.
- </para>
- </listitem>
- <listitem>
- <para>
- 9-axis IMU including integrated 3-axis accelerometer,
- 3-axis gyroscope and 3-axis magnetometer.
- </para>
- </listitem>
- <listitem>
- <para>
- On-board, integrated uBlox Max 7 GPS receiver with 5Hz update rate capability.
- </para>
- </listitem>
- <listitem>
- <para>
- On-board 8 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>
- Can use either main system Li-Po or optional separate pyro battery
- to fire e-matches.
- </para>
- </listitem>
- <listitem>
- <para>
- 3.25 x 1.25 inch board designed to fit inside 38mm air-frame coupler tube.
- </para>
- </listitem>
- </itemizedlist>
- </section>
- <section>
- <title>
- EasyMega Specifications
- </title>
- <itemizedlist>
- <listitem>
- <para>
- Recording altimeter for model rocketry.
- </para>
- </listitem>
- <listitem>
- <para>
- Supports dual deployment and four auxiliary pyro channels
- (a total of 6 events).
- </para>
- </listitem>
- <listitem>
- <para>
- Barometric pressure sensor good to 100k feet MSL.
- </para>
- </listitem>
- <listitem>
- <para>
- 1-axis high-g accelerometer for motor characterization, capable of
- +/- 102g.
- </para>
- </listitem>
- <listitem>
- <para>
- 9-axis IMU including integrated 3-axis accelerometer,
- 3-axis gyroscope and 3-axis magnetometer.
- </para>
- </listitem>
- <listitem>
- <para>
- On-board 8 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>
- Can use either main system Li-Po or optional separate pyro battery
- to fire e-matches.
- </para>
- </listitem>
- <listitem>
- <para>
- 1.25 x 1.25 inch board designed to fit inside 38mm air-frame coupler tube.
- </para>
- </listitem>
- </itemizedlist>
- </section>
- <section>
- <title>
- TeleMetrum v2 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, 40mW ham-band transceiver for telemetry down-link.
- </para>
- </listitem>
- <listitem>
- <para>
- Barometric pressure sensor good to 100k feet MSL.
- </para>
- </listitem>
- <listitem>
- <para>
- 1-axis high-g accelerometer for motor characterization, capable of
- +/- 102g.
- </para>
- </listitem>
- <listitem>
- <para>
- On-board, integrated uBlox Max 7 GPS receiver with 5Hz update rate capability.
- </para>
- </listitem>
- <listitem>
- <para>
- On-board 8 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>TeleMetrum v1 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, 10mW 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 v2.0 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, 10mW ham-band transceiver for telemetry down-link.
- </para>
- </listitem>
- <listitem>
- <para>
- Barometric pressure sensor good to 100k feet MSL.
- </para>
- </listitem>
- <listitem>
- <para>
- On-board 1 megabyte non-volatile memory for flight data storage.
- </para>
- </listitem>
- <listitem>
- <para>
- USB interface for configuration, and data recovery.
- </para>
- </listitem>
- <listitem>
- <para>
- Support for Li-Po rechargeable batteries (using an
- external charger), or any 3.7-15V external battery.
- </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 .8 inch board designed to fit inside 24mm air-frame coupler tube.
- </para>
- </listitem>
- </itemizedlist>
- </section>
- <section>
- <title>
- TeleMini v1.0 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, 10mW 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 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>
- <section>
- <title>
- EasyMini 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>
- Barometric pressure sensor good to 100k feet MSL.
- </para>
- </listitem>
- <listitem>
- <para>
- On-board 1 megabyte non-volatile memory for flight data storage.
- </para>
- </listitem>
- <listitem>
- <para>
- USB interface for configuration, and data recovery.
- </para>
- </listitem>
- <listitem>
- <para>
- Support for Li-Po rechargeable batteries (using an
- external charger), or any 3.7-15V external battery.
- </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 .8 inch board designed to fit inside 24mm air-frame coupler tube.
- </para>
- </listitem>
- </itemizedlist>
- </section>
- </chapter>
- <chapter>
- <title>FAQ</title>
- <para>
- <emphasis>TeleMetrum seems to shut off when disconnected from the
- computer.</emphasis> <?linebreak?>
- 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>
- <emphasis>It's impossible to stop the TeleDongle when it's in “p” mode, I have
- to unplug the USB cable? </emphasis><?linebreak?>
- 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>
- <emphasis>The amber LED (on the TeleMetrum) lights up when both
- battery and USB are connected. Does this mean it's charging?
- </emphasis><?linebreak?>
- 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>
- <emphasis>There are no “dit-dah-dah-dit” sound or lights like the manual
- mentions?</emphasis><?linebreak?>
- That's the “pad” mode. Weak batteries might be the problem.
- It is also possible that the flight computer 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>
- <emphasis>How do I save flight data?</emphasis><?linebreak?>
- 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 for cc1111 based products and 7119667 for cc1120
- based products. 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 configuration memory.
- </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>Drill Templates</title>
- <para>
- These images, when printed, provide precise templates for the
- mounting holes in Altus Metrum flight computers
- </para>
- <section>
- <title>TeleMega template</title>
- <para>
- TeleMega has overall dimensions of 1.250 x 3.250 inches, and
- the mounting holes are sized for use with 4-40 or M3 screws.
- </para>
- <informalfigure>
- <mediaobject id="TeleMegaTemplate">
- <imageobject>
- <imagedata format="SVG" fileref="telemega.svg"
- scalefit="0" scale="100" align="center" />
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>EasyMega template</title>
- <para>
- EasyMega has overall dimensions of 1.250 x 2.250 inches, and
- the mounting holes are sized for use with 4-40 or M3 screws.
- </para>
- <informalfigure>
- <mediaobject id="EasyMegaTemplate">
- <imageobject>
- <imagedata format="SVG" fileref="easymega.svg"
- scalefit="0" scale="100" align="center" />
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>TeleMetrum template</title>
- <para>
- TeleMetrum has overall dimensions of 1.000 x 2.750 inches, and the
- mounting holes are sized for use with 4-40 or M3 screws.
- </para>
- <informalfigure>
- <mediaobject id="TeleMetrumTemplate">
- <imageobject>
- <imagedata format="SVG" fileref="telemetrum.svg"
- scalefit="0" scale="100" align="center" />
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>TeleMini v2/EasyMini template</title>
- <para>
- TeleMini v2 and EasyMini have overall dimensions of 0.800 x 1.500 inches, and the
- mounting holes are sized for use with 4-40 or M3 screws.
- </para>
- <informalfigure>
- <mediaobject id="MiniTemplate">
- <imageobject>
- <imagedata format="SVG" fileref="easymini.svg"
- scalefit="0" scale="100" align="center" />
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>TeleMini v1 template</title>
- <para>
- TeleMini has overall dimensions of 0.500 x 1.500 inches, and the
- mounting holes are sized for use with 2-56 or M2 screws.
- </para>
- <informalfigure>
- <mediaobject id="TeleMiniTemplate">
- <imageobject>
- <imagedata format="SVG" fileref="telemini.svg"
- scalefit="0" scale="100" align="center" />
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- </appendix>
- <appendix>
- <title>Calibration</title>
- <para>
- There are only two calibrations required for TeleMetrum and
- TeleMega, and only one for EasyMega, TeleDongle, TeleMini and EasyMini.
- 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
- 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 USB-enabled boards, this is
- best done over USB. For TeleMini v1, 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 storage 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, TeleMega and EasyMega Accelerometers</title>
- <para>
- While barometric sensors are factory-calibrated,
- accelerometers are not, and so each must be calibrated once
- installed in a flight computer. Explicitly calibrating the
- accelerometers also allows us to load any compatible device.
- We perform a two-point calibration using gravity.
- </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, TeleMega or EasyMega 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>
- <title>Igniter Current</title>
- <para>
- The question "how much igniter current can Altus Metrum products
- handle?" comes up fairly frequently. The short answer is "more than
- you're likely to need", the remainder of this appendix provides a
- longer answer.
- </para>
- <section>
- <title>Current Products</title>
- <para>
- The FET switches we're using on all of our current products that
- have pyro channels are the Vishay Siliconix Si7232DN. These parts
- have exceptionally low Rds(on) values, better than 0.02 ohms! That
- means they aren't making a lot of heat... and the limit on current
- is "package limited", meaning it's all about how much you can heat
- the die before something breaks.
- </para>
- <para>
- Cutting to the chase, the Si7232DN specs are 25 amps <emphasis>continuous</emphasis> at
- 20V at a temperature of 25C. In pulsed mode, they're rated for 40A.
- However, those specs are a little mis-leading because it really is
- all about the heat generated... you can get something like 85A
- through one briefly. Note that a typical commercial e-match only
- needed about 13 microseconds to fire in tests on my bench a couple
- years ago!
- </para>
- <para>
- So a great plan is to use something like an e-match as the initiator
- and build up pyrogen(s) as required to actually light what you're
- trying to light... But if you want to use a high-current igniter,
- we can probably handle it!
- </para>
- </section>
- <section>
- <title>Version 1 Products</title>
- <para>
- The FET switches used on TeleMetrum v1 and TeleMini v1 products
- were Fairchild FDS9926A. The Rds(on) values under our operating
- conditions are on the order of 0.04 ohms. These parts were rated
- for a continuous current-carrying capacity of 6.5A, and a pulsed
- current capacity of 20A.
- </para>
- <para>
- As with the more modern parts, the real limit is based on the heat
- generated in the part during the firing interval. So, while the
- specs on these parts aren't as good as the ones we use on current
- products, they were still great, and we never had a complaint about
- current carrying capacity with any of our v1 boards.
- </para>
- </section>
- </appendix>
- <appendix>
- <title>Release Notes</title>
- <simplesect>
- <title>Version 1.6.1</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.6.1.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.6</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.6.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.5</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.5.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.4.1</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.4.1.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.4</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.4.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.3.2</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.3.2.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.3.1</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.3.1.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.3</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.3.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.2.1</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.2.1.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.2</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.2.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.1.1</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.1.1.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.1</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.1.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.0.1</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.0.1.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 0.9.2</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-0.9.2.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 0.9</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-0.9.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 0.8</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-0.8.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 0.7.1</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-0.7.1.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- </appendix>
-</book>
-
-<!-- LocalWords: Altusmetrum
--->
--- /dev/null
+<!--
+ Generates single FO document from DocBook XML source using DocBook XSL
+ stylesheets.
+
+ See xsl-stylesheets/fo/param.xsl for all parameters.
+
+ NOTE: The URL reference to the current DocBook XSL stylesheets is
+ rewritten to point to the copy on the local disk drive by the XML catalog
+ rewrite directives so it doesn't need to go out to the Internet for the
+ stylesheets. This means you don't need to edit the <xsl:import> elements on
+ a machine by machine basis.
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format">
+<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
+<xsl:import href="common.xsl"/>
+<xsl:include href="titlepage.templates.xsl"/>
+<xsl:include href="footer.templates.xsl"/>
+
+<xsl:param name="ulink.show" select="0" />
+<xsl:param name="ulink.footnotes" select="1"/>
+
+<xsl:param name="fop1.extensions" select="1" />
+<xsl:param name="variablelist.as.blocks" select="1" />
+
+<xsl:param name="paper.type" select="'USletter'"/>
+
+<xsl:param name="hyphenate">false</xsl:param>
+<!-- justify, left or right -->
+<xsl:param name="alignment">left</xsl:param>
+
+<xsl:param name="body.font.family" select="'Open Sans Light,sans-serif'"/>
+<xsl:param name="title.font.family" select="'Open Sans Light,sans-serif'"/>
+<xsl:param name="monospace.font.family" select="'DejaVu Sans Mono,monospace'"/>
+<xsl:param name="body.font.master">11</xsl:param>
+<xsl:param name="body.font.size">
+ <xsl:value-of select="$body.font.master"/><xsl:text>pt</xsl:text>
+</xsl:param>
+
+<xsl:param name="body.margin.bottom" select="'0.5in'"/>
+<xsl:param name="body.margin.top" select="'0.5in'"/>
+<xsl:param name="bridgehead.in.toc" select="0"/>
+<xsl:param name="footer.column.widths">10 1 1</xsl:param>
+
+<!-- Default fetches image from Internet (long timeouts) -->
+<xsl:param name="draft.watermark.image" select="''"/>
+
+<!-- Line break -->
+<xsl:template match="processing-instruction('asciidoc-br')">
+ <fo:block/>
+</xsl:template>
+
+<!-- Horizontal ruler -->
+<xsl:template match="processing-instruction('asciidoc-hr')">
+ <fo:block space-after="1em">
+ <fo:leader leader-pattern="rule" rule-thickness="0.5pt" rule-style="solid" leader-length.minimum="100%"/>
+ </fo:block>
+</xsl:template>
+
+<!-- Hard page break -->
+<xsl:template match="processing-instruction('asciidoc-pagebreak')">
+ <fo:block break-after='page'/>
+</xsl:template>
+
+<!-- Sets title to body text indent -->
+<xsl:param name="body.start.indent">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">0pt</xsl:when>
+ <xsl:when test="$passivetex.extensions != 0">0pt</xsl:when>
+ <xsl:otherwise>1pc</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="title.margin.left">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">-1pc</xsl:when>
+ <xsl:when test="$passivetex.extensions != 0">0pt</xsl:when>
+ <xsl:otherwise>0pt</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="page.margin.bottom" select="'0.25in'"/>
+<xsl:param name="page.margin.inner">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">0.75in</xsl:when>
+ <xsl:otherwise>0.75in</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="page.margin.outer">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">0.5in</xsl:when>
+ <xsl:otherwise>0.5in</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:param name="page.margin.top" select="'0.5in'"/>
+<xsl:param name="page.orientation" select="'portrait'"/>
+<xsl:param name="page.width">
+ <xsl:choose>
+ <xsl:when test="$page.orientation = 'portrait'">
+ <xsl:value-of select="$page.width.portrait"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$page.height.portrait"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:param name="table.frame.border.thickness">0.5pt</xsl:param>
+<xsl:param name="table.frame.border.color">#78079a</xsl:param>
+<xsl:param name="table.frame.border.thickness">0.5pt</xsl:param>
+<xsl:param name="table.cell.border.thickness">0.5pt</xsl:param>
+<xsl:param name="table.cell.border.color">#78079a</xsl:param>
+<xsl:param name="table.cell.border.with.css" select="1"/>
+
+<xsl:attribute-set name="component.title.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.61051"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="section.title.level1.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.4641"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="section.title.level2.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.331"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="section.title.level3.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.21"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="section.title.level4.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.1"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="copyright.title.properties">
+ <xsl:attribute name="font-size">11pt</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="text-align">center</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="revhistory.title.properties">
+ <xsl:attribute name="font-size">11pt</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="text-align">center</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="revhistory.table.properties">
+ <xsl:attribute name="border">0.5pt solid #78079a</xsl:attribute>
+ <xsl:attribute name="width">50%</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="revhistory.table.cell.properties">
+ <xsl:attribute name="border">0.5pt solid #78079a</xsl:attribute>
+ <xsl:attribute name="font-size">11pt</xsl:attribute>
+ <xsl:attribute name="padding">2pt</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="monospace.properties">
+ <xsl:attribute name="font-size">11pt</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="component.title.properties">
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ <xsl:attribute name="color">#78079a</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="section.title.properties">
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ <xsl:attribute name="color">#78079a</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="admonition.title.properties">
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ <xsl:attribute name="color">#ff4040</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="formal.title.properties">
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ <xsl:attribute name="color">#78079a</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="sidebar.properties" use-attribute-sets="formal.object.properties">
+ <xsl:attribute name="border-style">solid</xsl:attribute>
+ <xsl:attribute name="border-width">1pt</xsl:attribute>
+ <xsl:attribute name="border-color">silver</xsl:attribute>
+ <xsl:attribute name="background-color">#ffffee</xsl:attribute>
+ <xsl:attribute name="padding-left">12pt</xsl:attribute>
+ <xsl:attribute name="padding-right">12pt</xsl:attribute>
+ <xsl:attribute name="padding-top">6pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">6pt</xsl:attribute>
+ <xsl:attribute name="margin-left">0pt</xsl:attribute>
+ <xsl:attribute name="margin-right">12pt</xsl:attribute>
+ <xsl:attribute name="margin-top">6pt</xsl:attribute>
+ <xsl:attribute name="margin-bottom">6pt</xsl:attribute>
+</xsl:attribute-set>
+
+<!-- Only shade programlisting and screen verbatim elements -->
+<xsl:param name="shade.verbatim" select="1"/>
+<xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="background-color">
+ <xsl:choose>
+ <xsl:when test="self::programlisting|self::screen">#ffffff</xsl:when>
+ <xsl:otherwise>inherit</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+</xsl:attribute-set>
+
+<!--
+ Force XSL Stylesheets 1.72 default table breaks to be the same as the current
+ version (1.74) default which (for tables) is keep-together="auto".
+-->
+<xsl:attribute-set name="table.properties">
+ <xsl:attribute name="keep-together.within-column">auto</xsl:attribute>
+</xsl:attribute-set>
+
+</xsl:stylesheet>
--- /dev/null
+<!--
+ Generates single XHTML document from DocBook XML source using DocBook XSL
+ stylesheets.
+
+ NOTE: The URL reference to the current DocBook XSL stylesheets is
+ rewritten to point to the copy on the local disk drive by the XML catalog
+ rewrite directives so it doesn't need to go out to the Internet for the
+ stylesheets. This means you don't need to edit the <xsl:import> elements on
+ a machine by machine basis.
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl"/>
+<xsl:import href="common.xsl"/>
+</xsl:stylesheet>
--- /dev/null
+/*
+ CSS stylesheet for XHTML produced by DocBook XSL stylesheets.
+*/
+
+@font-face {
+ font-family: 'Open Sans';
+ src: url('fonts/OpenSans-Regular.ttf');
+ font-weight: normal;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ src: url('fonts/OpenSans-Italic.ttf');
+ font-weight: normal;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ src: url('fonts/OpenSans-Semibold.ttf');
+ font-weight: bold;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ src: url('fonts/OpenSans-SemiboldItalic.ttf');
+ font-weight: bold;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans Mono';
+ src: url('fonts/DejaVuSansMono.ttf');
+ font-weight: normal;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans Mono';
+ src: url('fonts/DejaVuSansMono-Oblique.ttf');
+ font-weight: normal;
+ font-style: oblique;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans Mono';
+ src: url('fonts/DejaVuSansMono-Bold.ttf');
+ font-weight: bold;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans Mono';
+ src: url('fonts/DejaVuSansMono-BoldOblique.ttf');
+ font-weight: bold;
+ font-style: oblique;
+}
+
+body {
+ font-family: "Open Sans",sans-serif;
+ font-size: 12pt;
+}
+
+code, pre {
+ font-family: "DejaVu Sans Mono", monospace;
+}
+
+span.strong {
+ font-weight: bold;
+}
+
+body blockquote {
+ margin-top: .75em;
+ line-height: 1.5;
+ margin-bottom: .75em;
+}
+
+html body {
+ margin: 1em 5% 1em 5%;
+ line-height: 1.2;
+}
+
+body div {
+ margin: 0;
+}
+
+a:link {
+ color: #78079a;
+}
+
+a:visited {
+ color: #78079a;
+}
+
+h1, h2, h3, h4, h5, h6
+{
+ color: #78079a;
+ font-family: "Open Sans",sans-serif;
+}
+
+div.revhistory table {
+ width: 50%;
+ border-width: 1px;
+}
+
+div titlepage {
+ margin-top: 100px;
+ border-top: 2px;
+}
+
+div.warning h1, div.warning h2, div.warning h3, div.warning h4, div.warning h5, div.warning h6 {
+ color: #ff2020;
+}
+
+div.warning p, div.note p, div.error p {
+ margin-left: 5%;
+ margin-left: 5%;
+}
+
+h3.corpauthor img {
+ position: fixed;
+ left: 0px;
+ top: 0px;
+ width: 410px;
+ height: 90px;
+ border-right: 2px solid #808080;
+ border-bottom: 2px solid #808080;
+}
+
+div.toc {
+ position: fixed;
+ left: 0px;
+ top: 92px;
+ bottom: 0;
+ width: 390px;
+ margin-right: 0;
+ margin-left: 0;
+ padding-left: 10px;
+ padding-right: 10px;
+ float: left;
+ border-right: 2px solid #808080;
+ border-collapse: collapse;
+ overflow: auto;
+}
+
+div.toc p,
+div.list-of-figures p,
+div.list-of-tables p,
+div.list-of-examples p,
+div.toc a
+{
+ color: black;
+}
+
+div.toc p {
+ color: black;
+}
+
+div.toc a:link {
+ text-decoration: none;
+}
+
+div.toc a:visited {
+ text-decoration: none;
+}
+
+div.toc a:hover {
+ text-decoration: underline;
+}
+
+div.toc a:active {
+ text-decoration: underline;
+}
+
+div.book {
+ margin-left: 25em;
+}
+
+div.list-of-figures {
+ display: none;
+}
+
+div.list-of-tables {
+ display: none;
+}
+
+div.figure p {
+ text-align: center;
+}
+div.figure img {
+ display: block;
+ margin: auto;
+}
+
+div.table p.title {
+ text-align: center;
+}
+
+div.table-contents table {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+div.example p.title,
+div.sidebar p.title
+{
+ font-weight: normal;
+ color: #78079a;
+ font-family: "Open Sans",sans-serif;
+ margin-bottom: 0.2em;
+}
+
+body h1 {
+ margin: .0em 0 0 -4%;
+ line-height: 1.3;
+ border-bottom: 2px solid #808080;
+}
+
+body h2 {
+ margin: 0.5em 0 0 -4%;
+ line-height: 1.3;
+ border-bottom: 2px solid #808080;
+}
+
+body h3 {
+ margin: .8em 0 0 -3%;
+ line-height: 1.3;
+}
+
+body h4 {
+ margin: .8em 0 0 -3%;
+ line-height: 1.3;
+ border-top: 2px solid #808080;
+}
+
+body h5 {
+ margin: .8em 0 0 -2%;
+ line-height: 1.3;
+}
+
+body h6 {
+ margin: .8em 0 0 -1%;
+ line-height: 1.3;
+}
+
+body hr {
+ border: none; /* Broken on IE6 */
+}
+div.footnotes hr {
+ border: 1px solid #808080;
+}
+
+div.navheader th, div.navheader td, div.navfooter td {
+ font-family: "Open Sans",sans-serif;
+ font-size: 12pt;
+ font-weight: normal;
+ color: #78079a;
+}
+div.navheader img, div.navfooter img {
+ border-style: none;
+}
+div.navheader a, div.navfooter a {
+ font-weight: normal;
+}
+div.navfooter hr {
+ border: 1px solid #808080;
+}
+
+body td {
+ line-height: 1.2
+}
+
+body th {
+ line-height: 1.2;
+}
+
+ol {
+ line-height: 1.2;
+}
+
+ul, body dir, body menu {
+ line-height: 1.2;
+}
+
+html {
+ margin: 0;
+ padding: 0;
+}
+
+body h1, body h2, body h3, body h4, body h5, body h6 {
+ margin-left: 0
+}
+
+body pre {
+ margin: 0.5em 10% 0.5em 1em;
+ line-height: 1.0;
+}
+
+tt.literal, code.literal {
+}
+
+.programlisting, .screen {
+ border: 1px solid #808080;
+ background: #f4f4f4;
+ margin: 0.5em 10% 0.5em 0;
+ padding: 0.5em 1em;
+}
+
+div.sidebar {
+ background: #ffffee;
+ margin: 1.0em 10% 0.5em 0;
+ padding: 0.5em 1em;
+ border: 1px solid #808080;
+}
+div.sidebar * { padding: 0; }
+div.sidebar div { margin: 0; }
+div.sidebar p.title {
+ margin-top: 0.5em;
+ margin-bottom: 0.2em;
+}
+
+div.bibliomixed {
+ margin: 0.5em 5% 0.5em 1em;
+}
+
+div.glossary dt {
+ font-weight: bold;
+}
+div.glossary dd p {
+ margin-top: 0.2em;
+}
+
+dl {
+ margin: .8em 0;
+ line-height: 1.2;
+}
+
+dt {
+ margin-top: 0.5em;
+}
+
+dt span.term {
+ font-weight: bold;
+}
+
+div.variablelist dd p {
+ margin-top: 0;
+}
+
+div.itemizedlist li, div.orderedlist li {
+ margin-left: -0.8em;
+ margin-top: 0.5em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+
+div.sidebar ul, div.sidebar ol {
+ margin-left: 2.8em;
+}
+
+div.itemizedlist p.title,
+div.orderedlist p.title,
+div.variablelist p.title
+{
+ margin-bottom: -0.8em;
+}
+
+div.revhistory {
+ border-style: none;
+}
+
+div.revhistory table, div.revhistory th, div.revhistory td {
+ border-collapse: collapse;
+ border: 1px solid #808080;
+ padding: 0.25em;
+}
+
+div.revhistory th {
+ color: black;
+}
+
+/* Keep TOC and index lines close together. */
+div.toc dl, div.toc dt,
+div.list-of-figures dl, div.list-of-figures dt,
+div.list-of-tables dl, div.list-of-tables dt,
+div.indexdiv dl, div.indexdiv dt
+{
+ line-height: normal;
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+/*
+ Table styling does not work because of overriding attributes in
+ generated HTML.
+*/
+div.table-contents p,
+div.informaltable p
+{
+ margin: 0px;
+}
+
+div.table thead, div.table tfoot,
+div.informaltable thead, div.informaltable tfoot
+{
+ font-weight: bold;
+}
+
+div.mediaobject img {
+ margin-bottom: 0.8em;
+}
+div.figure p.title,
+div.table p.title
+{
+ margin-top: 1em;
+ margin-bottom: 0.4em;
+}
+
+div.calloutlist p
+{
+ margin-top: 0em;
+ margin-bottom: 0.4em;
+}
+
+a img {
+ border-style: none;
+}
+
+@media print {
+ div.navheader, div.navfooter { display: none; }
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
--- /dev/null
+ === APRS
+
+ {aprsdevices} can send APRS if desired, and the
+ interval between APRS packets can be configured. As each APRS
+ packet takes a full second to transmit, we recommend an
+ interval of at least 5 seconds to avoid consuming too much
+ battery power or radio channel bandwidth. You can configure
+ the APRS interval using {application}; that process is described in
+ <<{configure_section}>>.
+
+ AltOS supports both compressed and uncompressed APRS
+ position report data formats. The compressed format
+ provides for higher position precision and shorter
+ packets than the uncompressed APRS format. We've found
+ some older APRS receivers that do not handle the
+ compressed format. The Kenwood TH-72A requires the use
+ of uncompressed format to display altitude information
+ correctly. The Yaesu FT1D requires the use of
+ compressed format to display altitude information.
+
+ APRS packets include an SSID (Secondary Station Identifier)
+ field that allows one operator to have multiple
+ transmitters. AltOS allows you to set this to a single digit
+ from 0 to 9, allowing you to fly multiple transmitters at the
+ same time while keeping the identify of each one separate in
+ the receiver. By default, the SSID is set to the last digit of
+ the device serial number.
+
+ The APRS packet format includes a comment field that
+ can have arbitrary text in it. AltOS uses this to send
+ status information as shown in the following table.
+
+ .Altus Metrum APRS Comments
+ [options="header",cols="1,1,3"]
+ |====
+ |Field |Example |Description
+
+ |1
+ |L
+ |GPS Status U for unlocked, L for locked
+
+ |2
+ |6
+ |Number of Satellites in View
+
+ |3
+ |B4.0
+ |Altimeter Battery Voltage
+
+ ifdef::altusmetrum[]
+
+ |4
+ |A3.7
+ |Apogee Igniter Voltage
+
+ |5
+ |M3.7
+ |Main Igniter Voltage
+
+ |6
+ |1286
+ |Device Serial Number
+
+ endif::altusmetrum[]
+ ifdef::telegps[]
+
+ |4
+ |1286
+ |Device Serial Number
+
+ endif::telegps[]
+
+ |====
+
+ ifdef::altusmetrum[]
+ Here's an example of an APRS comment showing GPS lock with 6
+ satellites in view, a primary battery at 4.0V, and
+ apogee and main igniters both at 3.7V from device 1286.
+
+ ....
+ L6 B4.0 A3.7 M3.7 1286
+ ....
+ endif::altusmetrum[]
+
+ ifdef::telegps[]
+ Here's an example of an APRS comment showing GPS lock with 6
+ satellites in view and a primary battery at 4.0V from device 1876.
+
+ ....
+ L6 B4.0 1876
+ ....
+ endif::telegps[]
+
+ Make sure your primary battery is above 3.8V
+ ifdef::altusmetrum[]
+ any connected igniters are above 3.5V
+ endif::altusmetrum[]
+ and GPS is locked with at least 5 or 6 satellites in
+ view before flying. If GPS is switching between L and
+ U regularly, then it doesn't have a good lock and you
+ should wait until it becomes stable.
+
+ If the GPS receiver loses lock, the APRS data
+ transmitted will contain the last position for which
+ GPS lock was available. You can tell that this has
+ happened by noticing that the GPS status character
+ switches from 'L' to 'U'. Before GPS has locked, APRS
+ will transmit zero for latitude, longitude and
+ altitude.
--- /dev/null
+<!--
+ Inlcuded in xhtml.xsl, xhtml.chunked.xsl, htmlhelp.xsl.
+ Contains common XSL stylesheets parameters.
+ Output documents styled by docbook.css.
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+<xsl:param name="html.stylesheet" select="'docbook-xsl.css'"/>
+
+<xsl:param name="htmlhelp.chm" select="'htmlhelp.chm'"/>
+<xsl:param name="htmlhelp.hhc.section.depth" select="5"/>
+
+<xsl:param name="section.autolabel">
+ <xsl:choose>
+ <xsl:when test="/processing-instruction('asciidoc-numbered')">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:param name="suppress.navigation" select="0"/>
+<xsl:param name="navig.graphics.extension" select="'.png'"/>
+<xsl:param name="navig.graphics" select="0"/>
+<xsl:param name="navig.graphics.path">images/icons/</xsl:param>
+<xsl:param name="navig.showtitles">0</xsl:param>
+
+<xsl:param name="shade.verbatim" select="0"/>
+<xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="background-color">#E0E0E0</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:param name="admon.graphics" select="1"/>
+<xsl:param name="admon.graphics.path">images/icons/</xsl:param>
+<xsl:param name="admon.graphics.extension" select="'.png'"/>
+<xsl:param name="admon.style">
+ <xsl:text>margin-left: 0; margin-right: 10%;</xsl:text>
+</xsl:param>
+<xsl:param name="admon.textlabel" select="1"/>
+
+<xsl:param name="callout.defaultcolumn" select="'60'"/>
+<xsl:param name="callout.graphics.extension" select="'.png'"/>
+<xsl:param name="callout.graphics" select="'1'"/>
+<xsl:param name="callout.graphics.number.limit" select="'10'"/>
+<xsl:param name="callout.graphics.path" select="'images/icons/callouts/'"/>
+<xsl:param name="callout.list.table" select="'1'"/>
+
+<!-- This does not seem to work. -->
+<xsl:param name="section.autolabel.max.depth" select="2"/>
+
+<xsl:param name="chunk.first.sections" select="1"/>
+<xsl:param name="chunk.section.depth" select="1"/>
+<xsl:param name="chunk.quietly" select="0"/>
+<xsl:param name="chunk.toc" select="''"/>
+<xsl:param name="chunk.tocs.and.lots" select="0"/>
+
+<xsl:param name="html.cellpadding" select="'4px'"/>
+<xsl:param name="html.cellspacing" select="''"/>
+
+<xsl:param name="table.borders.with.css" select="1"/>
+<xsl:param name="table.cell.border.color" select="'#78079a'"/>
+<xsl:param name="table.cell.border.style" select="'solid'"/>
+<xsl:param name="table.cell.border.thickness" select="'1px'"/>
+<xsl:param name="table.footnote.number.format" select="'a'"/>
+<xsl:param name="table.footnote.number.symbols" select="''"/>
+<xsl:param name="table.frame.border.color" select="'#78079a'"/>
+<xsl:param name="table.frame.border.style" select="'solid'"/>
+<xsl:param name="table.frame.border.thickness" select="'1px'"/>
+<xsl:param name="tablecolumns.extension" select="'1'"/>
+
+<xsl:attribute-set name="revhistory.title.properties">
+ <xsl:attribute name="font-size">12pt</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="text-align">center</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="revhistory.table.properties">
+ <xsl:attribute name="border">0.5pt solid #78079a</xsl:attribute>
+ <xsl:attribute name="width">50%</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="revhistory.table.cell.properties">
+ <xsl:attribute name="border">0.5pt solid #78079a</xsl:attribute>
+ <xsl:attribute name="font-size">12pt</xsl:attribute>
+ <xsl:attribute name="padding">2pt</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:param name="generate.revhistory.link" select="1"/>
+
+<xsl:param name="highlight.source" select="1"/>
+
+<xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--
+ Table of contents inserted by <?asciidoc-toc?> processing instruction.
+-->
+<xsl:param name="generate.toc">
+ <xsl:choose>
+ <xsl:when test="/processing-instruction('asciidoc-toc')">
+article toc,title
+book toc,title,figure,table,example,equation
+ <!-- The only way I could find that suppressed book chapter TOCs -->
+ <xsl:if test="$generate.section.toc.level != 0">
+chapter toc,title
+part toc,title
+preface toc,title
+qandadiv toc
+qandaset toc
+reference toc,title
+sect1 toc
+sect2 toc
+sect3 toc
+sect4 toc
+sect5 toc
+section toc
+set toc,title
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+article nop
+book nop
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+</xsl:stylesheet>
--- /dev/null
+<subtitle>Protocol Definitions</subtitle>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>13 January 2012</date>
+<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>
+ <?dbhtml filename="companion-revhistory.html"?>
+ <revision>
+ <revnumber>0.1</revnumber>
+ <date>13 January 2012</date>
+ <revremark>Initial content</revremark>
+ </revision>
+</revhistory>
--- /dev/null
+= AltOS Companion Port
+:doctype: article
+:toc:
+
+== Companion Port
+
+ 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).
+
+ The Companion Port provides two different functions:
+
+ * 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.
+
+
+ * 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
+
+== Companion SPI Protocol
+
+ 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.
+
+ 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.
+
+ Because of the limits of the AVR processors used in the first
+ two companion boards, the SPI data rate is set to 187.5kbaud.
+
+== SPI Message Formats
+
+ 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.
+
+ .Companion Command Message
+ [options="border",cols="1,3,3,9"]
+ |====
+ |Offset
+ |Data Type
+ |Name
+ |Description
+
+ |0
+ |uint8_t
+ |command
+ |Command identifier
+
+ |1
+ |uint8_t
+ |flight_state
+ |Current flight computer state
+
+ |2
+ |uint16_t
+ |tick
+ |Flight computer clock (100 ticks/second)
+
+ |4
+ |uint16_t
+ |serial
+ |Flight computer serial number
+
+ |6
+ |uint16_t
+ |flight
+ |Flight number
+
+ |8
+ |
+ |
+ |
+
+ |====
+
+ .Companion Command Identifiers
+ [options="border",cols="1,3,9"]
+ |====
+ |Value
+ |Name
+ |Description
+
+ |1
+ |SETUP
+ |Supply the flight computer with companion
+ information
+
+ |2
+ |FETCH
+ |Return telemetry information
+
+ |3
+ |NOTIFY
+ |Tell companion board when flight state changes
+ |====
+
+ 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.
+
+ '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.
+
+ '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.
+
+ '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.
+
+ 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.
+
+ === SETUP reply message
+
+ .SETUP reply contents
+ [options="border",cols="1,3,3,9"]
+ |====
+ |Offset
+ |Data Type
+ |Name
+ |Description
+
+ |0
+ |uint16_t
+ |board_id
+ |Board identifier
+
+ |2
+ |uint16_t
+ |board_id_inverse
+ |~board_id—used to tell if a board is present
+
+ |4
+ |uint8_t
+ |update_period
+ |Minimum time (in 100Hz ticks) between FETCH commands
+
+ |5
+ |uint8_t
+ |channels
+ |Number of data channels to retrieve in FETCH command
+
+ |6
+ |
+ |
+ |
+ |====
+
+ 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.
+
+ 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.
+
+ === FETCH reply message
+
+ .FETCH reply contents
+ [options="border",cols="1,3,3,9"]
+ |====
+ |Offset
+ |Data Type
+ |Name
+ |Description
+
+ |0
+ |uint16_t
+ |data0
+ |0th data item
+
+ |2
+ |uint16_t
+ |data1
+ |1st data item
+
+ |...
+ |
+ |
+ |
+ |====
+
+ 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.
+
+== History and Motivation
+
+ 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.
+
+ 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.
+
+ 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.
+
+ 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.
+++ /dev/null
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE article 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>
- <para>
- 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.
- </para>
- </listitem>
- <listitem>
- <para>
- 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
- </para>
- </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>
- <para>
- 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.
- </para>
- <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>
--- /dev/null
+ifdef::altusmetrum[]
+
+ ==== Main Deploy Altitude
+
+ 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.
+
+ ==== Apogee Delay
+
+ 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.
+
+ ==== Apogee Lockout
+
+ Apogee lockout is the number of seconds after boost
+ where the flight computer will not fire the apogee
+ charge, even if the rocket appears to be at
+ apogee. This is often called 'Mach Delay', as it is
+ intended to prevent a flight computer from
+ unintentionally firing apogee charges due to the
+ pressure spike that occurrs across a mach
+ transition. Altus Metrum flight computers include a
+ Kalman filter which is not fooled by this sharp
+ pressure increase, and so this setting should be left
+ at the default value of zero to disable it.
+
+endif::altusmetrum[]
+
+ifdef::radio[]
+ ==== Frequency
+
+ This configures which of the frequencies to use for
+ both telemetry and packet command mode. Note that if
+ you set this value via packet command mode, the
+ TeleDongle frequency will also be automatically
+ reconfigured to match so that communication will
+ continue afterwards.
+
+ ==== RF Calibration
+
+ 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.
+
+ ==== Telemetry/RDF/APRS Enable
+
+ Enables the radio for transmission during
+ flight. When disabled, the radio will not
+ transmit anything during flight at all.
+
+ ==== Telemetry baud rate
+
+ This sets the modulation bit rate for data
+ transmission for both telemetry and packet
+ link mode. Lower bit rates will increase range
+ while reducing the amount of data that can be
+ sent and increasing battery consumption. All
+ telemetry is done using a rate 1/2 constraint
+ 4 convolution code, so the actual data
+ transmission rate is 1/2 of the modulation bit
+ rate specified here.
+
+ ==== APRS Interval
+
+ How often to transmit GPS information via APRS
+ (in seconds). When set to zero, APRS
+ transmission is disabled.
+ ifdef::altusmetrum[]
+ This option is
+ available on TeleMetrum v2 and TeleMega
+ boards. TeleMetrum v1 boards cannot transmit
+ APRS packets.
+ endif::altusmetrum[]
+ Note that a single APRS packet
+ takes nearly a full second to transmit, so
+ enabling this option will prevent sending any
+ other telemetry during that time.
+
+ ==== APRS SSID
+
+ Which SSID to report in APRS packets. By
+ default, this is set to the last digit of the
+ serial number, but can be configured to any
+ value from 0 to 9.
+
+ ==== APRS Format
+
+ Whether to send APRS data in Compressed or
+ Uncompressed format. Compressed format is
+ smaller and more precise. Uncompressed
+ format is older, but may work better with your
+ device. The Kenwood TH-D72 only displays
+ altitude information with Uncompressed
+ format, while the Yaesu FT1D only displays
+ altitude with Compressed format. Test before
+ you fly to see which to use.
+
+ ==== Callsign
+
+ This sets the call sign included in each
+ telemetry packet. Set this as needed to
+ conform to your local radio regulations.
+endif::radio[]
+
+ifdef::altusmetrum[]
+
+ ==== Maximum Flight Log Size
+
+ 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.
+
+ ==== Ignitor Firing Mode
+
+ This configuration parameter allows the two standard ignitor
+ channels (Apogee and Main) to be used in different
+ configurations.
+
+ 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.
+
+ Redundant Apogee::
+ This fires both channels at apogee, the
+ 'apogee' channel first followed after a two
+ second delay by the 'main' channel.
+
+ 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.
+
+ ifdef::telemetrum,telemega,easymega[]
+ ==== Pad Orientation
+
+ Because they include accelerometers,
+ TeleMetrum, TeleMega and EasyMega are
+ sensitive to the orientation of the board. By
+ default, they expect 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.
+
+ Antenna Up::
+ In this mode, the antenna end of the flight
+ computer must point forward, in line with the
+ expected flight path.
+
+ Antenna Down::
+ In this mode, the antenna end of the flight
+ computer must point aft, in line with the
+ expected flight path.
+ endif::telemetrum,telemega,easymega[]
+
+ ==== Beeper Frequency
+
+ The beeper on all Altus Metrum flight
+ computers works best at 4000Hz, however if you
+ have more than one flight computer in a single
+ airframe, having all of them sound at the same
+ frequency can be confusing. This parameter
+ lets you adjust the base beeper frequency
+ value.
+
+endif::altusmetrum[]
+
+ifdef::telegps[]
+ ==== Logging Trigger Motion
+
+ This sets the amount of motion that TeleGPS
+ needs to see before logging the new
+ position. Motions smaller than this are
+ skipped, which saves storage space.
+
+ ==== Position Reporting Interval
+
+ The interval between TeleGPS position reports,
+ both over the air and in the log. Increase
+ this to reduce the frequency of radio
+ transmissions and the length of time available
+ in the log.
+endif::telegps[]
+
+ifdef::telemega,easymega[]
+
+ ==== Configure Pyro Channels
+
+ .Additional Pyro Channel Configuration
+ image::configure-pyro.png[width="5.5in"]
+
+ This opens a separate window to configure the
+ additional pyro channels available on TeleMega
+ and EasyMega. One column is presented for
+ each channel. Each row represents a single
+ parameter, if enabled the parameter must meet
+ the specified test for the pyro channel to be
+ fired.
+
+ Select conditions and set the related value;
+ the pyro channel will be activated when *all*
+ of the conditions are met. Each pyro channel
+ has a separate set of configuration values, so
+ you can use different values for the same
+ condition with different channels.
+
+ At the bottom of the window, the 'Pyro Firing
+ Time' configuration sets the length of time
+ (in seconds) which each of these pyro channels
+ will fire for.
+
+ Once you have selected the appropriate
+ configuration for all of the necessary pyro
+ channels, you can save the pyro configuration
+ along with the rest of the flight computer
+ configuration by pressing the 'Save' button in
+ the main Configure Flight Computer window.
+
+ include::pyro-channels.raw[]
+
+endif::telemega,easymega[]
--- /dev/null
+ifdef::radio[]
+==== Voice Settings
+
+ {application} 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.
+
+ Enable::
+ Turns all voice announcements on and off
+
+ Test Voice::
+ Plays a short message allowing you to verify
+ that the audio system is working and the volume settings
+ are reasonable
+endif::radio[]
+
+==== Log Directory
+
+ {application} logs all telemetry data and saves all
+ flash data to this directory. This
+ directory is also used as the staring point
+ when selecting data files for display or
+ export.
+
+ Click on the directory name to bring up a
+ directory choosing dialog, select a new
+ directory and click 'Select Directory' to
+ change where {application} reads and writes data
+ files.
+
+ifdef::radio[]
+==== Callsign
+
+ 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 {application}
+ operators call sign as needed to comply with
+ your local radio regulations.
+
+ Note that to successfully command a flight
+ computer over the radio (to configure the
+ altimeter, monitor idle, or fire pyro
+ charges), the callsign configured here must
+ exactly match the callsign configured in the
+ flight computer. This matching is case
+ sensitive.
+endif::radio[]
+
+==== Imperial Units
+
+ This switches between metric units (meters)
+ and imperial units (feet and miles). This
+ affects the display of values use during
+ flight monitoring, configuration, data
+ graphing and all of the voice
+ announcements. It does not change the units
+ used when exporting to CSV files, those are
+ always produced in metric units.
+
+==== Serial Debug
+
+ This causes all communication with a connected
+ device to be dumped to the console from which
+ {application} 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.
+
+==== Font size
+
+ Selects the set of fonts used in the flight
+ monitor window. Choose between the small,
+ medium and large sets.
+
+==== Look & feel
+
+ Switches between the available Java user
+ interface appearances. The default selection
+ is supposed to match the native window system
+ appearance for the target platform.
+
+==== Menu position
+
+ Selects the initial position for the main
+ {application} window that includes all of the
+ command buttons.
+
+ifdef::gps[]
+==== Map Cache Size
+
+ Sets the number of map 'tiles' kept in memory
+ while the application is running. More tiles
+ consume more memory, but will make panning
+ around the map faster.
+endif::gps[]
+
+ifdef::radio[]
+==== Manage Frequencies
+
+ 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.
+endif::radio[]
--- /dev/null
+[dedication]
+== Acknowledgments
+
+ 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!
+
+ 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!
+
+ Have fun using these products, and we hope to meet all of you
+ out on the rocket flight line somewhere.
+
+ [verse]
+ Bdale Garbee, KB0G
+ NAR #87103, TRA #12201
+
+ [verse]
+ Keith Packard, KD7SQG
+ NAR #88757, TRA #12200
--- /dev/null
+= EasyMega Outline and Hole Pattern
+:doctype: article
+
+ This image, when printed, provides a precise template for the
+ mounting holes in EasyMega. EasyMega has overall dimensions of
+ 1.250 x 2.250 inches, and the mounting holes are sized for use
+ with 4-40 or M3 screws.
+
+ image::easymega.svg[align="center"]
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
- "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
-<article>
- <title>EasyMega Outline and Hole Pattern</title>
- <para>
- This image, when printed, provides a precise template for the
- mounting holes in EasyMega. EasyMega has overall dimensions
- of 1.250 x 2.250 inches, and the mounting holes are sized for
- use with 4-40 or M3 screws.
- </para>
- <informalfigure>
- <mediaobject id="EasyMegaTemplate">
- <imageobject>
- <imagedata format="SVG" fileref="easymega.svg"
- scalefit="0" scale="100" align="center" />
- </imageobject>
- </mediaobject>
- </informalfigure>
-</article>
-
-<!-- LocalWords: Altusmetrum
--->
--- /dev/null
+== EasyMega
+
+ .EasyMega Board
+ image::easymega-v1.0-top.jpg[width="4.5in"]
+
+ EasyMega is a 1¼ inch by 2¼ inch circuit board. It was
+ designed to easily fit in a 38mm coupler. Like TeleMetrum,
+ EasyMega has an accelerometer and so it must be mounted so that
+ the board is aligned with the flight axis. It can be mounted
+ either antenna up or down.
+
+ === EasyMega Screw Terminals
+
+ EasyMega has two sets of nine screw terminals on the end of
+ the board opposite the telemetry antenna. They are as follows:
+
+ .EasyMega Screw Terminals
+ [options="header",grid="all",cols="2,3,10"]
+ |====
+ |Terminal #|Terminal Name|Description
+
+ |Top 1
+ |Switch Input
+ |Switch connection to positive battery terminal
+
+ |Top 2
+ |Switch Output
+ |Switch connection to flight computer
+
+ |Top 3
+ |GND
+ |Ground connection for use with external active switch
+
+ |Top 4
+ |Main -
+ |Main pyro channel connection to pyro circuit
+
+ |Top 5
+ |Main +
+ |Main pyro channel common connection to battery +
+
+ |Top 6
+ |Apogee -
+ |Apogee pyro channel connection to pyro circuit
+
+ |Top 7
+ |Apogee +
+ |Apogee pyro channel common connection to battery +
+
+ |Top 8
+ |D -
+ |D pyro channel connection to pyro circuit
+
+ |Top 9
+ |D +
+ |D pyro channel common connection to battery +
+
+ |Bottom 1
+ |GND
+ |Ground connection for negative pyro battery terminal
+
+ |Bottom 2
+ |Pyro
+ |Positive pyro battery terminal
+
+ |Bottom 3
+ |Lipo
+ |Power switch output. Use to connect main battery to pyro battery input
+
+ |Bottom 4
+ |A -
+ |A pyro channel connection to pyro circuit
+
+ |Bottom 5
+ |A +
+ |A pyro channel common connection to battery +
+
+ |Bottom 6
+ |B -
+ |B pyro channel connection to pyro circuit
+
+ |Bottom 7
+ |B +
+ |B pyro channel common connection to battery +
+
+ |Bottom 8
+ |C -
+ |C pyro channel connection to pyro circuit
+
+ |Bottom 9
+ |C +
+ |C pyro channel common connection to battery +
+ |====
+
+ === Using a Separate Pyro Battery with EasyMega
+
+ EasyMega provides explicit support for an external pyro
+ battery. All that is required is to remove the jumper
+ between the lipo terminal (Bottom 3) and the pyro terminal
+ (Bottom 2). Then hook the negative pyro battery terminal to ground
+ (Bottom 1) and the positive pyro battery to the pyro battery
+ input (Bottom 2). You can then use the existing pyro screw
+ terminals to hook up all of the pyro charges.
+
+ === Using Only One Battery With EasyMega
+
+ Because EasyMega has built-in support for a separate pyro
+ battery, if you want to fly with just one battery running
+ both the computer and firing the charges, you need to
+ connect the flight computer battery to the pyro
+ circuit. EasyMega has two screw terminals for this—hook a
+ wire from the Lipo terminal (Bottom 3) to the Pyro terminal
+ (Bottom 2).
+
+ === Using an Active Switch with EasyMega
+
+ As explained above, an external active switch requires three
+ connections, one to the positive battery terminal, one to
+ the flight computer positive input and one to ground.
+
+ The positive battery terminal is available on Top terminal
+ 1, the positive flight computer input is on Top terminal
+ 2. Ground is on Top terminal 3.
--- /dev/null
+== EasyMini
+
+ .EasyMini Board
+ image::easymini-top.jpg[width="5.5in"]
+
+ EasyMini is built on a 0.8 inch by 1½ inch circuit board. It's
+ designed to fit in a 24mm coupler tube.
+
+ You usually don't need to configure EasyMini at all; it's set
+ up to do dual-deployment with an event at apogee to separate
+ the airframe and deploy a drogue and another event at 250m
+ (820ft) to deploy the main. Install EasyMini in your airframe,
+ hook up a battery, igniters and a power switch and you're
+ ready to fly.
+
+ === EasyMini Screw Terminals
+
+ EasyMini has two sets of four screw terminals near one end of the
+ board. Using the picture
+ above, the top four have connections for the main pyro
+ circuit and an external battery and the bottom four have
+ connections for the apogee pyro circuit and the power
+ switch. Counting from the left, the connections are as follows:
+
+ .EasyMini Screw Terminals
+ [options="header",grid="all",cols="2,3,10"]
+ |====
+ |Terminal #|Terminal Name|Description
+ |Top 1
+ |Main -
+ |Main pyro channel connection to pyro circuit
+
+ |Top 2
+ |Main +
+ |Main pyro channel common connection to battery +
+
+ |Top 3
+ |Battery +
+ |Positive external battery terminal
+
+ |Top 4
+ |Battery -
+ |Negative external battery terminal
+
+ |Bottom 1
+ |Apogee -
+ |Apogee pyro channel connection to pyro circuit
+
+ |Bottom 2
+ |Apogee +
+ |Apogee pyro channel common connection to battery +
+
+ |Bottom 3
+ |Switch Output
+ |Switch connection to flight computer
+
+ |Bottom 4
+ |Switch Input
+ |Switch connection to positive battery terminal
+ |====
+
+ === Connecting A Battery To EasyMini
+
+ There are two possible battery connections on
+ EasyMini. You can use either method; both feed
+ through the power switch terminals.
+
+ One battery connection is the standard Altus Metrum
+ white JST plug. This mates with single-cell Lithium
+ Polymer batteries sold by Altus Metrum.
+
+ The other is a pair of screw terminals marked 'Battery
+ +' and 'Battery -'. Connect a battery from 4 to 12
+ volts to these terminals, being careful to match polarity.
+
+ === Charging Lithium Batteries
+
+ Because EasyMini allows for batteries other than the
+ standard Altus Metrum Lithium Polymer cells, it cannot
+ incorporate a battery charger circuit. Therefore, when
+ using a Litium Polymer cell, you'll need an external
+ charger. These are available from Altus Metrum, or
+ from Spark Fun.
+
+ === Using a Separate Pyro Battery with EasyMini
+
+ As described above, using an external pyro battery involves
+ connecting the negative battery terminal to the flight
+ computer ground, connecting the positive battery terminal to
+ one of the igniter leads and connecting the other igniter
+ lead to the per-channel pyro circuit connection.
+
+ To connect the negative pyro battery terminal to EasyMini
+ ground, connect it to the negative external battery
+ connection, top terminal 4.
+
+ Connecting the positive battery terminal to the pyro
+ charges must be done separate from EasyMini, by soldering
+ them together or using some other connector.
+
+ The other lead from each pyro charge is then inserted into
+ the appropriate per-pyro channel screw terminal (top
+ terminal 1 for the Main charge, bottom terminal 1 for the
+ Apogee charge).
+
+ === Using an Active Switch with EasyMini
+
+ As explained above, an external active switch requires three
+ connections, one to the positive battery terminal, one to
+ the flight computer positive input and one to ground. Use
+ the negative external battery connection, top terminal 4 for
+ ground.
+
+ The positive battery terminal is available on bottom
+ terminal 4, the positive flight computer input is on the
+ bottom terminal 3.
--- /dev/null
+<subtitle>A Dual-Deploy Rocketry Flight Computer</subtitle>
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<copyright>
+ <year>2016</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="easymini-top.jpg" width="3.0in"/>
+ </imageobject>
+</mediaobject>
+
+<corpauthor>
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="3in"/>
+ </imageobject>
+ </inlinemediaobject>
+</corpauthor>
+
+<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>
+ <?dbhtml filename="easymini-revhistory.html"?>
+ <revision>
+ <revnumber>1.6.2</revnumber>
+ <date>10 January 2016</date>
+ <revremark>
+ First release of separate EasyMini doc
+ </revremark>
+ </revision>
+</revhistory>
--- /dev/null
+= EasyMini Outline and Hole Pattern
+:doctype: article
+
+ This image, when printed, provides a precise template for the
+ mounting holes in EasyMini. EasyMini has overall dimensions
+ of 0.800 x 1.500 inches, and the mounting holes are sized for
+ use with 4-40 or M3 screws.
+
+ image::easymini.svg[align="center"]
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
- "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
-<article>
- <title>EasyMini Outline and Hole Pattern</title>
- <para>
- This image, when printed, provides a precise template for the
- mounting holes in EasyMini. EasyMini has overall dimensions
- of 0.800 x 1.500 inches, and the mounting holes are sized for
- use with 4-40 or M3 screws.
- </para>
- <informalfigure>
- <mediaobject id="EasyMiniTemplate">
- <imageobject>
- <imagedata format="SVG" fileref="easymini.svg"
- scalefit="0" scale="100" align="center" />
- </imageobject>
- </mediaobject>
- </informalfigure>
-</article>
-
-<!-- LocalWords: Altusmetrum
--->
--- /dev/null
+[appendix]
+== Release Notes
+
+ :leveloffset: 2
+ include::release-notes-1.6.2.raw[]
+
+ :leveloffset: 0
--- /dev/null
+= EasyMini Owner's Manual
+:doctype: book
+:numbered:
+:altusmetrum: 1
+:easymini: 1
+:application: AltosUI
+
+ include::dedication.raw[]
+
+ include::intro.raw[]
+
+ include::getting-started.raw[]
+
+ include::usage.raw[]
+
+ include::easymini-device.raw[]
+
+ include::installation.raw[]
+
+ include::using-am-products.raw[]
+
+ include::altosui.raw[]
+
+ include::system-operation.raw[]
+
+ include::handling.raw[]
+
+ include::updating-firmware.raw[]
+
+ include::flight-data-recording.raw[]
+
+ include::specs.raw[]
+
+ include::easymini-release-notes.raw[]
--- /dev/null
+[appendix]
+== Flight Data Recording
+
+ Each flight computer logs data at 100 samples per second
+ during ascent and 10 samples per second during
+ ifdef::telemini[]
+ descent, except for TeleMini v1.0, which records ascent at 10 samples
+ per second and descent at 1 sample per second.
+ endif::telemini[]
+ ifndef::telemini[]
+ descent.
+ endif::telemini[]
+ Data are logged to
+ an on-board flash memory part, which can be partitioned into
+ several equal-sized blocks, one for each flight.
+
+ .Data Storage on Altus Metrum altimeters
+ [options="header",cols="1,1,1,1"]
+ |====
+ |Device |Bytes per Sample |Total Storage |Minutes at Full Rate
+ ifdef::telemetrum[]
+ |TeleMetrum v1.0 |8 |1MB |20
+ |TeleMetrum v1.1 v1.2 |8 |2MB |40
+ |TeleMetrum v2.0 |16 |8MB |80
+ endif::telemetrum[]
+ ifdef::telemini[]
+ |TeleMini v1.0 |2 |5kB |4
+ endif::telemini[]
+ ifdef::easymini[]
+ |EasyMini |16 |1MB |10
+ endif::easymini[]
+ ifdef::telemega[]
+ |TeleMega |32 |8MB |40
+ endif::telemega[]
+ ifdef::easymega[]
+ |EasyMega |32 |8MB |40
+ endif::easymega[]
+ |====
+
+ 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 you can store more flights.
+
+ Configuration data is also stored in the flash memory on
+ ifdef::telemetrum[TeleMetrum v1.x,]
+ ifdef::telemini[TeleMini and]
+ ifdef::easymini[EasyMini.]
+ This consumes 64kB
+ of flash space. This configuration space is not available
+ for storing flight log data.
+
+ ifdef::telemetrum,telemega,easymega[]
+ TeleMetrum v2.0, TeleMega and EasyMega
+ store configuration data in a bit of eeprom available within
+ the processor chip, leaving that space available in flash for
+ more flight data.
+ endif::telemetrum,telemega,easymega[]
+
+ To compute the amount of space needed for a single flight, you
+ can multiply the expected ascent time (in seconds) by 100
+ times bytes-per-sample, multiply the expected descent time (in
+ seconds) by 10 times the bytes per sample and add the two
+ together. That will slightly under-estimate the storage (in
+ bytes) needed for the flight.
+ ifdef::telemetrum[]
+ For instance, a TeleMetrum v2.0 flight spending
+ 20 seconds in ascent and 150 seconds in descent will take
+ about (20 * 1600) + (150 * 160) = 56000 bytes of storage. You
+ could store dozens of these flights in the on-board flash.
+ endif::telemetrum[]
+
+ The default size allows for several flights on each flight
+ ifdef::telemini[]
+ computer, except for TeleMini v1.0, which
+ only holds data for a single flight.
+ endif::telemini[]
+ ifndef::telemini[]
+ computer.
+ endif::telemini[]
+ You can adjust the size.
+
+ Altus Metrum flight computers will not overwrite existing
+ flight data, so be sure to download flight data and erase it
+ from the flight computer before it fills up. The flight
+ computer will still successfully control the flight even if it
+ cannot log data, so the only thing you will lose is the data.
--- /dev/null
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:d="http://docbook.org/ns/docbook"
+ version="1.0">
+
+<xsl:template name="footer.content">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="position" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+<!--
+ <fo:block>
+ <xsl:value-of select="$pageclass"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$sequence"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$position"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$gentext-key"/>
+ </fo:block>
+-->
+
+ <fo:block>
+ <!-- pageclass can be front, body, back -->
+ <!-- sequence can be odd, even, first, blank -->
+ <!-- position can be left, center, right -->
+ <xsl:choose>
+ <xsl:when test="$pageclass = 'titlepage'">
+ <!-- nop; no footer on title pages -->
+ </xsl:when>
+
+ <xsl:when test="$position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$position='left'">
+ <fo:block font-size="10">
+ <xsl:value-of select="//legalnotice"/>
+ </fo:block>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+</xsl:template>
+
+</xsl:stylesheet>
+
--- /dev/null
+<?xml version="1.0"?>
+<!-- $Id: fop.xconf 1339442 2012-05-17 01:42:56Z gadams $ -->
+
+<!--
+
+This is an example configuration file for FOP.
+This file contains the same settings as the default values
+and will have no effect if used unchanged.
+
+Relative config url's will be resolved relative to
+the location of this file.
+
+-->
+
+<!-- NOTE: This is the version of the configuration -->
+<fop version="1.0">
+
+ <!-- Base URL for resolving relative URLs -->
+ <base>.</base>
+
+ <!-- Source resolution in dpi (dots/pixels per inch) for determining the size of pixels in SVG and bitmap images, default: 72dpi -->
+ <source-resolution>72</source-resolution>
+ <!-- Target resolution in dpi (dots/pixels per inch) for specifying the target resolution for generated bitmaps, default: 72dpi -->
+ <target-resolution>72</target-resolution>
+
+ <!-- Default page-height and page-width, in case
+ value is specified as auto -->
+ <default-page-settings height="11in" width="8.26in"/>
+
+ <!-- Information for specific renderers -->
+ <!-- Uses renderer mime type for renderers -->
+ <renderers>
+ <renderer mime="application/pdf">
+ <filterList>
+ <!-- provides compression using zlib flate (default is on) -->
+ <value>flate</value>
+ </filterList>
+
+ <fonts>
+ <!-- embedded fonts -->
+ <font embed-url="fonts/OpenSans-Light.ttf">
+ <font-triplet name="Open Sans Light" style="normal"
+ weight="normal"/>
+ </font>
+ <font embed-url="fonts/OpenSans-LightItalic.ttf">
+ <font-triplet name="Open Sans Light" style="italic"
+ weight="normal"/>
+ </font>
+ <font embed-url="fonts/OpenSans-Semibold.ttf">
+ <font-triplet name="Open Sans Light" style="normal"
+ weight="bold"/>
+ </font>
+ <font embed-url="fonts/OpenSans-SemiboldItalic.ttf">
+ <font-triplet name="Open Sans Light" style="italic"
+ weight="bold"/>
+ </font>
+
+ <font embed-url="fonts/DejaVuSansMono.ttf">
+ <font-triplet name="DejaVu Sans Mono" style="normal"
+ weight="normal"/>
+ </font>
+ <font embed-url="fonts/DejaVuSansMono-Oblique.ttf">
+ <font-triplet name="DejaVu Sans Mono" style="italic"
+ weight="normal"/>
+ </font>
+ <font embed-url="fonts/DejaVuSansMono-Bold.ttf">
+ <font-triplet name="DejaVu Sans Mono" style="normal"
+ weight="bold"/>
+ </font>
+ <font embed-url="fonts/DejaVuSansMono-BoldOblique.ttf">
+ <font-triplet name="DejaVu Sans Mono" style="italic"
+ weight="bold"/>
+ </font>
+ </fonts>
+ </renderer>
+
+ <renderer mime="image/svg+xml">
+ <format type="paginated"/>
+ <link value="true"/>
+ <strokeText value="false"/>
+ </renderer>
+
+ <renderer mime="text/xml">
+ </renderer>
+
+ </renderers>
+</fop>
+
--- /dev/null
+== Getting Started
+
+ The first thing to do after you open the box is to hook up a
+ battery and charge it if necessary.
+
+ === Batteries
+
+ ifdef::telemetrum,telemega,easymega[]
+ For TeleMetrum, TeleMega and EasyMega, the battery can be charged by plugging it into the
+ corresponding socket of the device and then using the USB
+ cable to plug the flight computer into your computer's USB socket. The
+ on-board circuitry will charge the battery whenever it is plugged
+ in, because the on-off switch does NOT control the
+ charging circuitry.
+ endif::telemetrum,telemega,easymega[]
+ The Lithium Polymer
+ ifdef::telemini[TeleMini and]
+ EasyMini battery can be charged by disconnecting it
+ from the board and plugging it into a standalone
+ battery charger such as link:http://altusmetrum.org/LipoCharger[LipoCharger], and
+ connecting that via a USB cable to a laptop or other
+ USB power source.
+
+ You can also choose to use another battery with
+ EasyMini, anything supplying between 4 and 12 volts should
+ work fine (like a standard 9V battery), but if you are planning
+ to fire pyro charges, ground testing is required to verify that
+ the battery supplies enough current to fire your chosen e-matches.
+
+ ifdef::telemetrum,telemega,easymega[]
+ [NOTE]
+ ====
+ On TeleMetrum v1 boards, when the GPS chip is initially
+ searching for satellites, TeleMetrum will consume more current
+ than it pulls 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.
+
+ TeleMetrum v2.0, TeleMega and EasyMega use a higher power battery charger,
+ allowing them to charge the battery while running the board at
+ maximum power. When the battery is charging, or when the board
+ is consuming a lot of power, the red LED will be lit. When the
+ battery is fully charged, the green LED will be lit. When the
+ battery is damaged or missing, both LEDs will be lit, which
+ appears yellow.
+ ====
+ endif::telemetrum,telemega,easymega[]
+
+ ifdef::radio[]
+ === Ground Station Hardware
+
+ There are two ground stations available, the TeleDongle USB to
+ RF interface and the TeleBT Bluetooth/USB to RF interface. If
+ you plug either of these 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 an older version of Linux and are having
+ problems, try moving to a fresher kernel (2.6.33 or
+ newer).
+ endif::radio[]
+
+ === Linux/Mac/Windows Ground Station Software
+
+ Next you should obtain and install the AltOS software.
+ The AltOS distribution includes the AltosUI ground
+ station program, current firmware images for all of
+ the hardware, and a number of standalone utilities
+ that are rarely needed. Pre-built binary packages are
+ available for Linux, Microsoft Windows, Mac OSX. Full
+ source code and build instructions are also
+ available. The latest version may always be downloaded
+ from http://altusmetrum.org/AltOS
+
+ ifdef::radio[]
+ === Android Ground Station Software
+
+ TeleBT can also connect to an Android device over
+ BlueTooth or USB. The
+ link:https://play.google.com/store/apps/details?id=org.altusmetrum.AltosDroid[AltosDroid
+ Android application] is available from the
+ link:https://play.google.com[Google Play system].
+
+ You don't need a data plan to use AltosDroid, but
+ without network access, you'll want to download
+ offline map data before wandering away from the
+ network.
+ endif::radio[]
--- /dev/null
+[appendix]
+== Handling Precautions
+
+ 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.
+
+ [WARNING]
+ 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.
+
+ The barometric sensors used on all of our flight computers are
+ sensitive to sunlight. In normal mounting situations, the baro sensor
+ 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 when designing an
+ installation in an air-frame with a see-through plastic payload bay. It
+ is particularly important to
+ consider this with TeleMini v1.0, 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.
+
+ 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.
+
+ As with all other rocketry electronics, Altus Metrum altimeters must
+ be protected from exposure to corrosive motor exhaust and ejection
+ charge gasses.
+
--- /dev/null
+== Installation
+
+ A typical installation involves attaching
+ only a suitable 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.
+ ifdef::telemini[TeleMini v2.0 and]
+ EasyMini may also be used with other
+ batteries as long as they supply between 4 and 12 volts.
+
+ The battery connectors are a standard 2-pin JST connector; you
+ can purchase suitable batteries from the any vendor selling
+ Altus Metrum products. These batteries are
+ single-cell Lithium Polymer batteries that nominally provide 3.7
+ volts. Other vendors sell similar batteries for RC aircraft
+ using mating connectors, however the polarity for those is
+ generally reversed from the batteries used by Altus Metrum
+ products. In particular, the Tenergy batteries supplied for use
+ in Featherweight flight computers are not compatible with Altus
+ Metrum flight computers or battery chargers.
+
+ [WARNING]
+ Check polarity and voltage before connecting any battery not
+ purchased from Altus Metrum.
+
+ [WARNING]
+ Spark Fun sells batteries that have a matching connector with
+ the correct polarity. However, these batteries include an
+ integrated current limiting circuit. That circuit will cause
+ the battery to shut down when firing the igniter circuit. Do
+ not use these batteries unless you remove the current limiting
+ circuit.
+
+ By default, we use the unregulated output of the 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
+ <<_using_a_separate_pyro_battery>> 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.
+
+ 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.
+ ifndef::telemini[]
+ The screw terminal block is also used for the power switch leads.
+ endif::telemini[]
+
+ ifdef::telemini[]
+ Except for TeleMini v1.0, the flight computers also use the
+ screw terminal block for the power switch leads. On TeleMini v1.0,
+ the power switch leads are soldered directly to the board and
+ can be connected directly to a switch.
+ endif::telemini[]
+
+ ifdef::radio[]
+ 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
+ replace the stock UHF antenna wire with an edge-launched SMA connector,
+ and, on TeleMetrum v1, you can unplug the integrated GPS
+ antenna and select an appropriate off-board GPS antenna with
+ cable terminating in a U.FL connector.
+ endif::radio[]
--- /dev/null
+== Introduction and Overview
+
+ 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!
+
+ 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. The latest version
+ of TeleMetrum, v2.0, has all of the same features but with
+ improved sensors and radio to offer increased performance.
+
+ Our second device was TeleMini, a dual deploy altimeter with
+ radio telemetry and radio direction finding. The first version
+ of this device was only 13mm by 38mm (½ inch by 1½ inches) and
+ could fit easily in an 18mm air-frame. The latest version, v2.0,
+ includes a beeper, USB data download and extended on-board
+ flight logging, along with an improved barometric sensor.
+
+ TeleMega is our most sophisticated device, including six pyro
+ channels (four of which are fully programmable), integrated GPS,
+ integrated gyroscopes for staging/air-start inhibit and high
+ performance telemetry.
+
+ EasyMini is a dual-deploy altimeter with logging and built-in
+ USB data download.
+
+ EasyMega is essentially a TeleMega board with the GPS receiver
+ and telemetry transmitter removed. It offers the same 6 pyro
+ channels and integrated gyroscopes for staging/air-start inhibit.
+
+ TeleDongle v0.2 was our first ground station, providing a USB to RF
+ interfaces 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. The latest version, TeleDongle
+ v3, has all new electronics with a higher performance radio
+ for improved range.
+
+ For a slightly more portable ground station experience that also
+ provides direct rocket recovery support, TeleBT offers flight
+ monitoring and data logging using a Bluetooth™ connection between
+ the receiver and an Android device that has the AltosDroid
+ application installed from the Google Play store.
+
+ 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.
--- /dev/null
+=== Load Maps
+
+ .Load Maps Window
+ image::load-maps.png[width="5.2in"]
+
+ 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.
+
+ 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 from our server at
+ run-time, so as new sites are sent in, they'll get
+ automatically added to this list. If the launch site
+ isn't in the list, you can manually enter the lat/lon
+ values
+
+ There are four different kinds of maps you can view;
+ you can select which to download by selecting as many
+ as you like from the available types:
+
+ Hybrid::
+ A combination of satellite imagery and road data. This
+ is the default view.
+
+ Satellite::
+ Just the satellite imagery without any annotation.
+
+ Roadmap::
+ Roads, political boundaries and a few geographic
+ features.
+
+ Terrain::
+ Contour intervals and shading that show hills and
+ valleys.
+
+ You can specify the range of zoom levels to download;
+ smaller numbers show more area with less
+ resolution. The default level, 0, shows about
+ 3m/pixel. One zoom level change doubles or halves that
+ number. Larger zoom levels show more detail, smaller
+ zoom levels less.
+
+ The Map Radius value sets how large an area around the
+ center point to download. Select a value large enough
+ to cover any plausible flight from that site. Be aware
+ that loading a large area with a high maximum zoom
+ level can attempt to download a lot of data. Loading
+ hybrid maps with a 10km radius at a minimum zoom of -2
+ and a maximum zoom of 2 consumes about 120MB of
+ space. Terrain and road maps consume about 1/10 as
+ much space as satellite or hybrid maps.
+
+ 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.
--- /dev/null
+#!/bin/sh
+cat << 'EOF'
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content=
+"text/html; charset=utf-8" />
+<title>Altus Metrum Documentation</title>
+<link rel="stylesheet" type="text/css" href="am.css" />
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1" />
+</head>
+<body>
+<h1>Altus Metrum Documentation</h1>
+EOF
+
+for i in "$@"; do
+ echo '<p>'
+ grep '<title>' $i | head -1 | sed -e 's/.*<title>//' -e 's;</title>.*;;'
+ pdf=`basename "$i" .html`.pdf
+ echo '<a href="'$i'">html</a>'
+ echo '<a href="'$pdf'">pdf</a>'
+ echo '</p>'
+done
+
+cat << 'EOF'
+</body>
+</html>
+EOF
--- /dev/null
+<subtitle>A recording altimeter for hobby rocketry</subtitle>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<copyright>
+ <year>2014</year>
+ <holder>Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="micropeak-dime.jpg" width="6in"/>
+ </imageobject>
+</mediaobject>
+<corpauthor>
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="micropeak-oneline.svg" width="3in"/>
+ </imageobject>
+ </inlinemediaobject>
+</corpauthor>
+<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>
+ <?dbhtml filename="micropeak-revhistory.html"?>
+ <revision>
+ <revnumber>1.3.2</revnumber>
+ <date>12 February 2014</date>
+ <revremark>
+ Add a "Download" button to the main window, which makes it
+ quicker to access the download function. Update the data
+ download documentation to reflect the new MicroPeak USB
+ adapter design. Monitor data during download to let you see
+ if the USB connection is working at all by showing the
+ characters received from the MicroPeak USB adapter.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.2</revnumber>
+ <date>20 January 2013</date>
+ <revremark>
+ Add documentation for the MicroPeak USB adapter board. Note
+ the switch to a Kalman filter for peak altitude
+ determination.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.1</revnumber>
+ <date>12 December 2012</date>
+ <revremark>
+ Add comments about EEPROM storage format and programming jig.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.0</revnumber>
+ <date>18 November 2012</date>
+ <revremark>
+ Updates for version 1.0 release.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>0.1</revnumber>
+ <date>29 October 2012</date>
+ <revremark>
+ Initial release with preliminary hardware.
+ </revremark>
+ </revision>
+</revhistory>
--- /dev/null
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="400"
+ height="54"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="micropeak-oneline-font.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient5343">
+ <stop
+ style="stop-color:#7200a4;stop-opacity:1;"
+ offset="0"
+ id="stop5345" />
+ <stop
+ style="stop-color:#da7000;stop-opacity:1;"
+ offset="1"
+ id="stop5347" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Send"
+ style="overflow:visible">
+ <path
+ id="path3798"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Send"
+ style="overflow:visible">
+ <path
+ id="path3780"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend"
+ style="overflow:visible">
+ <path
+ id="path3792"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3768"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible">
+ <path
+ id="path3786"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343"
+ id="linearGradient5349"
+ x1="255.48561"
+ y1="275.90405"
+ x2="280.61411"
+ y2="275.90405"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9246394,0,0,1.9246394,-223.70579,-247.62056)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8852983"
+ inkscape:cx="103.59377"
+ inkscape:cy="27.872251"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1582"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <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(-241.93841,-249.0196)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30.79423141px;line-height:125%;font-family:'Minion Pro';-inkscape-font-specification:'Minion Pro';letter-spacing:0px;word-spacing:0px;fill:#7200a4;fill-opacity:1;stroke:none"
+ x="237.36546"
+ y="300.57535"
+ id="text2985"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2989"
+ x="237.36546"
+ y="300.57535"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:69.28701782px;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#7200a4;fill-opacity:1">μ</tspan></text>
+ <path
+ style="fill:none;stroke:url(#linearGradient5349);stroke-width:5.58145428;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:none"
+ d="m 270.8026,311.8784 c 5.85134,-0.46986 8.28205,-5.13748 10.35972,-10.71262 3.23453,-8.67942 7.06755,-30.54218 16.59477,-39.56149 7.82712,-7.40985 15.82735,-6.67187 15.82735,-6.67187"
+ id="path2991"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssc" />
+ <path
+ sodipodi:type="star"
+ style="fill:none;stroke:#da7000;stroke-width:2.11710358;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path5341"
+ sodipodi:sides="5"
+ sodipodi:cx="313.82785"
+ sodipodi:cy="254.81477"
+ sodipodi:r1="13.956471"
+ sodipodi:r2="6.9782352"
+ sodipodi:arg1="1.0731354"
+ sodipodi:arg2="1.7014539"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 320.49027,267.07835 -7.57159,-5.34482 -8.69538,3.20724 2.74347,-8.85265 -5.73728,-7.27871 9.26715,-0.12642 5.14955,-7.70573 2.98393,8.77452 8.91988,2.51631 -7.42297,5.54937 z"
+ inkscape:transform-center-x="-0.56191834"
+ inkscape:transform-center-y="-0.78695059" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:70.16494751px;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#7200a4;fill-opacity:1;stroke:none"
+ x="331.6398"
+ y="300.51898"
+ id="text5351"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5353"
+ x="331.6398"
+ y="300.51898">MicroPeak</tspan></text>
+ </g>
+</svg>
--- /dev/null
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="444"
+ height="98"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="micropeak-oneline.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient5343">
+ <stop
+ style="stop-color:#7200a4;stop-opacity:1;"
+ offset="0"
+ id="stop5345" />
+ <stop
+ style="stop-color:#da7000;stop-opacity:1;"
+ offset="1"
+ id="stop5347" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Send"
+ style="overflow:visible">
+ <path
+ id="path3798"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Send"
+ style="overflow:visible">
+ <path
+ id="path3780"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend"
+ style="overflow:visible">
+ <path
+ id="path3792"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3768"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible">
+ <path
+ id="path3786"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343"
+ id="linearGradient5349"
+ x1="255.48561"
+ y1="275.90405"
+ x2="280.61411"
+ y2="275.90405"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9246394,0,0,1.9246394,-200.29778,-270.16721)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8852983"
+ inkscape:cx="243.9235"
+ inkscape:cy="27.872251"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1871"
+ inkscape:window-height="1383"
+ inkscape:window-x="119"
+ inkscape:window-y="125"
+ inkscape:window-maximized="0"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <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(-241.93841,-205.0196)">
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30.79423141px;line-height:125%;font-family:'Minion Pro';-inkscape-font-specification:'Minion Pro';letter-spacing:0px;word-spacing:0px;fill:#7200a4;fill-opacity:1;stroke:none"
+ id="text2985"
+ transform="translate(23.408014,-22.546654)" />
+ <path
+ style="fill:none;stroke:url(#linearGradient5349);stroke-width:5.58145428;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:none"
+ d="m 294.21061,289.33175 c 5.85134,-0.46986 8.28205,-5.13748 10.35972,-10.71262 3.23453,-8.67942 7.06755,-30.54218 16.59477,-39.56149 7.82712,-7.40985 15.82735,-6.67187 15.82735,-6.67187"
+ id="path2991"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssc" />
+ <path
+ sodipodi:type="star"
+ style="fill:none;stroke:#da7000;stroke-width:2.11710358;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path5341"
+ sodipodi:sides="5"
+ sodipodi:cx="337.23586"
+ sodipodi:cy="232.26813"
+ sodipodi:r1="13.956471"
+ sodipodi:r2="6.9782352"
+ sodipodi:arg1="1.0731354"
+ sodipodi:arg2="1.7014539"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 343.89829,244.5317 -7.57159,-5.34482 -8.69538,3.20724 2.74347,-8.85265 -5.73728,-7.27871 9.26715,-0.12642 5.14955,-7.70573 2.98393,8.77452 8.91988,2.51631 -7.42297,5.54937 z"
+ inkscape:transform-center-x="-0.56191834"
+ inkscape:transform-center-y="-0.78695059" />
+ <g
+ id="g4212"
+ style="fill:#78079a;fill-opacity:1">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4233"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:69.28701782px;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';letter-spacing:0px;word-spacing:0px;fill:#78079a;fill-opacity:1;stroke:none;text-align:start;writing-mode:lr-tb;text-anchor:start"
+ d="m 271.3161,268.77261 c 0,-2.07861 -0.76216,-3.60293 -3.04863,-3.60293 -2.28647,0 -3.04863,1.52432 -3.04863,3.60293 l 0,16.69817 c 0,5.54296 -3.94936,9.83875 -9.28446,9.83875 -5.88939,0 -7.89872,-3.60292 -7.89872,-9.76946 l 0,-16.76746 c 0,-2.07861 -0.76215,-3.60293 -3.04862,-3.60293 -2.28648,0 -3.04863,1.52432 -3.04863,3.60293 l 0,42.19579 c 0,2.07861 0.76215,3.60293 3.04863,3.60293 2.28647,0 3.04862,-1.52432 3.04862,-3.60293 l 0,-11.84808 c 1.52432,1.17788 4.01865,1.87075 6.85942,1.87075 4.43437,0 8.5223,-1.52431 10.87806,-5.75082 l 0.13857,0.13857 0,2.42505 c 0,1.66289 1.03931,2.77148 2.7022,2.77148 1.66289,0 2.70219,-1.10859 2.70219,-2.77148 l 0,-29.03126 z"
+ transform="translate(23.40801,-22.54665)" />
+ <g
+ style="fill:#78079a;fill-opacity:1"
+ id="g4200">
+ <path
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ id="path4236"
+ d="m 380.37736,256.92285 c 4.28006,0 10.5949,-13.68217 12.13853,-17.05008 l 0.14033,0 c 2.10495,11.50705 2.38561,23.15443 2.38561,34.02999 0,2.73644 0.77182,4.28007 3.08726,4.28007 2.10495,0 3.08726,-1.68396 3.08726,-4.28007 0,-9.54243 -1.82429,-30.31125 -3.71875,-38.94154 -0.49115,-2.38561 -1.75412,-5.47287 -4.06956,-5.47287 -3.92924,0 -5.54303,9.19161 -13.05068,19.71635 -7.50765,-10.52474 -9.12145,-19.71635 -13.05068,-19.71635 -2.31545,0 -3.57842,3.08726 -4.06957,5.47287 -1.89445,8.63029 -3.71874,29.39911 -3.71874,38.94154 0,2.59611 0.98231,4.28007 3.08726,4.28007 2.31544,0 3.08725,-1.54363 3.08725,-4.28007 0,-10.87556 0.28066,-22.52294 2.31545,-34.02999 l 0.14033,0 c 1.61379,3.36791 7.92864,17.05008 12.2087,17.05008 z" />
+ <path
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ id="path4238"
+ d="m 416.62852,245.76662 c 0,-2.10495 -0.77182,-3.64858 -3.08726,-3.64858 -2.31544,0 -3.08726,1.54363 -3.08726,3.64858 l 0,28.76763 c 0,2.10495 0.77182,3.64858 3.08726,3.64858 2.31544,0 3.08726,-1.54363 3.08726,-3.64858 l 0,-28.76763 z m -3.08726,-15.64678 c -2.24528,0 -3.29775,1.96462 -3.29775,4.06956 0,2.10495 1.05247,4.06957 3.29775,4.06957 2.24528,0 3.29775,-1.96462 3.29775,-4.06957 0,-2.10494 -1.05247,-4.06956 -3.29775,-4.06956 z" />
+ <path
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ id="path4240"
+ d="m 446.07368,272.21881 c -8.56013,0 -15.36613,-5.33254 -15.36613,-14.73464 0,-6.52534 3.57842,-9.8231 12.27887,-9.8231 l 7.9988,0 c 1.89446,0 3.15743,-0.84197 3.15743,-2.66626 0,-1.82429 -1.26297,-2.66627 -3.15743,-2.66627 l -11.92804,0 c -9.19161,0 -14.94513,6.45517 -14.94513,14.94513 0,12.77002 10.59491,20.69866 20.13734,20.69866 l 8.34963,0 c 1.96462,0 3.36791,-0.91214 3.36791,-2.87676 0,-1.96462 -1.40329,-2.87676 -3.36791,-2.87676 l -6.52534,0 z" />
+ <path
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ id="path4242"
+ d="m 461.22931,274.53425 c 0,2.10495 0.77181,3.64858 3.08725,3.64858 2.31545,0 3.08726,-1.54363 3.08726,-3.64858 l 0,-18.59371 c 0,-5.47287 4.35023,-8.27947 9.47227,-8.27947 2.24528,0 3.15742,-1.05247 3.15742,-3.01709 0,-2.03478 -1.33313,-2.73643 -3.64858,-2.73643 -4.49055,0 -7.50764,1.68396 -8.84078,6.10435 l -0.14033,0 0,-2.03478 c 0,-2.10495 -0.77181,-3.64858 -3.08726,-3.64858 -2.31544,0 -3.08725,1.54363 -3.08725,3.64858 l 0,28.55713 z" />
+ <path
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ id="path4244"
+ d="m 498.09441,273.06079 c -6.38501,0 -10.66507,-6.10435 -10.66507,-12.91035 0,-6.806 4.28006,-12.91036 10.66507,-12.91036 6.45518,0 10.73524,6.10436 10.73524,12.91036 0,6.806 -4.28006,12.91035 -10.73524,12.91035 z m 0,5.33253 c 9.54243,0 16.90975,-7.92864 16.90975,-18.31305 0,-9.68276 -7.36732,-18.17272 -16.90975,-18.17272 -9.54243,0 -16.83959,8.48996 -16.83959,18.17272 0,10.38441 7.29716,18.31305 16.83959,18.31305 z" />
+ <path
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ id="path4246"
+ d="m 529.43293,256.78252 c 8.63029,-3.08726 27.15383,-6.45518 27.15383,-18.73404 0,-5.6132 -4.49055,-8.34963 -10.03358,-8.34963 l -20.418,0 c -2.17512,0 -2.87677,1.4033 -2.87677,3.36792 l 0,41.46748 c 0,2.17511 0.98231,3.64858 3.08726,3.64858 2.10495,0 3.08726,-1.47347 3.08726,-3.64858 l 0,-17.75173 z m 15.99761,-21.33015 c 2.45577,0 4.28006,0.84198 4.28006,3.57842 0,6.31484 -13.19101,8.48995 -20.27767,11.43688 l 0,-15.0153 15.99761,0 z" />
+ <path
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ id="path4248"
+ d="m 566.52497,255.80021 c 0.91214,-4.49056 4.13973,-8.56013 10.87556,-8.56013 5.68336,0 9.26178,3.64858 9.54244,8.56013 l -20.418,0 z m 23.15443,4.77121 c 3.36792,0 3.43808,-0.77181 3.43808,-3.71874 0,-8.84078 -6.94633,-14.94513 -15.64678,-14.94513 -10.45458,0 -17.8219,7.15682 -17.8219,17.68157 0,12.34903 7.78831,18.38321 17.05008,18.38321 l 13.47167,0 c 1.89446,0 3.15743,-0.84198 3.15743,-2.66627 0,-1.82428 -1.26297,-2.66626 -3.15743,-2.66626 l -13.33134,0 c -5.75352,0 -11.08606,-3.92924 -10.5949,-12.06838 l 23.43509,0 z" />
+ <path
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ id="path4250"
+ d="m 620.52676,265.34264 c 0,6.10435 -3.43809,8.27947 -9.26178,8.27947 -5.26237,0 -8.27946,-1.89446 -8.27946,-6.10436 0,-6.5955 9.47227,-8.56012 17.54124,-8.56012 l 0,6.38501 z m -5.68336,-17.26058 c 4.28006,0 5.68336,0.98231 5.68336,3.99941 l 0,2.10494 c -9.05128,0.56132 -23.71576,1.4033 -23.71576,13.612 0,6.66567 5.68336,10.59491 13.47167,10.59491 4.77122,0 7.0165,-1.26297 10.66508,-3.9994 0,2.24528 0.91214,3.57841 2.87676,3.57841 1.96462,0 2.87676,-1.33313 2.87676,-3.57841 l 0,-19.43569 c 0,-6.24468 -1.68396,-12.62969 -10.94573,-12.62969 l -12.98052,0 c -2.03478,0 -3.36791,0.91214 -3.36791,2.87676 0,1.96462 1.33313,2.87676 3.36791,2.87676 l 12.06838,0 z" />
+ <path
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ id="path4252"
+ d="m 635.47191,274.53425 c 0,2.10495 0.77181,3.64858 3.08725,3.64858 2.31545,0 3.08726,-1.54363 3.08726,-3.64858 l 0,-17.19041 c 11.71755,1.61379 15.50645,5.33253 17.19041,17.26057 0.28066,1.96462 0.56132,3.57842 3.0171,3.57842 2.03478,0 3.15742,-1.05248 3.15742,-3.29776 0,-7.9988 -4.13973,-17.19041 -12.27887,-19.64618 l 0,-0.14033 c 3.92924,-1.33313 9.6126,-5.89386 9.6126,-10.45458 0,-1.54363 -1.05247,-2.8066 -2.24528,-2.8066 -2.31544,0 -2.8066,1.6138 -5.05187,4.77122 -2.52594,3.71874 -7.29716,6.24468 -11.92805,6.24468 l -1.47346,0 0,-19.71635 c 0,-2.10495 -0.77181,-3.64858 -3.08726,-3.64858 -2.31544,0 -3.08725,1.54363 -3.08725,3.64858 l 0,41.39732 z" />
+ </g>
+ </g>
+ </g>
+</svg>
--- /dev/null
+= MicroPeak Owner's Manual
+:doctype: book
+:numbered:
+
+[dedication]
+== Acknowledgements
+
+ Thanks to John Lyngdal for suggesting that we build something
+ like this.
+
+ Have fun using these products, and we hope to meet all of you
+ out on the rocket flight line somewhere.
+
+ [verse]
+ Bdale Garbee, KB0G
+ NAR #87103, TRA #12201
+
+ [verse]
+ Keith Packard, KD7SQG
+ NAR #88757, TRA #12200
+
+== Using MicroPeak
+
+ MicroPeak is designed to be easy to use. Requiring no external
+ components, flying takes just a few steps
+
+ Install the battery::
+
+ Fit a CR1025 battery into the plastic carrier. The positive
+ (\+) terminal should be towards the more open side of the
+ carrier. Slip the carrier into the battery holder with the
+ positive (+) terminal facing away from the circuit board.
+
+ .MicroPeak and Battery
+ image::micropeak-back.jpg[width="4.5in"]
+
+ Install MicroPeak in your rocket::
+
+ This can be as simple as preparing a soft cushion of wadding
+ inside a vented model payload bay. Wherever you mount it,
+ make sure you protect the barometric sensor from corrosive
+ ejection gasses as those will damage the sensor, and shield
+ it from light as that can cause incorrect sensor readings.
+
+ Turn MicroPeak on::
+
+ Slide the switch so that the actuator covers the '1' printed
+ on the board. MicroPeak will report the maximum height of
+ the last flight in decimeters using a sequence of flashes on
+ the LED. A sequence of short flashes indicates one digit. A
+ single long flash indicates zero. The height is reported in
+ decimeters, so the last digit will be tenths of a meter. For
+ example, if MicroPeak reports 5 4 4 3, then the maximum
+ height of the last flight was 544.3m, or 1786 feet.
+
+ Finish preparing the rocket for flight::
+
+ After the previous flight data have been reported, MicroPeak
+ waits for one minute before starting to check for
+ launch. This gives you time to finish assembling the
+ rocket. As those activities might cause pressure changes
+ inside the airframe, MicroPeak might accidentally detect
+ boost. If you need to do anything to the airframe after the
+ one minute window passes, make sure to be careful not to
+ disturb the altimeter. The LED will remain dark during the
+ one minute delay, but after that, it will start blinking
+ once every 3 seconds.
+
+ Fly the rocket::
+
+ Once the rocket passes about 30m in height (100 feet), the
+ micro-controller will record the ground pressure and track
+ the pressure seen during the flight. In this mode, the LED
+ flickers rapidly. When the rocket lands, and the pressure
+ stabilizes, the micro-controller will record the minimum
+ pressure pressure experienced during the flight, compute the
+ height represented by the difference in air pressure and
+ blink that value out on the LED. After that, MicroPeak
+ powers down to conserve battery power.
+
+ Recover the data::
+
+ Turn MicroPeak off and then back on. MicroPeak will blink
+ out the maximum height for the last flight. Turn MicroPeak
+ back off to conserve battery power.
+
+== The MicroPeak USB adapter
+
+ .MicroPeak USB Adapter
+ image::MicroPeakUSB-2.0.jpg[width="4.5in",align="center"]
+
+ MicroPeak stores barometric pressure information for the first
+ 48 seconds of the flight in on-board non-volatile memory. The
+ contents of this memory can be downloaded to a computer using
+ the MicroPeak USB adapter.
+
+ === Installing the MicroPeak software
+
+ The MicroPeak application runs on Linux, Mac OS X and
+ Windows. You can download the latest version from
+ http://altusmetrum.org/MicroPeak
+
+ On Mac OS X and Windows, the FTDI USB device driver
+ needs to be installed. A compatible version of this
+ driver is included with the MicroPeak application, but
+ you may want to download a newer version from
+ http://www.ftdichip.com/FTDrivers.htm
+
+ === Downloading Micro Peak data
+
+ * Plug the MicroPeak USB adapter in to your computer.
+
+ * Start the MicroPeak application.
+
+ image::micropeak-nofont.svg[width="0.5in",align="center"]
+
+ * Click on the Download button at the top of the
+ window.
+
+ .MicroPeak Application
+ image::micropeak-app.png[width="4.5in",align="center"]
+
+ * Select from the listed devices. There will probably
+ be only one.
+
+ .MicroPeak Device Dialog
+ image::micropeak-device-dialog.png[width="2.3in",align="center"]
+
+ * The application will now wait until it receives
+ valid data from the MicroPeak USB adapter.
+
+ .MicroPeak Download Dialog
+ image::micropeak-download.png[width="2in",align="center"]
+
+ * The MicroPeak USB adapter has a small
+ phototransistor under the hole in the center of the
+ box. Locate this, turn on the MicroPeak and place
+ the orange LED on the MicroPeak directly inside the
+ hole, resting the MicroPeak itself on the box. You
+ should see the blue LED on the MicroPeak USB adapter
+ blinking in time with the orange LED on the
+ MicroPeak board itself.
+
+ .MicroPeak Downloading
+ image::MicroPeakUSB-2.0-inuse.jpg[width="4.5in",align="center"]
+
+ * After the maximum flight height is reported,
+ MicroPeak will pause for a few seconds, blink the
+ LED four times rapidly and then send the data in one
+ long blur on the LED. The MicroPeak application
+ should receive the data. When it does, it will
+ present the data in a graph and offer to save the
+ data to a file. If not, you can power cycle the
+ MicroPeak board and try again.
+
+ .MicroPeak Save Dialog
+ image::micropeak-save-dialog.png[width="2.3in",align="center"]
+
+ * Once the data are saved, a graph will be displayed
+ with height, speed and acceleration values computed
+ from the recorded barometric pressure data. See
+ <<_analyzing_micropeak_data> for more details on that.
+
+ === Analyzing MicroPeak Data
+
+ The MicroPeak application can present flight data in
+ the form of a graph, a collection of computed
+ statistics or in tabular form.
+
+ MicroPeak collects raw barometric pressure data which
+ is then used to compute the remaining data. Altitude
+ is computed through a standard atmospheric
+ model. Absolute error in this data will be affected by
+ local atmospheric conditions. Fortunately, these
+ errors tend to mostly cancel out, so the error in the
+ height computation is much smaller than the error in
+ altitude would be.
+
+ Speed and acceleration are computed by first smoothing
+ the height data with a Gaussian window averaging
+ filter. For speed data, this average uses seven
+ samples. For acceleration data, eleven samples are
+ used. These were chosen to provide reasonably smooth
+ speed and acceleration data, which would otherwise be
+ swamped with noise.
+
+ The File menu has operations to open existing flight
+ logs, Download new data from MicroPeak, Save a copy of
+ the flight log to a new file, Export the tabular data
+ (as seen in the Raw Data tab) to a file, change the
+ application Preferences, Close the current window or
+ close all windows and Exit the application.
+
+ ==== MicroPeak Graphs
+
+ .MicroPeak Graph
+ image::micropeak-graph.png[width="4.5in",align="center"]
+
+ Under the Graph tab, the height, speed and acceleration values
+ are displayed together. You can zoom in on the graph by
+ clicking and dragging to sweep out an area of
+ interest. Right-click on the plot to bring up a menu that will
+ let you save, copy or print the graph.
+
+ ==== MicroPeak Flight Statistics
+
+ .MicroPeak Flight Statistics
+ image::micropeak-statistics.png[width="4.5in",align="center"]
+
+ The Statistics tab presents overall data from
+ the flight. Note that the Maximum height value
+ is taken from the minumum pressure captured in
+ flight, and may be different from the apparant
+ apogee value as the on-board data are sampled
+ twice as fast as the recorded values, or
+ because the true apogee occurred after the
+ on-board memory was full. Each value is
+ presented in several units as appropriate.
+
+ ==== Raw Flight Data
+
+ .MicroPeak Raw Flight Data
+ image::micropeak-raw-data.png[width="4.5in",align="center"]
+
+ A table consisting of the both the raw barometric pressure
+ data and values computed from that for each recorded time.
+
+ ==== Configuring the Graph
+
+ .MicroPeak Graph Configuration
+ image::micropeak-graph-configure.png[width="4.5in",align="center"]
+
+ This selects which graph elements to show, and lets you
+ switch between metric and imperial units
+
+ === Setting MicroPeak Preferences
+
+ .MicroPeak Preferences
+ image::micropeak-preferences.png[width="1.8in",align="center"]
+
+ The MicroPeak application has a few user settings which are
+ configured through the Preferences dialog, which can be
+ accessed from the File menu.
+
+ Log Directory::
+
+ The Log Directory is where flight data will be
+ saved to and loaded from by default. Of
+ course, you can always navigate to other
+ directories in the file chooser windows, this
+ setting is just the starting point.
+
+ Imperial Units::
+
+ If you prefer to see your graph data in feet
+ and miles per hour instead of meters and
+ meters per second, you can select Imperial
+ Units.
+
+ Serial Debug::
+
+ To see what data is actually arriving over the
+ serial port, start the MicroPeak application
+ from a command prompt and select the Serial
+ Debug option. This can be useful in debugging
+ serial communication problems, but most people
+ need never choose this.
+
+ Font Size::
+
+ You can adjust the size of the text in the
+ Statistics tab by changing the Font size
+ preference. There are three settings, with
+ luck one will both fit on your screen and
+ provide readable values.
+
+ Look & Feel::
+
+ The Look & feel menu shows a list of available
+ application appearance choices. By default,
+ the MicroPeak application tries to blend in
+ with other applications, but you may choose
+ some other appearance if you like.
+
+ Note that MicroPeak shares a subset of the
+ AltosUI preferences, so if you use both of
+ these applications, change in one application
+ will affect the other.
+
+[appendix]
+== Handling Precautions
+
+ 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.
+
+ [WARNING]
+
+ The CR1025 Lithium batteries have an extraordinary power
+ density. This is great because we can fly with much less
+ battery mass... but if they are punctured or their contacts
+ are allowed to short, they can and will release their energy
+ very rapidly! Thus we recommend that you take some care when
+ handling MicroPeak to keep conductive material from coming in
+ contact with the exposed metal elements.
+
+ The barometric sensor used in MicroPeak is sensitive to
+ sunlight. Please consider this when designing an
+ installation. 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.
+
+ The barometric sensor sampling ports 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.
+
+ As with all other rocketry electronics, Altus Metrum
+ altimeters must be protected from exposure to corrosive motor
+ exhaust and ejection charge gasses.
+
+[appendix]
+== Technical Information
+
+ === Barometric Sensor
+
+ MicroPeak uses the Measurement Specialties MS5607
+ sensor. This has a range of 120kPa to 1kPa with an
+ absolute accuracy of 150Pa and a resolution of 2.4Pa.
+
+ The pressure range corresponds roughly to an altitude
+ range of -1500m (-4900 feet) to 31000m (102000 feet),
+ while the resolution is approximately 20cm (8 inches)
+ near sea level and 60cm (24in) at 10000m (33000 feet).
+
+ Ground pressure is computed from an average of 16
+ samples, taken while the altimeter is at rest. The
+ flight pressure used to report maximum height is
+ computed from a Kalman filter designed to smooth out
+ any minor noise in the sensor values. The flight
+ pressure recorded to non-volatile storage is
+ unfiltered, coming directly from the pressure sensor.
+
+ === Micro-controller
+
+ MicroPeak uses an Atmel ATtiny85
+ micro-controller. This tiny CPU contains 8kB of flash
+ for the application, 512B of RAM for temporary data
+ storage and 512B of EEPROM for non-volatile storage of
+ previous flight data.
+
+ The ATtiny85 has a low-power mode which turns off all
+ of the clocks and powers down most of the internal
+ components. In this mode, the chip consumes only .1μA
+ of power. MicroPeak uses this mode once the flight has
+ ended to preserve battery power.
+
+ === Lithium Battery
+
+ The CR1025 battery used by MicroPeak holds 30mAh of
+ power, which is sufficient to run for over 40
+ hours. Because MicroPeak powers down on landing, run
+ time includes only time sitting on the launch pad or
+ during flight.
+
+ The large positive terminal (+) is usually marked,
+ while the smaller negative terminal is not. Make sure
+ you install the battery with the positive terminal
+ facing away from the circuit board where it will be in
+ contact with the metal battery holder. A small pad on
+ the circuit board makes contact with the negative
+ battery terminal.
+
+ Shipping restrictions may prevent us from including a
+ CR1025 battery with MicroPeak. If so, many stores
+ carry CR1025 batteries as they are commonly used in
+ small electronic devices such as flash lights.
+
+ === Atmospheric Model
+
+ MicroPeak contains a fixed atmospheric model which is
+ used to convert barometric pressure into altitude. The
+ model was converted into a 469-element piece-wise
+ linear approximation which is then used to compute the
+ altitude of the ground and apogee. The difference
+ between these represents the maximum height of the
+ flight.
+
+ The model assumes a particular set of atmospheric
+ conditions, which, while a reasonable average, cannot
+ represent the changing nature of the real
+ atmosphere. Fortunately, for flights reasonably close
+ to the ground, the effect of this global inaccuracy
+ are largely canceled out when the computed ground
+ altitude is subtracted from the computed apogee
+ altitude, so the resulting height is more accurate
+ than either the ground or apogee altitudes.
+
+ Because the raw pressure data is recorded to
+ non-volatile storage, you can use that, along with a
+ more sophisticated atmospheric model, to compute your
+ own altitude values.
+
+ === Mechanical Considerations
+
+ MicroPeak is designed to be rugged enough for typical
+ rocketry applications. It contains two moving parts,
+ the battery holder and the power switch, which were
+ selected for their ruggedness.
+
+ The MicroPeak battery holder is designed to withstand
+ impact up to 150g without breaking contact (or, worse
+ yet, causing the battery to fall out). That means it
+ should stand up to almost any launch you care to try,
+ and should withstand fairly rough landings.
+
+ The power switch is designed to withstand up to 50g
+ forces in any direction. Because it is a sliding
+ switch, orienting the switch perpendicular to the
+ direction of rocket travel will serve to further
+ protect the switch from launch forces.
+
+ === MicroPeak Programming Interface
+
+ MicroPeak exposes a standard 6-pin AVR programming
+ interface, but not using the usual 2x3 array of pins
+ on 0.1" centers. Instead, there is a single row of
+ tiny 0.60mm × 0.85mm pads on 1.20mm centers exposed
+ near the edge of the circuit board. We couldn't find
+ any connector that was small enough to include on the
+ circuit board.
+
+ In lieu of an actual connector, the easiest way to
+ connect to the bare pads is through a set of Pogo
+ pins. These spring-loaded contacts are designed to
+ connect in precisely this way. We've designed a
+ programming jig, the MicroPeak Pogo Pin board which
+ provides a standard AVR interface on one end and a
+ recessed slot for MicroPeak to align the board with
+ the Pogo Pins.
+
+ The MicroPeak Pogo Pin board is not a complete AVR
+ programmer, it is an interface board that provides a
+ 3.3V regulated power supply to run the MicroPeak via
+ USB and a standard 6-pin AVR programming interface
+ with the usual 2x3 grid of pins on 0.1" centers. This
+ can be connected to any AVR programming dongle.
+
+ The AVR programming interface cannot run faster than ¼
+ of the AVR CPU clock frequency. Because MicroPeak runs
+ at 250kHz to save power, you must configure your AVR
+ programming system to clock the AVR programming
+ interface at no faster than 62.5kHz, or a clock period
+ of 32µS.
+
+[appendix]
+== On-board data storage
+
+ The ATtiny85 has 512 bytes of non-volatile storage, separate
+ from the code storage memory. The MicroPeak firmware uses this
+ to store information about the last completed
+ flight. Barometric measurements from the ground before launch
+ and at apogee are stored, and used at power-on to compute the
+ height of the last flight.
+
+ In addition to the data used to present the height of the last
+ flight, MicroPeak also stores barometric information sampled
+ at regular intervals during the flight. This is the
+ information captured with the MicroPeak USB adapter. It can
+ also be read from MicroPeak through any AVR programming tool.
+
+
+ .MicroPeak EEPROM Data Storage
+ [options="border",cols="2,1,7"]
+ |====
+ |Address |Size (bytes) |Description
+ |0x000 |4 |Average ground pressure (Pa)
+ |0x004 |4 |Minimum flight pressure (Pa)
+ |0x008 |2 |Number of in-flight samples
+ |0x00a … 0x1fe |2 |Instantaneous flight pressure (Pa) low 16 bits
+ |====
+
+ All EEPROM data are stored least-significant byte first. The
+ instantaneous flight pressure data are stored without the
+ upper 16 bits of data. The upper bits can be reconstructed
+ from the previous sample, assuming that pressure doesn't
+ change by more more than 32kPa in a single sample
+ interval. Note that this pressure data is *not* filtered in
+ any way, while both the recorded ground and apogee pressure
+ values are, so you shouldn't expect the minimum instantaneous
+ pressure value to match the recorded minimum pressure value
+ exactly.
+
+ MicroPeak samples pressure every 96ms, but stores only every
+ other sample in the EEPROM. This provides for 251 pressure
+ samples at 192ms intervals, or 48.192s of storage. The clock
+ used for these samples is a factory calibrated RC circuit
+ built into the ATtiny85 and is accurate only to within ±10% at
+ 25°C. So, you can count on the pressure data being accurate,
+ but speed or acceleration data computed from this will be
+ limited by the accuracy of this clock.
+++ /dev/null
-<?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>MicroPeak Owner's Manual</title>
- <subtitle>A recording altimeter for hobby rocketry</subtitle>
- <bookinfo>
- <author>
- <firstname>Keith</firstname>
- <surname>Packard</surname>
- </author>
- <copyright>
- <year>2014</year>
- <holder>Bdale Garbee and Keith Packard</holder>
- </copyright>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-dime.jpg" width="6in"/>
- </imageobject>
- </mediaobject>
- <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>29 October 2012</date>
- <revremark>
- Initial release with preliminary hardware.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.0</revnumber>
- <date>18 November 2012</date>
- <revremark>
- Updates for version 1.0 release.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.1</revnumber>
- <date>12 December 2012</date>
- <revremark>
- Add comments about EEPROM storage format and programming jig.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.2</revnumber>
- <date>20 January 2013</date>
- <revremark>
- Add documentation for the MicroPeak USB adapter board. Note
- the switch to a Kalman filter for peak altitude
- determination.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.3.2</revnumber>
- <date>12 February 2014</date>
- <revremark>
- Add a "Download" button to the main window, which makes it
- quicker to access the download function. Update the data
- download documentation to reflect the new MicroPeak USB
- adapter design. Monitor data during download to let you see
- if the USB connection is working at all by showing the
- characters received from the MicroPeak USB adapter.
- </revremark>
- </revision>
- </revhistory>
- </bookinfo>
- <dedication>
- <title>Acknowledgements</title>
- <para>
- Thanks to John Lyngdal for suggesting that we build something like this.
- </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>
- </dedication>
- <chapter>
- <title>Quick Start Guide</title>
- <para>
- MicroPeak is designed to be easy to use. Requiring no external
- components, flying takes just a few steps
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Install the battery. Fit a CR1025 battery into the plastic
- carrier. The positive (+) terminal should be towards the more
- open side of the carrier. Slip the carrier into the battery
- holder with the positive (+) terminal facing away from the
- circuit board.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-back.jpg" width="4.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </listitem>
- <listitem>
- <para>
- Install MicroPeak in your rocket. This can be as simple as
- preparing a soft cushion of wadding inside a vented model payload
- bay. Wherever you mount it, make sure you protect the
- barometric sensor from corrosive ejection gasses as those
- will damage the sensor, and shield it from light as that can
- cause incorrect sensor readings.
- </para>
- </listitem>
- <listitem>
- <para>
- Turn MicroPeak on. Slide the switch so that the actuator
- covers the '1' printed on the board. MicroPeak will report
- the maximum height of the last flight in decimeters using a
- sequence of flashes on the LED. A sequence of short flashes
- indicates one digit. A single long flash indicates zero. The
- height is reported in decimeters, so the last digit will be
- tenths of a meter. For example, if MicroPeak reports 5 4 4
- 3, then the maximum height of the last flight was 544.3m, or
- 1786 feet.
- </para>
- </listitem>
- <listitem>
- <para>
- Finish preparing the rocket for flight. After the
- previous flight data have been reported, MicroPeak waits for
- one minute before starting to check for launch. This gives
- you time to finish assembling the rocket. As those
- activities might cause pressure changes inside the airframe,
- MicroPeak might accidentally detect boost. If you need to do
- anything to the airframe after the one minute window passes,
- make sure to be careful not to disturb the altimeter. The
- LED will remain dark during the one minute delay, but after
- that, it will start blinking once every 3 seconds.
- </para>
- </listitem>
- <listitem>
- <para>
- Fly the rocket. Once the rocket passes about 30m in height
- (100 feet), the micro-controller will record the ground
- pressure and track the pressure seen during the flight. In
- this mode, the LED flickers rapidly. When the rocket lands,
- and the pressure stabilizes, the micro-controller will record
- the minimum pressure pressure experienced during the flight,
- compute the height represented by the difference in air
- pressure and blink that value out on the LED. After that,
- MicroPeak powers down to conserve battery power.
- </para>
- </listitem>
- <listitem>
- <para>
- Recover the data. Turn MicroPeak off and then back on. MicroPeak
- will blink out the maximum height for the last flight. Turn
- MicroPeak back off to conserve battery power.
- </para>
- </listitem>
- </itemizedlist>
- </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 CR1025 Lithium batteries have an
- extraordinary power density. This is great because we can fly with
- much less battery mass... but if they are punctured
- or their contacts are allowed to short, they can and will release their
- energy very rapidly!
- Thus we recommend that you take some care when handling MicroPeak
- to keep conductive material from coming in contact with the exposed metal elements.
- </para>
- <para>
- The barometric sensor used in MicroPeak is sensitive to
- sunlight. Please consider this when designing an
- installation. 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 ports 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>The MicroPeak USB adapter</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="MicroPeakUSB-2.0.jpg" width="4.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- MicroPeak stores barometric pressure information for the first
- 48 seconds of the flight in on-board non-volatile memory. The
- contents of this memory can be downloaded to a computer using
- the MicroPeak USB adapter.
- </para>
- <section>
- <title>Installing the MicroPeak software</title>
- <para>
- The MicroPeak application runs on Linux, Mac OS X and
- Windows. You can download the latest version from
- <ulink url="http://altusmetrum.org/AltOS"/>.
- </para>
- <para>
- On Mac OS X and Windows, the FTDI USB device driver needs to
- be installed. A compatible version of this driver is included
- with the MicroPeak application, but you may want to download a
- newer version from <ulink
- url="http://www.ftdichip.com/FTDrivers.htm"/>.
- </para>
- </section>
- <section>
- <title>Downloading Micro Peak data</title>
- <itemizedlist>
- <listitem>
- <para>
- Plug the MicroPeak USB adapter in to your computer.
- </para>
- </listitem>
- <listitem>
- <?dbfo keep-together="always"?>
- <para>
- Start the MicroPeak application.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-nofont.svg" width="0.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </listitem>
- <listitem>
- <?dbfo keep-together="always"?>
- <para>
- Click on the Download button at the top of the window.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-app.png" width="4.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </listitem>
- <listitem>
- <?dbfo keep-together="always"?>
- <para>
- Select from the listed devices. There will probably be
- only one.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-device-dialog.png" width="2.3in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </listitem>
- <listitem>
- <para>
- The application will now wait until it receives valid data
- from the MicroPeak USB adapter.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-download.png" width="2in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- The MicroPeak USB adapter has a small phototransistor
- under the hole in the center of the box.
- Locate this, turn on the MicroPeak and place the orange LED on the MicroPeak
- directly inside the hole, resting the MicroPeak itself on
- the box. You should see the blue LED on the MicroPeak USB
- adapter blinking in time with the orange LED on the
- MicroPeak board itself.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="MicroPeakUSB-2.0-inuse.jpg" width="4.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </listitem>
- <listitem>
- <?dbfo keep-together="always"?>
- <para>
- After the maximum flight height is reported, MicroPeak will
- pause for a few seconds, blink the LED four times rapidly
- and then send the data in one long blur on the LED. The
- MicroPeak application should receive the data. When it does,
- it will present the data in a graph and offer to save the
- data to a file. If not, you can power cycle the MicroPeak
- board and try again.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-save-dialog.png" width="2.3in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </listitem>
- <listitem>
- <?dbfo keep-together="always"?>
- <para>
- Once the data are saved, a graph will be displayed with
- height, speed and acceleration values computed from the
- recorded barometric pressure data. See the next section
- for more details on that.
- </para>
- </listitem>
- </itemizedlist>
- </section>
- <section>
- <title>Analyzing MicroPeak Data</title>
- <para>
- The MicroPeak application can present flight data in the form
- of a graph, a collection of computed statistics or in tabular
- form.
- </para>
- <para>
- MicroPeak collects raw barometric pressure data which is
- then used to compute the remaining data. Altitude is computed
- through a standard atmospheric model. Absolute error in this
- data will be affected by local atmospheric
- conditions. Fortunately, these errors tend to mostly cancel
- out, so the error in the height computation is much smaller
- than the error in altitude would be.
- </para>
- <para>
- Speed and acceleration are computed by first smoothing the
- height data with a Gaussian window averaging filter. For speed
- data, this average uses seven samples. For acceleration data,
- eleven samples are used. These were chosen to provide
- reasonably smooth speed and acceleration data, which would
- otherwise be swamped with noise.
- </para>
- <para>
- The File menu has operations to open existing flight logs,
- Download new data from MicroPeak, Save a copy of the flight
- log to a new file, Export the tabular data (as seen in the Raw
- Data tab) to a file, change the application Preferences, Close
- the current window or close all windows and Exit the
- application.
- </para>
- <section>
- <title>MicroPeak Graphs</title>
- <para>
- Under the Graph tab, the height, speed and acceleration values
- are displayed together. You can zoom in on the graph by
- clicking and dragging to sweep out an area of
- interest. Right-click on the plot to bring up a menu that will
- let you save, copy or print the graph.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-graph.png" width="4.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>MicroPeak Flight Statistics</title>
- <para>
- The Statistics tab presents overall data from the flight. Note
- that the Maximum height value is taken from the minumum
- pressure captured in flight, and may be different from the
- apparant apogee value as the on-board data are sampled twice
- as fast as the recorded values, or because the true apogee
- occurred after the on-board memory was full. Each value is
- presented in several units as appropriate.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-statistics.png" width="4.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>Raw Data</title>
- <para>
- A table consisting of the both the raw barometric pressure
- data and values computed from that for each recorded time.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-raw-data.png" width="4.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>Configuring the Graph</title>
- <para>
- This selects which graph elements to show, and lets you
- switch between metric and imperial units
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-graph-configure.png" width="4.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- </section>
- <section>
- <title>Setting MicroPeak Preferences</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="micropeak-preferences.png" width="1.8in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- The MicroPeak application has a few user settings which are
- configured through the Preferences dialog, which can be
- accessed from the File menu.
- <itemizedlist>
- <listitem>
- <para>
- The Log Directory is where flight data will be saved to
- and loaded from by default. Of course, you can always
- navigate to other directories in the file chooser windows,
- this setting is just the starting point.
- </para>
- </listitem>
- <listitem>
- <para>
- If you prefer to see your graph data in feet and
- miles per hour instead of meters and meters per second,
- you can select Imperial Units.
- </para>
- </listitem>
- <listitem>
- <para>
- To see what data is actually arriving over the serial
- port, start the MicroPeak application from a command
- prompt and select the Serial Debug option. This can be
- useful in debugging serial communication problems, but
- most people need never choose this.
- </para>
- </listitem>
- <listitem>
- <para>
- You can adjust the size of the text in the Statistics tab
- by changing the Font size preference. There are three
- settings, with luck one will both fit on your screen and
- provide readable values.
- </para>
- </listitem>
- <listitem>
- <para>
- The Look & feel menu shows a list of available
- application appearance choices. By default, the MicroPeak
- application tries to blend in with other applications, but
- you may choose some other appearance if you like.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Note that MicroPeak shares a subset of the AltosUI
- preferences, so if you use both of these applications, change
- in one application will affect the other.
- </para>
- </section>
- </chapter>
- <chapter>
- <title>Technical Information</title>
- <section>
- <title>Barometric Sensor</title>
- <para>
- MicroPeak uses the Measurement Specialties MS5607 sensor. This
- has a range of 120kPa to 1kPa with an absolute accuracy of
- 150Pa and a resolution of 2.4Pa.
- </para>
- <para>
- The pressure range corresponds roughly to an altitude range of
- -1500m (-4900 feet) to 31000m (102000 feet), while the
- resolution is approximately 20cm (8 inches) near sea level and
- 60cm (24in) at 10000m (33000 feet).
- </para>
- <para>
- Ground pressure is computed from an average of 16 samples,
- taken while the altimeter is at rest. The flight pressure used to
- report maximum height is computed from a Kalman filter
- designed to smooth out any minor noise in the sensor
- values. The flight pressure recorded to non-volatile storage
- is unfiltered, coming directly from the pressure sensor.
- </para>
- </section>
- <section>
- <title>Micro-controller</title>
- <para>
- MicroPeak uses an Atmel ATtiny85 micro-controller. This tiny
- CPU contains 8kB of flash for the application, 512B of RAM for
- temporary data storage and 512B of EEPROM for non-volatile
- storage of previous flight data.
- </para>
- <para>
- The ATtiny85 has a low-power mode which turns off all of the
- clocks and powers down most of the internal components. In
- this mode, the chip consumes only .1μA of power. MicroPeak
- uses this mode once the flight has ended to preserve battery
- power.
- </para>
- </section>
- <section>
- <title>Lithium Battery</title>
- <para>
- The CR1025 battery used by MicroPeak holds 30mAh of power,
- which is sufficient to run for over 40 hours. Because
- MicroPeak powers down on landing, run time includes only time
- sitting on the launch pad or during flight.
- </para>
- <para>
- The large positive terminal (+) is usually marked, while the
- smaller negative terminal is not. Make sure you install the
- battery with the positive terminal facing away from the
- circuit board where it will be in contact with the metal
- battery holder. A small pad on the circuit board makes contact
- with the negative battery terminal.
- </para>
- <para>
- Shipping restrictions may prevent us from including a CR1025
- battery with MicroPeak. If so, many stores carry CR1025
- batteries as they are commonly used in small electronic
- devices such as flash lights.
- </para>
- </section>
- <section>
- <title>Atmospheric Model</title>
- <para>
- MicroPeak contains a fixed atmospheric model which is used to
- convert barometric pressure into altitude. The model was
- converted into a 469-element piece-wise linear approximation
- which is then used to compute the altitude of the ground and
- apogee. The difference between these represents the maximum
- height of the flight.
- </para>
- <para>
- The model assumes a particular set of atmospheric conditions,
- which, while a reasonable average, cannot represent the changing
- nature of the real atmosphere. Fortunately, for flights
- reasonably close to the ground, the effect of this global
- inaccuracy are largely canceled out when the computed ground
- altitude is subtracted from the computed apogee altitude, so
- the resulting height is more accurate than either the ground
- or apogee altitudes.
- </para>
- <para>
- Because the raw pressure data is recorded to non-volatile
- storage, you can use that, along with a more sophisticated
- atmospheric model, to compute your own altitude values.
- </para>
- </section>
- <section>
- <title>Mechanical Considerations</title>
- <para>
- MicroPeak is designed to be rugged enough for typical rocketry
- applications. It contains two moving parts, the battery holder
- and the power switch, which were selected for their
- ruggedness.
- </para>
- <para>
- The MicroPeak battery holder is designed to withstand impact
- up to 150g without breaking contact (or, worse yet, causing
- the battery to fall out). That means it should stand up to
- almost any launch you care to try, and should withstand fairly
- rough landings.
- </para>
- <para>
- The power switch is designed to withstand up to 50g forces in
- any direction. Because it is a sliding switch, orienting the
- switch perpendicular to the direction of rocket travel will
- serve to further protect the switch from launch forces.
- </para>
- </section>
- <section>
- <title>On-board data storage</title>
- <para>
- The ATtiny85 has 512 bytes of non-volatile storage, separate
- from the code storage memory. The MicroPeak firmware uses this
- to store information about the last completed
- flight. Barometric measurements from the ground before launch
- and at apogee are stored, and used at power-on to compute the
- height of the last flight.
- </para>
- <para>
- In addition to the data used to present the height of the last
- flight, MicroPeak also stores barometric information sampled
- at regular intervals during the flight. This is the
- information captured with the MicroPeak USB adapter. It can
- also be read from MicroPeak through any AVR programming
- tool.
- </para>
- <table frame='all'>
- <title>MicroPeak EEPROM Data Storage</title>
- <tgroup cols='3' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='2*' colname='Address'/>
- <colspec align='center' colwidth='*' colname='Size (bytes)'/>
- <colspec align='left' colwidth='7*' colname='Description'/>
- <thead>
- <row>
- <entry align='center'>Address</entry>
- <entry align='center'>Size (bytes)</entry>
- <entry align='center'>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0x000</entry>
- <entry>4</entry>
- <entry>Average ground pressure (Pa)</entry>
- </row>
- <row>
- <entry>0x004</entry>
- <entry>4</entry>
- <entry>Minimum flight pressure (Pa)</entry>
- </row>
- <row>
- <entry>0x008</entry>
- <entry>2</entry>
- <entry>Number of in-flight samples</entry>
- </row>
- <row>
- <entry>0x00a … 0x1fe</entry>
- <entry>2</entry>
- <entry>Instantaneous flight pressure (Pa) low 16 bits</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>
- All EEPROM data are stored least-significant byte first. The
- instantaneous flight pressure data are stored without the
- upper 16 bits of data. The upper bits can be reconstructed
- from the previous sample, assuming that pressure doesn't
- change by more more than 32kPa in a single sample
- interval. Note that this pressure data is <emphasis>not</emphasis>
- filtered in any way, while both the recorded ground and apogee
- pressure values are, so you shouldn't expect the minimum
- instantaneous pressure value to match the recorded minimum
- pressure value exactly.
- </para>
- <para>
- MicroPeak samples pressure every 96ms, but stores only every
- other sample in the EEPROM. This provides for 251 pressure
- samples at 192ms intervals, or 48.192s of storage. The clock
- used for these samples is a factory calibrated RC circuit
- built into the ATtiny85 and is accurate only to within ±10% at
- 25°C. So, you can count on the pressure data being accurate,
- but speed or acceleration data computed from this will be
- limited by the accuracy of this clock.
- </para>
- </section>
- <section>
- <title>MicroPeak Programming Interface</title>
- <para>
- MicroPeak exposes a standard 6-pin AVR programming interface,
- but not using the usual 2x3 array of pins on 0.1"
- centers. Instead, there is a single row of tiny 0.60mm ×
- 0.85mm pads on 1.20mm centers exposed near the edge of the
- circuit board. We couldn't find any connector that was
- small enough to include on the circuit board.
- </para>
- <para>
- In lieu of an actual connector, the easiest way to connect to
- the bare pads is through a set of Pogo pins. These
- spring-loaded contacts are designed to connect in precisely
- this way. We've designed a programming jig, the MicroPeak
- Pogo Pin board which provides a standard AVR interface on one
- end and a recessed slot for MicroPeak to align the board with
- the Pogo Pins.
- </para>
- <para>
- The MicroPeak Pogo Pin board is not a complete AVR programmer,
- it is an interface board that provides a 3.3V regulated power
- supply to run the MicroPeak via USB and a standard 6-pin AVR
- programming interface with the usual 2x3 grid of pins on 0.1"
- centers. This can be connected to any AVR programming
- dongle.
- </para>
- <para>
- The AVR programming interface cannot run faster than ¼ of the
- AVR CPU clock frequency. Because MicroPeak runs at 250kHz to
- save power, you must configure your AVR programming system to
- clock the AVR programming interface at no faster than
- 62.5kHz, or a clock period of 32µS.
- </para>
- </section>
- </chapter>
-</book>
-<!-- LocalWords: Altusmetrum MicroPeak
--->
--- /dev/null
+
+Acceleration:: Select a value, and then choose
+whether acceleration should be above or below
+that value. Acceleration is positive upwards,
+so accelerating towards the ground would
+produce negative numbers. Acceleration during
+descent is noisy and inaccurate, so be careful
+when using it during these phases of the
+flight.
+
+Vertical speed:: Select a value, and then
+choose whether vertical speed should be above
+or below that value. Speed is positive
+upwards, so moving towards the ground would
+produce negative numbers. Speed during descent
+is a bit noisy and so be careful when using it
+during these phases of the flight.
+
+Height:: Select a value, and then choose
+whether the height above the launch pad should
+be above or below that value.
+
+Orientation:: TeleMega and EasyMega contain a
+3-axis gyroscope and accelerometer which is
+used to measure the current angle. Note that
+this angle is not the change in angle from the
+launch pad, but rather absolute relative to
+gravity; the 3-axis accelerometer is used to
+compute the angle of the rocket on the launch
+pad and initialize the system.
+
+ [NOTE]
+ ====
+ Because this value is computed by integrating
+ rate gyros, it gets progressively less
+ accurate as the flight goes on. It should have
+ an accumulated error of less than 0.2°/second
+ (after 10 seconds of flight, the error should
+ be less than 2°).
+
+ The usual use of the orientation configuration
+ is to ensure that the rocket is traveling
+ mostly upwards when deciding whether to ignite
+ air starts or additional stages. For that,
+ choose a reasonable maximum angle (like 20°)
+ and set the motor igniter to require an angle
+ of less than that value.
+ ====
+
+Flight Time:: Time since boost was detected. Select a value and choose
+whether to activate the pyro channel before or after that amount of
+time.
+
+Ascending:: A simple test saying whether the rocket is going up or
+not. This is exactly equivalent to testing whether the speed is > 0.
+
+Descending:: A simple test saying whether the rocket is going down or
+not. This is exactly equivalent to testing whether the speed is < 0.
+
+After Motor:: The flight software counts each time the rocket starts
+accelerating and then decelerating (presumably due to a motor or
+motors burning). Use this value for multi-staged or multi-airstart
+launches.
+
+Delay:: This value doesn't perform any checks, instead it inserts a
+delay between the time when the other parameters become true and when
+the pyro channel is activated.
+
+Flight State:: The flight software tracks the flight
+through a sequence of states:
+
+ * Boost. The motor has lit and the rocket is
+ accelerating upwards.
+
+ * Fast. The motor has burned out and the
+ rocket is decelerating, but it is going
+ faster than 200m/s.
+
+ * Coast. The rocket is still moving upwards
+ and decelerating, but the speed is less
+ than 200m/s.
+
+ * Drogue. The rocket has reached apogee and
+ is heading back down, but is above the
+ configured Main altitude.
+
+ * Main. The rocket is still descending, and
+ is below the Main altitude
+
+ * Landed. The rocket is no longer moving.
+
+You can select a state to limit when the pyro channel may activate;
+note that the check is based on when the rocket transitions *into* the
+state, and so checking for “greater than Boost” means that the rocket
+is currently in boost or some later state.
+
+When a motor burns out, the rocket enters either Fast or Coast state
+(depending on how fast it is moving). If the computer detects upwards
+acceleration again, it will move back to Boost state.
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>29 September 2010</date>
+<copyright>
+ <year>2010</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 0.7.1
+:toc!:
+:doctype: article
+
+ Version 0.7.1 is the first release containing our new
+ cross-platform Java-based user interface.
+
+ == AltosUI Application
+
+ * 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.
+
+
+ * Download logged data from TeleMetrum devices, either through
+ a direct USB connection or over the air through a TeleDongle
+ device.
+
+
+ * 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.
+
+
+ * 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.
+
+
+ * 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.
+
+
+ * 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.
+
+
+ * 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.
+++ /dev/null
-<?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>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Download logged data from TeleMetrum devices, either through a
- direct USB connection or over the air through a TeleDongle
- device.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- </itemizedlist>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>24 November 2010</date>
+<copyright>
+ <year>2010</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 0.8
+:toc!:
+:doctype: article
+
+ Version 0.8 offers a major upgrade in the AltosUI
+ interface.
+
+ == AltosUI Application:
+
+ * 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.
+
+ * 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.
+
+ * 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.
+
+ * 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.
+
+ * Monitor multiple flights simultaneously. If you have more
+ than one TeleDongle, you can monitor a flight with each one
+ on the same computer.
+
+ * 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.
+
+ * 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.
+++ /dev/null
-<?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>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Monitor multiple flights simultaneously. If you have more than
- one TeleDongle, you can monitor a flight with each one on the
- same computer.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- </itemizedlist>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>18 January 2011</date>
+<copyright>
+ <year>2011</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>19 March 2011</date>
+<copyright>
+ <year>2011</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 0.9.2
+:toc!:
+:doctype: article
+
+ Version 0.9.2 is an AltosUI bug-fix release, with no firmware
+ changes.
+
+ == AltosUI
+
+ AltosUI fixes:
+
+ * Fix plotting problems due to missing file in the Mac
+ OS install image.
+
+ * Always read whole eeprom blocks, mark empty records
+ invalid, display parsing errors to user.
+
+ * Add software version to Configure AltosUI dialog
+++ /dev/null
-<?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>
-<para>
- Fix plotting problems due to missing file in the Mac OS install image.
-</para>
- </listitem>
- <listitem>
-<para>
- Always read whole eeprom blocks, mark empty records invalid, display parsing errors to user.
-</para>
- </listitem>
- <listitem>
- <para>
- Add software version to Configure AltosUI dialog
-</para>
- </listitem>
- </itemizedlist>
-</article>
--- /dev/null
+= Release Notes for Version 0.9
+:toc!:
+:doctype: article
+
+ Version 0.9 adds a few new firmware features and accompanying
+ AltosUI changes, along with new hardware support.
+
+ == AltOS
+
+ * 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.
+
+ * 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.
+
+ * 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.
+
+ == AltosUI Application
+
+ * Support for telemetry format changes.
+
+ * Support for multiple flight logs.
+++ /dev/null
-<?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>
- <para>
- 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.
-</para>
- </listitem>
- <listitem>
- <para>
- 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.
-</para>
- </listitem>
- <listitem>
- <para>
- 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.
-</para>
- </listitem>
- </itemizedlist>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>24 August 2011</date>
+<copyright>
+ <year>2011</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 1.0.1
+:toc!:
+:doctype: article
+
+ Version 1.0.1 is a major release, adding support for the
+ TeleMini device and lots of new AltosUI features
+
+ == AltOS
+
+ AltOS New Features
+
+ * Add TeleMini v1.0 support.
+
+ * 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.
+
+ * 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.
+
+ * 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.
+
+
+ AltOS Fixes
+
+ * 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.
+
+ * 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.
+
+
+ == AltosUI Application
+
+ AltosUI New Features
+
+ * Add main/apogee voltage graphs to the data
+ plot. This provides a visual indication if the
+ igniters fail before being fired.
+
+ * 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.
+
+ * 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.
+
+
+ * 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.
+
+ * 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.
+
+ AltosUI Changes
+
+ * 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.
+++ /dev/null
-<?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>
-<para>
- Add TeleMini v1.0 support. Firmware images for TeleMini are
- included in AltOS releases.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI Changes
- <itemizedlist>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Add main/apogee voltage graphs to the data plot. This provides
- a visual indication if the igniters fail before being fired.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>13 September 2012</date>
+<copyright>
+ <year>2013</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>16 September 2012</date>
+<copyright>
+ <year>2012</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 1.1
+:toc!:
+:doctype: article
+
+ Version 1.1.1 is a bug-fix release. It fixes a couple of bugs
+ in AltosUI and one firmware bug that affects TeleMetrum
+ version 1.0 boards. Thanks to Bob Brown for help diagnosing
+ the Google Earth file export issue, and for suggesting the
+ addition of the Ground Distance value in the Descent tab.
+
+ == AltOS
+
+ AltOS fixes:
+
+ * TeleMetrum v1.0 boards use the AT45DB081D flash
+ memory part to store flight data, which is different
+ from later TeleMetrum boards. The AltOS v1.1 driver
+ for this chip couldn't erase memory, leaving it
+ impossible to delete flight data or update
+ configuration values. This bug doesn't affect newer
+ TeleMetrum boards, and it doesn't affect the safety
+ of rockets flying version 1.1 firmware.
+
+ == AltosUI
+
+ AltosUI new features:
+
+ * The “Descent” tab displays the range to the rocket,
+ which is a combination of the over-the-ground
+ distance to the rockets current latitude/longitude
+ and the height of the rocket. As such, it's useful
+ for knowing how far away the rocket is, but
+ difficult to use when estimating where the rocket
+ might eventually land. A new “Ground Distance” field
+ has been added which displays the distance to a spot
+ right underneath the rocket.
+
+ AltosUI fixes:
+
+ * Creating a Google Earth file (KML) from on-board
+ flight data (EEPROM) would generate an empty
+ file. The code responsible for reading the EEPROM
+ file wasn't ever setting the GPS valid bits, and so
+ the KML export code thought there was no GPS data in
+ the file.
+
+ * The “Landed” tab was displaying all values in metric
+ units, even when AltosUI was configured to display
+ imperial units. Somehow I just missed this tab when
+ doing the units stuff.
+
+ * Sensor data wasn't being displayed for TeleMini
+ flight computers in Monitor Idle mode, including
+ things like battery voltage. The code that picked
+ which kinds of data to fetch from the flight
+ computer was missing a check for TeleMini when
+ deciding whether to fetch the analog sensor data.
+++ /dev/null
-<?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.1 is a bug-fix release. It fixes a couple of bugs in
- AltosUI and one firmware bug that affects TeleMetrum version 1.0
- boards. Thanks to Bob Brown for help diagnosing the Google Earth
- file export issue, and for suggesting the addition of the Ground
- Distance value in the Descent tab.
- </para>
- <para>
- AltOS Firmware Changes
- <itemizedlist>
- <listitem>
-<para>
- TeleMetrum v1.0 boards use the AT45DB081D flash memory part to
- store flight data, which is different from later TeleMetrum
- boards. The AltOS v1.1 driver for this chip couldn't erase
- memory, leaving it impossible to delete flight data or update
- configuration values. This bug doesn't affect newer TeleMetrum
- boards, and it doesn't affect the safety of rockets flying
- version 1.1 firmware.
- </para>
-</listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI Changes
- <itemizedlist>
- <listitem>
-<para>
- Creating a Google Earth file (KML) from on-board flight data
- (EEPROM) would generate an empty file. The code responsible
- for reading the EEPROM file wasn't ever setting the GPS valid
- bits, and so the KML export code thought there was no GPS data
- in the file.
- </para>
-</listitem>
- <listitem>
-<para>
- The “Landed” tab was displaying all values in metric units,
- even when AltosUI was configured to display imperial
- units. Somehow I just missed this tab when doing the units stuff.
- </para>
-</listitem>
- <listitem>
-<para>
- The “Descent” tab displays the range to the rocket, which is a
- combination of the over-the-ground distance to the rockets
- current latitude/longitude and the height of the rocket. As
- such, it's useful for knowing how far away the rocket is, but
- difficult to use when estimating where the rocket might
- eventually land. A new “Ground Distance” field has been added
- which displays the distance to a spot right underneath the
- rocket.
- </para>
-</listitem>
- <listitem>
-<para>
- Sensor data wasn't being displayed for TeleMini flight
- computers in Monitor Idle mode, including things like battery
- voltage. The code that picked which kinds of data to fetch
- from the flight computer was missing a check for TeleMini when
- deciding whether to fetch the analog sensor data.
- </para>
-</listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+= Release Notes for Version 1.1
+:toc!:
+:doctype: article
+
+ Version 1.1 is a minor release. It provides a few new features
+ in AltosUI and the AltOS firmware and fixes bugs.
+
+ == AltOS
+
+ AltOS Firmware New Features:
+
+ * Add apogee-lockout value. Overrides the apogee
+ detection logic to prevent incorrect apogee charge
+ firing.
+
+ * 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.
+
+ * Provide RSSI values for Monitor Idle mode. This
+ makes it easy to check radio range without needing
+ to go to flight mode.
+
+ AltOS Fixes:
+
+ * Fix a bug where the data reported in telemetry
+ packets was from 320ms ago.
+
+ * 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.
+
+ == AltosUI
+
+ AltosUI New Features:
+
+ * Make the look-n-feel configurable, providing a choice from
+ the available options.
+
+ * 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.
+
+ * Add 'Configure Ground Station' dialog to set the
+ radio frequency used by a particular TeleDongle
+ without having to go through the flight monitor UI.
+
+ * Add configuration for the new apogee-lockout
+ value. A menu provides a list of reasonable values,
+ or the value can be set by hand.
+
+ * Add Imperial units mode to present data in feet
+ instead of meters.
+
+ AltosUI Fixes:
+
+ * 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.
+
+ * 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.
+
+ * Changed how flight data are downloaded. Now there's
+ an initial dialog asking which flights to download,
+ and after that finishes, a second dialog comes up
+ asking which flights to delete.
+
+ * 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.
+
+ * 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.
+
+ * 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.
+++ /dev/null
-<?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>
-<para>
- Add apogee-lockout value. Overrides the apogee detection logic to
- prevent incorrect apogee charge firing.
- </para>
-</listitem>
- <listitem>
-<para>
- Fix a bug where the data reported in telemetry packets was
- from 320ms ago.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Provide RSSI values for Monitor Idle mode. This makes it easy to check radio
- range without needing to go to flight mode.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI Changes
- <itemizedlist>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Make the look-n-feel configurable, providing a choice from
- the available options.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Add 'Configure Ground Station' dialog to set the radio
- frequency used by a particular TeleDongle without having to go
- through the flight monitor UI.
- </para>
-</listitem>
- <listitem>
-<para>
- Add configuration for the new apogee-lockout value. A menu provides a list of
- reasonable values, or the value can be set by hand.
- </para>
-</listitem>
- <listitem>
-<para>
- Changed how flight data are downloaded. Now there's an initial
- dialog asking which flights to download, and after that
- finishes, a second dialog comes up asking which flights to delete.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- 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.
- </para>
-</listitem>
- <listitem>
-<para>
- Add Imperial units mode to present data in feet instead of
- meters.
- </para>
-</listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>18 April 2013</date>
+<copyright>
+ <year>2013</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>21 May 2013</date>
+<copyright>
+ <year>2013</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 1.2.1
+:toc!:
+:doctype: article
+
+ Version 1.2.1 is a minor release. It adds support for TeleBT and
+ the AltosDroid application, provides several new features in
+ AltosUI and fixes some bugs in the AltOS firmware.
+
+ == AltOS
+
+ AltOS new features:
+
+ * Add support for TeleBT
+
+ AltOS fixes:
+
+ * In TeleMini recovery mode (when booted with the
+ outer two debug pins connected together), the radio
+ parameters are also set back to defaults
+ (434.550MHz, N0CALL, factory radio cal).
+
+ * Correct Kalman filter model error covariance
+ matrix. The values used previously assumed
+ continuous measurements instead of discrete
+ measurements.
+
+ * Fix some bugs in the USB driver for TeleMetrum and
+ TeleDongle that affected Windows users.
+
+ * Adjusted the automatic gain control parameters that
+ affect receive performance for TeleDongle. Field
+ tests indicate that this may improve receive
+ performance somewhat.
+
+ == AltosUI Application
+
+ AltosUI application new features:
+
+ * Make the initial position of the AltosUI top level
+ window configurable. Along with this change, the
+ other windows will pop up at 'sensible' places now,
+ instead of on top of one another.
+
+ * Add GPS data and a map to the graph window. This
+ lets you see a complete summary of the flight
+ without needing to 'replay' the whole thing.
+
+ AltosUI application fixes:
+
+ * Handle missing GPS lock in 'Descent'
+ tab. Previously, if the GPS position of the pad was
+ unknown, an exception would be raised, breaking the
+ Descent tab contents.
+
+ * Improve the graph, adding tool-tips to show values
+ near the cursor and making the displayed set of
+ values configurable, adding all of the flight data
+ as options while leaving the default settings alone
+ so that the graph starts by showing height, speed
+ and acceleration.
+
+ * Add callsign to Monitor idle window and connecting
+ dialogs. This makes it clear which callsign is being
+ used so that the operator will be aware that it must
+ match the flight computer value or no communication
+ will work.
+
+ * When downloading flight data, display the block
+ number so that the user has some sense of
+ progress. Unfortunately, we don't know how many
+ blocks will need to be downloaded, but at least it
+ isn't just sitting there doing nothing for a long
+ time.
+
+ == AltosDroid
+
+ * First version of this application
+++ /dev/null
-<?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.2.1 is a minor release. It adds support for TeleBT and
- the AltosDroid application, provides several new features in
- AltosUI and fixes some bugs in the AltOS firmware.
- </para>
- <para>
- AltOS Firmware Changes
- <itemizedlist>
- <listitem>
-<para>
- Add support for TeleBT
- </para>
-</listitem>
- <listitem>
-<para>
- In TeleMini recovery mode (when booted with the outer two
- debug pins connected together), the radio parameters are also
- set back to defaults (434.550MHz, N0CALL, factory radio cal).
- </para>
-</listitem>
- <listitem>
-<para>
- Add support for reflashing the SkyTraq GPS chips. This
- requires special host-side code which currently only exists
- for Linux.
- </para>
-</listitem>
- <listitem>
-<para>
- Correct Kalman filter model error covariance matrix. The
- values used previously assumed continuous measurements instead
- of discrete measurements.
- </para>
-</listitem>
- <listitem>
-<para>
- Fix some bugs in the USB driver for TeleMetrum and TeleDongle
- that affected Windows users.
- </para>
-</listitem>
- <listitem>
-<para>
- Adjusted the automatic gain control parameters that affect
- receive performance for TeleDongle. Field tests indicate that this
- may improve receive performance somewhat.
- </para>
-</listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI Changes
- <itemizedlist>
- <listitem>
-<para>
- Handle missing GPS lock in 'Descent' tab. Previously, if the
- GPS position of the pad was unknown, an exception would be
- raised, breaking the Descent tab contents.
- </para>
-</listitem>
- <listitem>
-<para>
- Improve the graph, adding tool-tips to show values near the
- cursor and making the displayed set of values configurable,
- adding all of the flight data as options while leaving the
- default settings alone so that the graph starts by showing
- height, speed and acceleration.
- </para>
-</listitem>
- <listitem>
-<para>
- Make the initial position of the AltosUI top level window
- configurable. Along with this change, the other windows will
- pop up at 'sensible' places now, instead of on top of one
- another.
- </para>
-</listitem>
- <listitem>
-<para>
- Add callsign to Monitor idle window and connecting
- dialogs. This makes it clear which callsign is being used so
- that the operator will be aware that it must match the flight
- computer value or no communication will work.
- </para>
-</listitem>
- <listitem>
-<para>
- When downloading flight data, display the block number so that
- the user has some sense of progress. Unfortunately, we don't
- know how many blocks will need to be downloaded, but at least
- it isn't just sitting there doing nothing for a long time.
- </para>
-</listitem>
- <listitem>
-<para>
- Add GPS data and a map to the graph window. This lets you see
- a complete summary of the flight without needing to 'replay'
- the whole thing.
- </para>
-</listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+= Release Notes for Version 1.2
+:toc!:
+:doctype: article
+
+ Version 1.2 is a major release. It adds support for MicroPeak
+ and the MicroPeak USB adapter.
+
+ == AltOS
+
+ AltOS New Features:
+
+ * Add MicroPeak support. This includes support for the
+ ATtiny85 processor and adaptations to the core code
+ to allow for devices too small to run the
+ multi-tasking scheduler.
+
+ == AltosUI and MicroPeak Application
+
+ New Features:
+
+ * Added MicroPeak application
+
+ AltosUI and MicroPeak fixes:
+
+ * Distribute Mac OS X packages in disk image ('.dmg')
+ format to greatly simplify installation.
+
+ * Provide version numbers for the shared Java
+ libraries to ensure that upgrades work properly, and
+ to allow for multiple Altus Metrum software packages
+ to be installed in the same directory at the same
+ time.
+++ /dev/null
-<?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.2 is a major release. It adds support for MicroPeak and
- the MicroPeak USB adapter.
- </para>
- <para>
- AltOS Firmware Changes
- <itemizedlist>
- <listitem>
-<para>
- Add MicroPeak support. This includes support for the ATtiny85
- processor and adaptations to the core code to allow for
- devices too small to run the multi-tasking scheduler.
- </para>
-</listitem>
- </itemizedlist>
- </para>
- <para>
- MicroPeak UI changes
- <itemizedlist>
- <listitem>
-<para>
- Added this new application
- </para>
-</listitem>
- </itemizedlist>
- </para>
- <para>
- Distribution Changes
- <itemizedlist>
- <listitem>
-<para>
- Distribute Mac OS X packages in disk image ('.dmg') format to
- greatly simplify installation.
- </para>
-</listitem>
- <listitem>
-<para>
- Provide version numbers for the shared Java libraries to
- ensure that upgrades work properly, and to allow for multiple
- Altus Metrum software packages to be installed in the same
- directory at the same time.
- </para>
-</listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>12 November 2013</date>
+<copyright>
+ <year>2013</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>21 January 2014</date>
+<copyright>
+ <year>2014</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 1.3.1
+:toc!:
+:doctype: article
+
+ Version 1.3.1 is a minor release. It improves support for
+ TeleMega, TeleMetrum v2.0, TeleMini v2.0 and EasyMini.
+
+ == AltOS
+
+ AltOS new features:
+
+ * Improved APRS mode. Now uses compressed position
+ format for smaller data size, improved precision and
+ to include altitude data as well as latitude and
+ longitude. Also added battery and pyro voltage
+ reports in the APRS comment field so you can confirm
+ that the unit is ready for launch.
+
+ AltOS fixes:
+
+ * Improve sensor boot code. If sensors fail to
+ self-test, the device will still boot up and check
+ for pad/idle modes. If in idle mode, the device will
+ warn the user with a distinct beep, if in Pad mode,
+ the unit will operate as best it can. Also, the
+ Z-axis accelerometer now uses the factory
+ calibration values instead of re-calibrating on the
+ pad each time. This avoids accidental boost detect
+ when moving the device around while in Pad mode.
+
+ * Fix antenna-down mode accelerometer
+ configuration. Antenna down mode wasn't working
+ because the accelerometer calibration values were
+ getting re-computed incorrectly in inverted mode.
+
+ == AltosUI Application
+
+ AltosUI new features:
+
+ * Display additional TeleMega sensor values in real
+ units. Make all of these values available for
+ plotting. Display TeleMega orientation value in the
+ Ascent and Table tabs.
+
+
+ * Support additional TeleMega pyro channels in the
+ Fire Igniter dialog. This lets you do remote testing
+ of all of the channels, rather than just Apogee and
+ Main.
+
+ AltosUI fixes:
+
+ * Limit data rate when downloading satellite images
+ from Google to make sure we stay within their limits
+ so that all of the map tiles download successfully.
+++ /dev/null
-<?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.3.1 is a minor release. It improves support for TeleMega,
- TeleMetrum v2.0, TeleMini v2.0 and EasyMini.
- </para>
- <para>
- AltOS Firmware Changes
- <itemizedlist>
- <listitem>
- <para>
- Improve sensor boot code. If sensors fail to self-test, the
- device will still boot up and check for pad/idle modes. If
- in idle mode, the device will warn the user with a distinct
- beep, if in Pad mode, the unit will operate as best it
- can. Also, the Z-axis accelerometer now uses the factory
- calibration values instead of re-calibrating on the pad each
- time. This avoids accidental boost detect when moving the
- device around while in Pad mode.
- </para>
- </listitem>
- <listitem>
- <para>
- Fix antenna-down mode accelerometer configuration. Antenna
- down mode wasn't working because the accelerometer
- calibration values were getting re-computed incorrectly in
- inverted mode.
- </para>
- </listitem>
- <listitem>
- <para>
- Improved APRS mode. Now uses compressed position format for
- smaller data size, improved precision and to include
- altitude data as well as latitude and longitude. Also added
- battery and pyro voltage reports in the APRS comment field
- so you can confirm that the unit is ready for launch.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI changes
- <itemizedlist>
- <listitem>
- <para>
- Display additional TeleMega sensor values in real
- units. Make all of these values available for
- plotting. Display TeleMega orientation value in the Ascent
- and Table tabs.
- </para>
- </listitem>
- <listitem>
- <para>
- Support additional TeleMega pyro channels in the Fire
- Igniter dialog. This lets you do remote testing of all of
- the channels, rather than just Apogee and Main.
- </para>
- </listitem>
- <listitem>
- <para>
- Limit data rate when downloading satellite images from
- Google to make sure we stay within their limits so that all
- of the map tiles download successfully.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>24 January 2014</date>
+<copyright>
+ <year>2014</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 1.3.2
+:toc!:
+:doctype: article
+
+ Version 1.3.2 is a minor release. It includes small bug fixes for
+ the TeleMega flight software and AltosUI ground station
+
+ == AltOS
+
+ AltOS fixes:
+
+ * On TeleMega, limit number of logged GPS status
+ information to 12 satellites. That's all there is
+ room for in the log structure.
+
+ * Improve APRS behavior. Remembers last known GPS
+ position and keeps sending that if we lose GPS
+ lock. Marks locked/unlocked by sending L/U in the
+ APRS comment field along with the number of sats in
+ view and voltages.
+
+ == AltosUI Application
+
+ AltosUI fixes:
+
+ * If the TeleMega flight firmware reports that it has
+ logged information about more than 12 satellites,
+ don't believe it as the log only holds 12 satellite
+ records.
+
+ * Track the maximum height as computed from GPS
+ altitude data and report that in the flight summary
+ data.
+
+ * Use letters (A, B, C, D) for alternate pyro channel
+ names instead of numbers (0, 1, 2, 3) in the Fire
+ Igniter dialog.
+++ /dev/null
-<?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.3.2 is a minor release. It includes small bug fixes for
- the TeleMega flight software and AltosUI ground station
- </para>
- <para>
- AltOS Firmware Changes
- <itemizedlist>
- <listitem>
- <para>
- On TeleMega, limit number of logged GPS status information
- to 12 satellites. That's all there is room for in the log
- structure.
- </para>
- </listitem>
- <listitem>
- <para>
- Improve APRS behavior. Remembers last known GPS position and
- keeps sending that if we lose GPS lock. Marks
- locked/unlocked by sending L/U in the APRS comment field
- along with the number of sats in view and voltages.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI changes
- <itemizedlist>
- <listitem>
- <para>
- If the TeleMega flight firmware reports that it has logged
- information about more than 12 satellites, don't believe it
- as the log only holds 12 satellite records.
- </para>
- </listitem>
- <listitem>
- <para>
- Track the maximum height as computed from GPS altitude
- data and report that in the flight summary data.
- </para>
- </listitem>
- <listitem>
- <para>
- Use letters (A, B, C, D) for alternate pyro channel names
- instead of numbers (0, 1, 2, 3) in the Fire Igniter dialog.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+= Release Notes for Version 1.3
+:toc!:
+:doctype: article
+
+ Version 1.3 is a major release. It adds support for TeleMega,
+ TeleMetrum v2.0, TeleMini v2.0 and EasyMini.
+
+ == AltOS
+
+ AltOS new features:
+
+ * Add STM32L processor support. This includes
+ enhancements to the scheduler to support products
+ with many threads.
+
+ * Add NXP LPC11U14 processor support.
+
+
+ * Support additional pyro channels. These are
+ configurable through the UI to handle air starts,
+ staging, additional recovery events and external
+ devices such as cameras.
+
+
+ * Add 3-axis gyro support for orientation
+ tracking. This integrates the gyros to compute the
+ angle from vertical during flight, allowing the
+ additional pyro events to be controlled by this
+ value.
+
+
+ * Many more device drivers, including u-Blox Max 7Q
+ GPS, Freescale MMA6555 digital single-axis
+ accelerometer, Invensense MPU6000 3-axis
+ accelerometer + 3 axis gyro, Honeywell HMC5883
+ 3-axis magnetic sensor and the TI CC1120 and CC115L
+ digital FM transceivers
+
+ == AltosUI Application
+
+ AltosUI new features:
+
+ * Support TeleMega, TeleMetrum v2.0, TeleMini v2.0 and
+ EasyMini telemetry and log formats.
+
+
+ AltosUI fixes:
+
+ * Use preferred units for main deployment height
+ configuration, instead of always doing configuration in
+ meters.
+ == MicroPeak Application
+
+ * Add 'Download' button to menu bar.
+
+ * Save the last log directory and offer that as the
+ default for new downloads
+++ /dev/null
-<?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.3 is a major release. It adds support for TeleMega,
- TeleMetrum v2.0, TeleMini v2.0 and EasyMini.
- </para>
- <para>
- AltOS Firmware Changes
- <itemizedlist>
- <listitem>
- <para>
- Add STM32L processor support. This includes enhancements to
- the scheduler to support products with many threads.
- </para>
- </listitem>
- <listitem>
- <para>
- Add NXP LPC11U14 processor support.
- </para>
- </listitem>
- <listitem>
- <para>
- Support additional pyro channels. These are configurable
- through the UI to handle air starts, staging, additional
- recovery events and external devices such as cameras.
- </para>
- </listitem>
- <listitem>
- <para>
- Add 3-axis gyro support for orientation tracking. This
- integrates the gyros to compute the angle from vertical during
- flight, allowing the additional pyro events to be controlled
- by this value.
- </para>
- </listitem>
- <listitem>
- <para>
- Many more device drivers, including u-Blox Max 7Q GPS,
- Freescale MMA6555 digital single-axis accelerometer,
- Invensense MPU6000 3-axis accelerometer + 3 axis gyro,
- Honeywell HMC5883 3-axis magnetic sensor and the TI CC1120 and
- CC115L digital FM transceivers
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI changes
- <itemizedlist>
- <listitem>
- <para>
- Support TeleMega, TeleMetrum v2.0, TeleMini v2.0 and EasyMini telemetry and log formats.
- </para>
- </listitem>
- <listitem>
- <para>
- Use preferred units for main deployment height configuration,
- instead of always doing configuration in meters.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- MicroPeak UI changes
- <itemizedlist>
- <listitem>
- <para>
- Add 'Download' button to menu bar.
- </para>
- </listitem>
- <listitem>
- <para>
- Save the last log directory and offer that as the default for new downloads
- </para>
- </listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>15 June 2014</date>
+<copyright>
+ <year>2014</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>20 June 2014</date>
+<copyright>
+ <year>2014</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 1.4.1
+:toc!:
+:doctype: article
+
+ Version 1.4.1 is a minor release. It fixes install issues on
+ Windows and provides the missing TeleMetrum V2.0 firmware. There
+ aren't any changes to the firmware or host applications at
+ all. All Windows users will want to upgrade to get the signed
+ driver, but Mac and Linux users who do not need the TeleMetrum
+ V2.0 firmware image will not need to upgrade.
+
+ == AltosUI and TeleGPS Applications:
+
+ Windows Install Fixes
+
+ * Provide signed Windows driver files. This should avoid any need to
+ disable driver signature checking on Windows 7 or 8.
+
+ * Fix Java version detection and download. Previously, the
+ installer would only look for Java 6 or 7 and insist on
+ downloading its own Java bits if there was something else
+ installed. Furthermore, the 64-bit Java link provided didn't
+ work for anyone other than Keith, making it impossible to
+ install AltOS on any machine with Java SE 8 installed.
+
+ Other Fixes
+
+ * Include 1.4 firmware for TeleMetrum V2.0. None of the
+ installers shipped this file. Now it's included in the AltOS
+ packages for Linux, Mac and Windows.
+
+ * Include Google Application Key for map downloading. The 1.4
+ release didn't have this key in the released version of the
+ software, making map downloading fail for most people.
+++ /dev/null
-<?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.4.1 is a minor release. It fixes install issues on
- Windows and provides the missing TeleMetrum V2.0 firmware. There
- aren't any changes to the firmware or host applications at
- all. All Windows users will want to upgrade to get the signed
- driver, but Mac and Linux users who do not need the TeleMetrum
- V2.0 firmware image will not need to upgrade.
- </para>
- <para>
- Windows Install Fixes
- <itemizedlist>
- <listitem>
- <para>
- Provide signed Windows driver files. This should avoid any need to
- disable driver signature checking on Windows 7 or 8.
- </para>
- </listitem>
- <listitem>
- <para>
- Fix Java version detection and download. Previously, the
- installer would only look for Java 6 or 7 and insist on
- downloading its own Java bits if there was something else
- installed. Furthermore, the 64-bit Java link provided didn't
- work for anyone other than Keith, making it impossible to
- install AltOS on any machine with Java SE 8 installed.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Other Fixes
- <itemizedlist>
- <listitem>
- <para>
- Include 1.4 firmware for TeleMetrum V2.0. None of the
- installers shipped this file. Now it's included in the AltOS
- packages for Linux, Mac and Windows.
- </para>
- </listitem>
- <listitem>
- <para>
- Include Google Application Key for map downloading. The 1.4
- release didn't have this key in the released version of the
- software, making map downloading fail for most people.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>17 August 2014</date>
+<copyright>
+ <year>2014</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 1.4.2
+:toc!:
+:doctype: article
+
+ Version 1.4.2 is a minor release. It fixes Java-related install issues on
+ Windows
+
+ == AltosUI and TeleGPS Applications
+
+ Windows Install Fixes
+
+ * Checks for Java installation data in more registry locations.
+
+ * Allows user to bypass Java installation in case the
+ detection fails.
--- /dev/null
+= Release Notes for Version 1.4
+:toc!:
+:doctype: article
+
+ Version 1.4 is a major release. It includes support for our new
+ TeleGPS product, new features and bug fixes in in the flight
+ software for all our boards and the AltosUI ground station
+
+ == AltOS
+
+ AltOS new features:
+
+ * Add support for TeleGPS boards.
+
+ * Make the beeper tone configurable, making it
+ possible to distinguish between two Altus Metrum
+ products in the same ebay.
+
+ * Make the firing time for extra pyro channels
+ configurable, allowing longer (or shorter) than the
+ default 50ms. Only relevant for TeleMega at this
+ time.
+
+ AltOS fixes:
+
+ * Replace the 'dit dit dit' tones at startup with the
+ current battery voltage, measured in tenths of a
+ volt. This lets you check the battery voltage
+ without needing telemetry, which is especially
+ useful on EasyMini.
+
+ * Change state beeping to "Farnsworth spacing", which
+ means they're quite a bit faster than before, and so
+ they take less time to send.
+
+ * Fix bug preventing the selection of the 'Flight
+ State After' mode in pyro configuration.
+
+ * Fix bug where erasing flights would reset the flight
+ number to 2 on TeleMega and TeleMetrum v2.
+
+ * Fix u-Blox GPS driver to mark course and speed data
+ as being present.
+
+ == AltosUI Application
+
+ AltosUI new features:
+
+ * Add zooming and new content types (terrain and road
+ maps) to map view. Change map storage format from
+ PNG to Jpeg, which saves a huge amount of disk
+ space. You will need to re-download all of your
+ pre-loaded map images.
+
+ * Add a distance measuring device to the maps
+ view. Select this by using any button other than the
+ left one, or by pressing shift or control on the
+ keyboard while using the left button.
+
+ * Add new 'Ignitor' tab to the flight monitor display
+ for TeleMega's extra ignitors.
+
+ * Add additional ignitor firing marks and voltages to
+ the graph so you can see when the ignitors fired,
+ along with the ignitor voltages.
+
+ * Add GPS course, ground speed and climb rate as
+ optional graph elements.
+
+ AltosUI fixes:
+
+ * When flashing new firmware, re-try opening the
+ device as sometimes it takes a while for the
+ underlying operating system to recognize that the
+ device has rebooted in preparation for the flashing
+ operation.
+
+ * Hide Tilt Angle in ascent tab for devices that don't
+ have a gyro.
+
+ * Increase the width of data lines in the graphs to
+ make them easier to read.
+
+ * Filter out speed and acceleration spikes caused by
+ ejection charge firing when computing the maximum
+ values. This provides a more accurate reading of
+ those maximums.
+
+ * Fix EasyMini voltage displays. Early EasyMini
+ prototypes used a 3.0V regulator, and AltosUI still
+ used that value as the basis of the
+ computation. Production EasyMini boards have always
+ shipped with a 3.3V regulator. Also, purple EasyMini
+ boards sensed the battery voltage past the blocking
+ diode, resulting in a drop of about 150mV from the
+ true battery voltage. Compensate for that when
+ displaying the value.
+
+ * Display error message when trying to configure
+ maximum flight log size while the flight computer
+ still has flight data stored.
+
+ * Handle TeleMetrum and TeleMini eeprom files
+ generated with pre-1.0 firmware. Those ancient
+ versions didn't report the log format, so just use
+ the product name instead.
+
+ == TeleGPS Application
+
+ * New application designed for use with TeleGPS boards.
+
+ * Shares code with AltosUI, mostly just trimmed down
+ to focus on TeleGPS-related functions.
+
+ == Documentation
+
+ Documentation changes:
+
+ * Re-create the drill template images; they should
+ print correctly from Firefox at least. Ship these as
+ individual PDF files so they're easy to print.
+
+ * Add a description of the 'Apogee Lockout' setting,
+ which prevents the apogee charge from firing for a
+ configurable amount of time after boost.
+++ /dev/null
-<?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.4 is a major release. It includes support for our new
- TeleGPS product, new features and bug fixes in in the flight
- software for all our boards and the AltosUI ground station
- </para>
- <para>
- AltOS New Features
- <itemizedlist>
- <listitem>
- <para>
- Add support for TeleGPS boards.
- </para>
- </listitem>
- <listitem>
- <para>
- Replace the 'dit dit dit' tones at startup with the current
- battery voltage, measured in tenths of a volt. This lets you
- check the battery voltage without needing telemetry, which
- is especially useful on EasyMini.
- </para>
- </listitem>
- <listitem>
- <para>
- Change state beeping to "Farnsworth spacing", which means
- they're quite a bit faster than before, and so they take
- less time to send.
- </para>
- </listitem>
- <listitem>
- <para>
- Make the beeper tone configurable, making it possible to
- distinguish between two Altus Metrum products in the same ebay.
- </para>
- </listitem>
- <listitem>
- <para>
- Make the firing time for extra pyro channels configurable,
- allowing longer (or shorter) than the default 50ms. Only relevant
- for TeleMega at this time.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltOS Fixes
- <itemizedlist>
- <listitem>
- <para>
- Fix bug preventing the selection of the 'Flight State After'
- mode in pyro configuration.
- </para>
- </listitem>
- <listitem>
- <para>
- Fix bug where erasing flights would reset the flight number
- to 2 on TeleMega and TeleMetrum v2.
- </para>
- </listitem>
- <listitem>
- <para>
- Fix u-Blox GPS driver to mark course and speed data as being
- present.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI New Features
- <itemizedlist>
- <listitem>
- <para>
- Add zooming and new content types (terrain and road maps) to
- map view. Change map storage format from PNG to Jpeg, which
- saves a huge amount of disk space. You will need to
- re-download all of your pre-loaded map images.
- </para>
- </listitem>
- <listitem>
- <para>
- Add a distance measuring device to the maps view. Select
- this by using any button other than the left one, or by
- pressing shift or control on the keyboard while using the
- left button.
- </para>
- </listitem>
- <listitem>
- <para>
- Add new 'Ignitor' tab to the flight monitor display for
- TeleMega's extra ignitors.
- </para>
- </listitem>
- <listitem>
- <para>
- Increase the width of data lines in the graphs to make them
- easier to read.
- </para>
- </listitem>
- <listitem>
- <para>
- Add additional ignitor firing marks and voltages to the
- graph so you can see when the ignitors fired, along with
- the ignitor voltages.
- </para>
- </listitem>
- <listitem>
- <para>
- Add GPS course, ground speed and climb rate as optional
- graph elements.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI Fixes
- <itemizedlist>
- <listitem>
- <para>
- When flashing new firmware, re-try opening the device as
- sometimes it takes a while for the underlying operating
- system to recognize that the device has rebooted in
- preparation for the flashing operation.
- </para>
- </listitem>
- <listitem>
- <para>
- Hide Tilt Angle in ascent tab for devices that don't have a gyro.
- </para>
- </listitem>
- <listitem>
- <para>
- Filter out speed and acceleration spikes caused by ejection
- charge firing when computing the maximum values. This
- provides a more accurate reading of those maximums.
- </para>
- </listitem>
- <listitem>
- <para>
- Fix EasyMini voltage displays. Early EasyMini prototypes
- used a 3.0V regulator, and AltosUI still used that value as
- the basis of the computation. Production EasyMini boards
- have always shipped with a 3.3V regulator. Also, purple
- EasyMini boards sensed the battery voltage past the blocking
- diode, resulting in a drop of about 150mV from the true
- battery voltage. Compensate for that when displaying the
- value.
- </para>
- </listitem>
- <listitem>
- <para>
- Display error message when trying to configure maximum
- flight log size while the flight computer still has flight
- data stored.
- </para>
- </listitem>
- <listitem>
- <para>
- Handle TeleMetrum and TeleMini eeprom files generated with
- pre-1.0 firmware. Those ancient versions didn't report the
- log format, so just use the product name instead.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- TeleGPS Application
- <itemizedlist>
- <listitem>
- <para>
- New application designed for use with TeleGPS boards.
- </para>
- </listitem>
- <listitem>
- <para>
- Shares code with AltosUI, mostly just trimmed down to focus
- on TeleGPS-related functions.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Documentation changes
- <itemizedlist>
- <listitem>
- <para>
- Re-create the drill template images; they should print
- correctly from Firefox at least. Ship these as individual
- PDF files so they're easy to print.
- </para>
- </listitem>
- <listitem>
- <para>
- Add a description of the 'Apogee Lockout' setting, which
- prevents the apogee charge from firing for a configurable
- amount of time after boost.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>6 September 2014</date>
+<copyright>
+ <year>2014</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 1.5
+:toc!:
+
+ Version 1.5 is a major release. It includes support for our new
+ EasyMega product, new features and bug fixes in in the flight
+ software for all our boards and the AltosUI ground station
+
+ == AltOS
+
+ AltOS New Features
+
+ * Add support for EasyMega boards.
+
+ * Make the APRS SSID be configurable. This lets you track
+ different rockets on the same receiver without getting
+ things mixed up.
+
+ * Report extra pyro channel continuity state on EasyMega and
+ TeleMega via the beeper. This lets you easily verify flight
+ readiness on these boards after powering up the electronics
+ on the rail.
+
+ * Add lower telemetry data rates (2400 and 9600 bps) to
+ increase telemetry radio range. This reduces the amount of
+ data received as well as increasing battery consumption in
+ the transmitter.
+
+ * Change TeleGPS to have only a single log, and append new
+ data to it rather than using seperate per-flight logs. This
+ avoids accidentally filling up log storage by turning
+ TeleGPS on/off several times.
+
+ AltOS Fixes
+
+ * Increase the maximum range for altitude values from +/-32767m
+ to +/-2147483647m, allowing the flight computers to function
+ correctly above the 32km level.
+
+ * Continuously test pyro firing conditions during delay stage,
+ inhibiting the pyro channel if the test fails. This prevents
+ firing pyro charges where the conditions were good before
+ the delay, but become bad before the delay expires.
+
+ * Allow negative numbers in pyro configuration values. This
+ lets you specify things like descending speed or
+ deceleration.
+
+ == AltosUI and TeleGPS Applications
+
+ AltosUI and TeleGPS New Features
+
+ * Support telemetry baud rate selection. Adds menus to
+ the flight monitoring and configuration for baud rate
+ selection.
+
+ * Support APRS SSID configuration.
+
+ * Integrate with file managers. This provides icons for all of
+ our file types and associates our application with the files
+ so that using a file manager to open a AltOS data file
+ results in launching our application.
+
+ AltosUI Fixes
+
+ * Make the 'Graph' button on the landed tab work again.
+
+ * Make tests for Java on Windows a bit smarter, and also
+ provide the user with the option to skip installing Java for
+ cases where we just can't figure out what version is installed.
+++ /dev/null
-<?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.5 is a major release. It includes support for our new
- EasyMega product, new features and bug fixes in in the flight
- software for all our boards and the AltosUI ground station
- </para>
- <para>
- AltOS New Features
- <itemizedlist>
- <listitem>
- <para>
- Add support for EasyMega boards.
- </para>
- </listitem>
- <listitem>
- <para>
- Make the APRS SSID be configurable. This lets you track
- different rockets on the same receiver without getting
- things mixed up.
- </para>
- </listitem>
- <listitem>
- <para>
- Report extra pyro channel continuity state on EasyMega and
- TeleMega via the beeper. This lets you easily verify flight
- readiness on these boards after powering up the electronics
- on the rail.
- </para>
- </listitem>
- <listitem>
- <para>
- Add lower telemetry data rates (2400 and 9600 bps) to
- increase telemetry radio range. This reduces the amount of
- data received as well as increasing battery consumption in
- the transmitter.
- </para>
- </listitem>
- <listitem>
- <para>
- Change TeleGPS to have only a single log, and append new
- data to it rather than using seperate per-flight logs. This
- avoids accidentally filling up log storage by turning
- TeleGPS on/off several times.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltOS Fixes
- <itemizedlist>
- <listitem>
- <para>
- Increase the maximum range for altitude values from +/-32767m
- to +/-2147483647m, allowing the flight computers to function
- correctly above the 32km level.
- </para>
- </listitem>
- <listitem>
- <para>
- Continuously test pyro firing conditions during delay stage,
- inhibiting the pyro channel if the test fails. This prevents
- firing pyro charges where the conditions were good before
- the delay, but become bad before the delay expires.
- </para>
- </listitem>
- <listitem>
- <para>
- Allow negative numbers in pyro configuration values. This
- lets you specify things like descending speed or
- deceleration.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI and TeleGPS New Features
- <itemizedlist>
- <listitem>
- <para>
- Support telemetry baud rate selection. Adds menus to
- the flight monitoring and configuration for baud rate
- selection.
- </para>
- </listitem>
- <listitem>
- <para>
- Support APRS SSID configuration.
- </para>
- </listitem>
- <listitem>
- <para>
- Integrate with file managers. This provides icons for all of
- our file types and associates our application with the files
- so that using a file manager to open a AltOS data file
- results in launching our application.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI Fixes
- <itemizedlist>
- <listitem>
- <para>
- Make the 'Graph' button on the landed tab work again.
- </para>
- </listitem>
- <listitem>
- <para>
- Make tests for Java on Windows a bit smarter, and also
- provide the user with the option to skip installing Java for
- cases where we just can't figure out what version is installed.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>8 January 2015</date>
+<copyright>
+ <year>2015</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>15 July 2015</date>
+<copyright>
+ <year>2015</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 1.6.1
+:toc!:
+:doctype: article
+
+ Version 1.6.1 includes support for our updated TeleBT v3.0
+ product and bug fixes in in the flight software for all our boards
+ and ground station interfaces.
+
+ == AltOS
+
+ AltOS New Features:
+
+ * Add support for TeleBT v3.0 boards.
+
+ * Add support for uncompressed APRS data, providing support
+ for older APRS receivers. Uncompressed APRS data is less
+ precise, takes more bandwidth and doesn't have integrated
+ altitude data.
+
+ AltOS Fixes:
+
+ * Make TeleDongle and TeleBT more tolerant of data rate
+ variations from transmitting devices.
+
+ == AltosUI and TeleGPS Applications
+
+ AltosUI and TeleGPS New Features:
+
+ * Add map to Monitor Idle display. It's nice to be able to
+ verify that maps are working, instead of needing to use
+ Monitor Flight.
+
+ AltosUI and TeleGPS Fixes:
+
+ * Fix frequency configuration to round values instead of
+ truncate them, avoiding a common 1kHz error in the setting.
+
+ * Turn the Windows stub into a more useful program that can
+ launch the application with parameters so that file manager
+ icons work more reliably.
+
+ * Force KML export to use a C locale so that numbers are
+ formatted with '.' instead of ',' for a decimal separator in
+ non-US locales.
+
+ * Preload map tiles based on distance rather than number of
+ tiles; this means you get the same resolution covering the
+ entire area, rather than having high resolution near the
+ center and low resolution further away.
+
+ * Allow configuration of frequency and callsign in Monitor
+ Idle mode.
+
+ * Fix layout weirdness when resizing windows on
+ Windows. Windows shouldn't have giant blank spaces around
+ the useful content anymore.
+
+ * Fix layout weirdness when resizing windows on
+ Windows. Windows shouldn't have giant blank spaces around
+ the useful content anymore.
+
+ * Use a longer filter for descent speed values. This should
+ provide something more useful on the display, although it
+ will take longer to respond to changes now.
+
+ * Make Replay Flight run in realtime again. It had been set to
+ run at 10x speed by mistake.
+
+ == AltosDroid
+
+ AltosDroid New Features:
+
+ * Add offline map support using mapping code from AltosUI.
+
+ * Support TeleDongle (and TeleBT via USB) on devices
+ supporting USB On-The-Go.
+
+ * Display additional TeleMega pyro channel status in Pad tab.
+
+ * Switch between metric and imperial units.
+
+ * Monitor TeleBT battery voltage.
+
+ * Track multiple devices at the same time, selecting between
+ them with a menu or using the map.
+
+ * Add hybrid, satellite and terrain map types.
+
+ AltosDroid Fixes:
+
+ * Use standard Android display conventions so that a menu
+ button is available in the application title bar.
+
+ * Adjust layout to work on large and small screens; shrinking
+ the go/no-go lights in smaller environments to try and make
+ everything visible.
+
+ * Make voice announcements depend on current tab.
+
+ * Compute adjustment to current travel direction while in
+ motion towards rocket.
+++ /dev/null
-<?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.6.1 includes support for our updated TeleBT v3.0
- product and bug fixes in in the flight software for all our boards
- and ground station interfaces.
- </para>
- <para>
- AltOS New Features
- <itemizedlist>
- <listitem>
- <para>
- Add support for TeleBT v3.0 boards.
- </para>
- </listitem>
- <listitem>
- <para>
- Add support for uncompressed APRS data, providing support
- for older APRS receivers. Uncompressed APRS data is less
- precise, takes more bandwidth and doesn't have integrated
- altitude data.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltOS Fixes
- <itemizedlist>
- <listitem>
- <para>
- Make TeleDongle and TeleBT more tolerant of data rate
- variations from transmitting devices.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI and TeleGPS New Features
- <itemizedlist>
- <listitem>
- <para>
- Add map to Monitor Idle display. It's nice to be able to
- verify that maps are working, instead of needing to use
- Monitor Flight.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI Fixes
- <itemizedlist>
- <listitem>
- <para>
- Fix frequency configuration to round values instead of
- truncate them, avoiding a common 1kHz error in the setting.
- </para>
- </listitem>
- <listitem>
- <para>
- Turn the Windows stub into a more useful program that can
- launch the application with parameters so that file manager
- icons work more reliably.
- </para>
- </listitem>
- <listitem>
- <para>
- Force KML export to use a C locale so that numbers are
- formatted with '.' instead of ',' for a decimal separator in
- non-US locales.
- </para>
- </listitem>
- <listitem>
- <para>
- Preload map tiles based on distance rather than number of
- tiles; this means you get the same resolution covering the
- entire area, rather than having high resolution near the
- center and low resolution further away.
- </para>
- </listitem>
- <listitem>
- <para>
- Allow configuration of frequency and callsign in Monitor
- Idle mode.
- </para>
- </listitem>
- <listitem>
- <para>
- Fix layout weirdness when resizing windows on
- Windows. Windows shouldn't have giant blank spaces around
- the useful content anymore.
- </para>
- </listitem>
- <listitem>
- <para>
- Fix layout weirdness when resizing windows on
- Windows. Windows shouldn't have giant blank spaces around
- the useful content anymore.
- </para>
- </listitem>
- <listitem>
- <para>
- Use a longer filter for descent speed values. This should
- provide something more useful on the display, although it
- will take longer to respond to changes now.
- </para>
- </listitem>
- <listitem>
- <para>
- Make Replay Flight run in realtime again. It had been set to
- run at 10x speed by mistake.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosDroid New Features
- <itemizedlist>
- <listitem>
- <para>
- Add offline map support using mapping code from AltosUI.
- </para>
- </listitem>
- <listitem>
- <para>
- Support TeleDongle (and TeleBT via USB) on devices
- supporting USB On-The-Go.
- </para>
- </listitem>
- <listitem>
- <para>
- Display additional TeleMega pyro channel status in Pad tab.
- </para>
- </listitem>
- <listitem>
- <para>
- Switch between metric and imperial units.
- </para>
- </listitem>
- <listitem>
- <para>
- Monitor TeleBT battery voltage.
- </para>
- </listitem>
- <listitem>
- <para>
- Track multiple devices at the same time, selecting between
- them with a menu or using the map.
- </para>
- </listitem>
- <listitem>
- <para>
- Add hybrid, satellite and terrain map types.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosDroid Fixes
- <itemizedlist>
- <listitem>
- <para>
- Use standard Android display conventions so that a menu
- button is available in the application title bar.
- </para>
- </listitem>
- <listitem>
- <para>
- Adjust layout to work on large and small screens; shrinking
- the go/no-go lights in smaller environments to try and make
- everything visible.
- </para>
- </listitem>
- <listitem>
- <para>
- Make voice announcements depend on current tab.
- </para>
- </listitem>
- <listitem>
- <para>
- Compute adjustment to current travel direction while in
- motion towards rocket.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>10 January 2016</date>
+<copyright>
+ <year>2016</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+= Release Notes for Version 1.6.2
+:toc!:
+:doctype: article
+
+ Version 1.6.2 includes support for our updated TeleMega v2.0
+ product and bug fixes in in the flight software for all our boards
+ and ground station interfaces.
+
+ == AltOS
+
+ AltOS New Features:
+
+ * Add support for TeleMega v2.0 boards.
+
+ * Add PWM servo driver. There's no higher level code using
+ this yet, but the driver allows testing of the TeleMega v2.0
+ servo output connector.
+
+ AltOS Fixes:
+
+ * Slow down telemetry packets to allow receiver to keep
+ up.
+
+ == AltosUI and TeleGPS Applications
+
+ AltosUI and TeleGPS Fixes:
+
+ * Fix post-flight orientation computation when processing
+ TeleMega and EasyMega eeprom data files.
+
+ * Capture complete eeprom data even when there are invalid
+ entries in the data. This keeps reading eeprom contents and
+ writing the associated .eeprom file when an error is detected.
+
+ == Documentation
+
+ We spent a bunch of time trying to improve our documentation
+
+ * HTML versions now have a table of contents on the left side.
+
+ * EasyMini now has its own shorter manual.
+
+ * Provide links between sections in each document.
+
+ * Lots of minor rewriting and restructuring to avoid
+ duplication of information
--- /dev/null
+= Release Notes for Version 1.6
+:toc!:
+:doctype: article
+
+ Version 1.6 includes support for our updated TeleDongle v3.0
+ product and bug fixes in in the flight software for all our boards
+ and ground station interfaces.
+
+ == AltOS
+
+ AltOS New Features
+
+ * Add support for TeleDongle v3.0 boards.
+
+ AltOS Fixes
+
+ * Don't beep out the continuity twice by accident in idle mode.
+ If the battery voltage report takes longer than the initialiation
+ sequence, the igniter continuity would get reported twice.
+
+ * Record all 32 bits of gyro calibration data in TeleMega and
+ EasyMega log files. This fixes computation of the gyro rates
+ in AltosUI.
+
+ * Change TeleDongle LED usage. Green LED flashes when valid
+ packet is received. Red LED flashes when invalid packet is
+ received.
+
+ * Replace LPC11U14 SPI driver with non-interrupt version. The
+ interrupt code would occasionally wedge on long transfers
+ if interrupts were blocked for too long. This affects all
+ released TeleGPS products; if you have a TeleGPS device,
+ you'll want to reflash the firmware.
+
+ == AltosUI and TeleGPS Applications
+
+ AltosUI and TeleGPS New Features
+
+ * Compute tilt angle from TeleMega and EasyMega log
+ files. This duplicates the quaternion-based angle tracking
+ code from the flight firmware inside the ground station
+ software so that post-flight analysis can include evaluation
+ of the tilt angle.
+
+ * Shows the tool button window when starting with a data file
+ specified. This means that opening a data file from the file
+ manager will now bring up the main window to let you operate
+ the whole application.
+
+ AltosUI Fixes
+
+ * Show the 'Connecting' dialog when using Monitor Idle. Lets
+ you cancel the Monitor Idle startup when connecting over the
+ radio link.
+
+ * Make 'Monitor Idle' work for TeleGPS devices when connected
+ over USB. It's nice for testing without needing to broadcast
+ over the radio.
+
+ * Use different Windows API to discover USB devices. This
+ works better on my Windows 7 box, and will be used if the
+ older API fails to provide the necessary information.
+
+ * Look in more places in the registry to try and identify the
+ installed Java version on Windows. If you install the
+ default 32-bit version of Windows on a 64-bit OS, the Java
+ registry information is hiding \SOFTWARE\Wow6432Node for
+ some reason.
+
+ * Fix file association on Windows by searching for the
+ javaw.exe program instead of assuming it is in
+ %SYSTEMROOT%. This makes double-clicking on Altus Metrum
+ data files in the file manager work correctly.
+
+ * When replaying a file, put 'done' in the Age field when we
+ reach the end of the file, instead of continuing to count forever.
+
+ * In the Scan Channels code, wait for five seconds if we see
+ any packet. This is needed because AltOS now sends the
+ callsign, serial number and flight number only once every
+ five seconds these days.
+
+ * In the Scan Channels code, reset pending flight state
+ information each time we change channels. This avoids having
+ flight computers appear on multiple frequencies by accident.
+++ /dev/null
-<?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.6 includes support for our updated TeleDongle v3.0
- product and bug fixes in in the flight software for all our boards
- and ground station interfaces.
- </para>
- <para>
- AltOS New Features
- <itemizedlist>
- <listitem>
- <para>
- Add support for TeleDongle v3.0 boards.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltOS Fixes
- <itemizedlist>
- <listitem>
- <para>
- Don't beep out the continuity twice by accident in idle mode.
- If the battery voltage report takes longer than the initialiation
- sequence, the igniter continuity would get reported twice.
- </para>
- </listitem>
- <listitem>
- <para>
- Record all 32 bits of gyro calibration data in TeleMega and
- EasyMega log files. This fixes computation of the gyro rates
- in AltosUI.
- </para>
- </listitem>
- <listitem>
- <para>
- Change TeleDongle LED usage. Green LED flashes when valid
- packet is received. Red LED flashes when invalid packet is
- received.
- </para>
- </listitem>
- <listitem>
- <para>
- Replace LPC11U14 SPI driver with non-interrupt version. The
- interrupt code would occasionally wedge on long transfers
- if interrupts were blocked for too long. This affects all
- released TeleGPS products; if you have a TeleGPS device,
- you'll want to reflash the firmware.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI and TeleGPS New Features
- <itemizedlist>
- <listitem>
- <para>
- Compute tilt angle from TeleMega and EasyMega log
- files. This duplicates the quaternion-based angle tracking
- code from the flight firmware inside the ground station
- software so that post-flight analysis can include evaluation
- of the tilt angle.
- </para>
- </listitem>
- <listitem>
- <para>
- Shows the tool button window when starting with a data file
- specified. This means that opening a data file from the file
- manager will now bring up the main window to let you operate
- the whole application.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- AltosUI Fixes
- <itemizedlist>
- <listitem>
- <para>
- Show the 'Connecting' dialog when using Monitor Idle. Lets
- you cancel the Monitor Idle startup when connecting over the
- radio link.
- </para>
- </listitem>
- <listitem>
- <para>
- Make 'Monitor Idle' work for TeleGPS devices when connected
- over USB. It's nice for testing without needing to broadcast
- over the radio.
- </para>
- </listitem>
- <listitem>
- <para>
- Use different Windows API to discover USB devices. This
- works better on my Windows 7 box, and will be used if the
- older API fails to provide the necessary information.
- </para>
- </listitem>
- <listitem>
- <para>
- Look in more places in the registry to try and identify the
- installed Java version on Windows. If you install the
- default 32-bit version of Windows on a 64-bit OS, the Java
- registry information is hiding \SOFTWARE\Wow6432Node for
- some reason.
- </para>
- </listitem>
- <listitem>
- <para>
- Fix file association on Windows by searching for the
- javaw.exe program instead of assuming it is in
- %SYSTEMROOT%. This makes double-clicking on Altus Metrum
- data files in the file manager work correctly.
- </para>
- </listitem>
- <listitem>
- <para>
- When replaying a file, put 'done' in the Age field when we
- reach the end of the file, instead of continuing to count forever.
- </para>
- </listitem>
- <listitem>
- <para>
- In the Scan Channels code, wait for five seconds if we see
- any packet. This is needed because AltOS now sends the
- callsign, serial number and flight number only once every
- five seconds these days.
- </para>
- </listitem>
- <listitem>
- <para>
- In the Scan Channels code, reset pending flight state
- information each time we change channels. This avoids having
- flight computers appear on multiple frequencies by accident.
- </para>
- </listitem>
- </itemizedlist>
- </para>
-</article>
--- /dev/null
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<copyright>
+ <year>2015</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="../themes/background.png" width="6.0in"/>
+ </imageobject>
+</mediaobject>
+<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>
--- /dev/null
+[appendix]
+== Release Notes
+
+ :leveloffset: 2
+ include::release-notes-1.6.2.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.6.1.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.6.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.5.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.4.2.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.4.1.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.4.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.3.2.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.3.1.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.3.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.2.1.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.2.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.1.1.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.1.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.0.1.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-0.9.2.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-0.9.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-0.8.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-0.7.1.raw[]
+
+ :leveloffset: 0
--- /dev/null
+[appendix]
+== Altus Metrum Hardware Specifications
+
+ Here's the full set of Altus Metrum products, both in
+ production and retired.
+
+ .Altus Metrum Flight Computer Electronics
+ [options="header"]
+ |================================
+ |Device | Barometer | Z-axis accel | GPS | 3D sensors | Storage | RF Output | Battery
+
+ ifdef::telemetrum[]
+ |TeleMetrum v1.0
+ |MP3H6115 10km (33k')
+ |MMA2202 50g
+ |SkyTraq
+ |-
+ |1MB
+ |10mW
+ |3.7V
+
+ |TeleMetrum v1.1
+ |MP3H6115 10km (33k')
+ |MMA2202 50g
+ |SkyTraq
+ |-
+ |2MB
+ |10mW
+ |3.7V
+
+ |TeleMetrum v1.2
+ |MP3H6115 10km (33k')
+ |ADXL78 70g
+ |SkyTraq
+ |-
+ |2MB
+ |10mW
+ |3.7V
+
+ |TeleMetrum v2.0
+ |MS5607 30km (100k')
+ |MMA6555 102g
+ |uBlox Max-7Q
+ |-
+ |8MB
+ |40mW
+ |3.7V
+ endif::telemetrum[]
+
+ ifdef::telemini[]
+ |TeleMini v1.0
+ |MP3H6115 10km (33k')
+ |-
+ |-
+ |-
+ |5kB
+ |10mW
+ |3.7V
+
+ endif::telemini[]
+
+ ifdef::easymini[]
+ |EasyMini v1.0
+ |MS5607 30km (100k')
+ |-
+ |-
+ |-
+ |1MB
+ |-
+ |3.7-12V
+ endif::easymini[]
+
+ ifdef::telemega[]
+ |TeleMega v1.0
+ |MS5607 30km (100k')
+ |MMA6555 102g
+ |uBlox Max-7Q
+ |MPU6000 HMC5883
+ |8MB
+ |40mW
+ |3.7V
+ endif::telemega[]
+
+ ifdef::easymega[]
+ |EasyMega v1.0
+ |MS5607 30km (100k')
+ |MMA6555 102g
+ |-
+ |MPU6000 HMC5883
+ |8MB
+ |-
+ |3.7V
+ endif::easymega[]
+
+ |==============================
+
+ <<<<
+ .Altus Metrum Flight Computer Mechanical Components
+ [options="header",grid="all"]
+ |==============================
+ |Device|Connectors|Screw Terminals|Width|Length|Tube Size
+
+ ifdef::telemetrum[]
+ |TeleMetrum
+ |Antenna Debug Companion USB Battery
+ |Apogee pyro Main pyro Switch
+ |1 inch (2.54cm)
+ |2 ¾ inch (6.99cm)
+ |29mm coupler
+ endif::telemetrum[]
+
+ ifdef::telemini[]
+ |TeleMini v1.0
+ |Antenna Debug Battery
+ |Apogee pyro Main pyro
+ |½ inch (1.27cm)
+ |1½ inch (3.81cm)
+ |18mm coupler
+
+ |TeleMini v2.0
+ |Antenna Debug USB Battery
+ |Apogee pyro Main pyro Battery Switch
+ |0.8 inch (2.03cm)
+ |1½ inch (3.81cm)
+ |24mm coupler
+ endif::telemini[]
+
+ ifdef::easymini[]
+ |EasyMini
+ |Debug USB Battery
+ |Apogee pyro Main pyro Battery
+ |0.8 inch (2.03cm)
+ |1½ inch (3.81cm)
+ |24mm coupler
+ endif::easymini[]
+
+ ifdef::telemega[]
+ |TeleMega
+ |Antenna Debug Companion USB Battery
+ |Apogee pyro Main pyro Pyro A-D Switch Pyro battery
+ |1¼ inch (3.18cm)
+ |3¼ inch (8.26cm)
+ |38mm coupler
+ endif::telemega[]
+
+ ifdef::easymega[]
+ |EasyMega
+ |Debug Companion USB Battery
+ |Apogee pyro Main pyro Pyro A-D Switch Pyro battery
+ |1¼ inch (3.18cm)
+ |2¼ inch (5.62cm)
+ |38mm coupler
+ endif::easymega[]
+
+ |====================================
--- /dev/null
+[appendix]
+== System Operation
+
+ === Firmware Modes
+
+ 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.
+ ifdef::telemetrum,telemega,easymega[]
+ For
+ TeleMetrum, TeleMega and EasyMega, which have accelerometers, 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
+ the flight computer 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.
+ endif::telemetrum,telemega,easymega[]
+ Since
+ EasyMini doesn't
+ have an
+ accelerometer we can use to determine orientation, “idle” mode
+ is selected if the board is connected via USB to a computer,
+ otherwise the board enters “flight” mode.
+ ifdef::telemini[]
+ TeleMini v1.0
+ selects “idle” mode if it receives a command packet within the
+ first five seconds of operation.
+ endif::telemini[]
+
+ At power on, the altimeter will beep out the battery voltage
+ to the nearest tenth of a volt. Each digit is represented by
+ a sequence of short “dit” beeps, with a pause between
+ digits. A zero digit is represented with one long “dah”
+ beep. Then there will be a short pause while the altimeter
+ completes initialization and self test, and decides which mode
+ to enter next.
+
+ 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 which is made by rapidly
+ alternating between two tones 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.
+
+ 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.
+ ifdef::radio[]
+ The altimeters also listen for the radio link when in idle
+ mode for requests sent via TeleDongle. Commands can be issued
+ in idle mode over either USB or the radio link
+ equivalently.
+ ifdef::telemini[TeleMini v1.0 only has the radio link.]
+ endif::radio[]
+ 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.
+
+ In “Idle” and “Pad” modes, once the mode indication
+ beeps/flashes and continuity indication has been sent, if
+ there is no space available to log the flight in on-board
+ memory, the flight computer will emit a warbling tone (much
+ slower than the “no continuity tone”)
+
+ See <<_understanding_beeps>> for a summary of all of
+ the audio signals used.
+
+ Once landed, the flight computer will signal that by emitting
+ the “Landed” sound described above, after which it will beep
+ out the apogee height (in meters). Each digit is represented
+ by a sequence of short “dit” beeps, with a pause between
+ digits. A zero digit is represented with one long “dah”
+ beep. The flight computer will continue to report landed mode
+ and beep out the maximum height until turned off.
+
+ ifdef::telemetrum,telemega,easymega[]
+ One “neat trick” of particular value when TeleMetrum, TeleMega
+ or EasyMega are 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!
+ endif::telemetrum,telemega,easymega[]
+
+ ifdef::telemini[]
+ TeleMini v1.0 is configured solely via the radio link. Of course, that
+ means you need to know the TeleMini radio configuration values
+ or you won't be able to communicate with it. For situations
+ when you don't have the radio configuration values, TeleMini v1.0
+ offers an 'emergency recovery' mode. In this mode, TeleMini is
+ configured as follows:
+
+
+ * Sets the radio frequency to 434.550MHz
+ * Sets the radio calibration back to the factory value.
+ * Sets the callsign to N0CALL
+ * Does not go to 'pad' mode after five seconds.
+
+ To get into 'emergency recovery' mode, first find the row of
+ four small holes opposite the switch wiring. Using a short
+ piece of small gauge wire, connect the outer two holes
+ together, then power TeleMini up. Once the red LED is lit,
+ disconnect the wire and the board should signal that it's in
+ 'idle' mode after the initial five second startup
+ period.
+ endif::telemini[]
+
+ ifdef::gps[]
+ === GPS
+
+ TeleMetrum and TeleMega include 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 GPS receiver
+ needs to lock onto at least four satellites to obtain a solid
+ 3 dimensional position fix and know what time it is.
+
+ The flight computers provide 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
+ 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.
+ endif::gps[]
+
+ ifdef::radio[]
+ === Controlling An Altimeter Over The Radio Link
+
+ 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.
+
+ Any operation which can be performed with a flight computer can
+ either be done with the device directly connected to the
+ computer via the USB cable, or through the radio
+ link. TeleMini v1.0 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.
+
+ 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.
+
+ * Save Flight Data—Recover flight data from the
+ rocket without opening it up.
+
+ * Configure altimeter apogee delays, main deploy
+ heights and additional pyro event conditions to
+ respond to changing launch conditions. You can also
+ 'reboot' the altimeter. Use this to remotely enable
+ the flight computer by turning TeleMetrum or
+ TeleMega 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.
+
+ * Fire Igniters—Test your deployment charges without snaking
+ wires out through holes in the air-frame. Simply assemble the
+ rocket as if for flight with the apogee and main charges
+ loaded, then remotely command the altimeter to fire the
+ igniters.
+
+ 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.
+
+ The flight computers only enable radio commanding in
+ 'idle' mode. TeleMetrum and TeleMega use the
+ accelerometer to detect which orientation they start
+ up in, so make sure you have the flight computer lying
+ horizontally when you turn it on. Otherwise, it will
+ start in 'pad' mode ready for flight, and will not be
+ listening for command packets from TeleDongle.
+
+ 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.
+
+ 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 transmitted, while the green LED will light up on TeleDongle when
+ it is waiting to receive a packet from the altimeter.
+ endif::radio[]
+
+ === Ground Testing
+
+ An important aspect of preparing a rocket using electronic deployment
+ for flight is ground testing the recovery system.
+ ifdef::radio[]
+ Thanks
+ to the bi-directional radio link central to the Altus Metrum system,
+ this can be accomplished in a TeleMega, TeleMetrum or TeleMini equipped rocket
+ with less work than you may be accustomed to with other systems. It
+ can even be fun!
+ endif::radio[]
+
+ Just prep the rocket for flight, then power up the altimeter
+ in “idle”
+ ifdef::telemetrum,telemega,telemini[]
+ mode (placing air-frame horizontal for TeleMetrum or TeleMega, or
+ selecting 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.
+ endif::telemetrum,telemega,telemini[]
+ ifndef::telemetrum,telemega,telemini[]
+ mode.
+ endif::telemetrum,telemega,telemini[]
+ You can now command the altimeter to fire the apogee
+ or main charges from a safe distance using your
+ computer and the Fire Igniter tab to complete ejection testing.
+
+ ifdef::radio[]
+ === Radio Link
+
+ TeleMetrum, TeleMini and TeleMega all incorporate 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.
+
+ 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.
+
+ We don't generally 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 forward error correction and
+ interleaving, this allows us to have a very robust
+ 19.2 kilobit data link with only 10-40 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 with
+ our 10mW units and over 100k feet AGL with the 40mW
+ devices. We hope to fly boards to higher altitudes
+ over time, and would of course appreciate customer
+ feedback on performance in higher altitude flights!
+ endif::radio[]
+
+ ifdef::gps+radio[]
+ :aprsdevices: TeleMetrum v2.0 and TeleMega
+ :configure_section: _configure_altimeter
+ include::aprs-operation.raw[]
+ endif::gps+radio[]
+
+ === Configurable Parameters
+
+ Configuring an Altus Metrum altimeter for flight is
+ very simple. Even on our baro-only TeleMini and
+ EasyMini boards, the use of a Kalman filter means
+ there is no need to set a “mach delay”. All of the
+ configurable parameters can be set using AltosUI. Read
+ <<_configure_altimeter>> for more information.
--- /dev/null
+== TeleGPS Application
+
+ The TeleGPS application provides a graphical user interface for
+ interacting with the Altus Metrum product family. TeleGPS can
+ monitor telemetry data, configure devices and many other
+ tasks. The primary interface window is for displaying data
+ received over the telemetry link. There are additional
+ tasks available from the main window menu bar.
+
+ === Telemetry Monitoring
+
+ This is the window brought up when you start the
+ application. If you have a TeleDongle device connected
+ to the computer, it will automatically be selected for
+ telemetry monitoring
+
+ All telemetry data received are automatically recorded
+ in suitable log files. The name of the files includes
+ the current date and TeleGPS serial and flight
+ numbers.
+
+ 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. The TeleGPS
+ application remembers the last frequency selected for
+ each TeleDongle and selects that automatically the
+ next time you use that device.
+
+ Below the TeleDongle frequency selector, the window
+ contains a few significant pieces of information about
+ the altimeter providing the telemetry data stream:
+
+ * The configured call-sign
+
+ * The device serial number
+
+ * The flight number. TeleGPS remembers how many times
+ it has flown.
+
+ * 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 -100dBm; weaker signals may not be
+ receivable. The packet link uses error detection and
+ correction techniques which prevent incorrect data
+ from being reported.
+
+ * The age of the displayed data, in seconds since the
+ last successfully received telemetry packet. In
+ normal operation this will stay in the low single
+ digits. If the number starts counting up, then you
+ are no longer receiving data over the radio link
+ from the flight computer.
+
+ Finally, the largest portion of the window contains a set of
+ tabs, each of which contain some information about the TeleGPS
+ board. The final 'table' tab displays many of the raw telemetry
+ values in one place in a spreadsheet-like format.
+
+ ==== Map
+
+ The Map tab shows the TeleGPS track over time
+ on top of map data making it easy to locate
+ the device.
+
+ .TeleGPS Map View
+ image::telegps-map.png[width="5.5in"]
+
+ The map's default 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.
+
+ You can adjust the style of map and the zoom
+ level with buttons on the right side of the
+ map window. You can draw a line on the map by
+ moving the mouse over the map with a button
+ other than the left one pressed, or by
+ pressing the left button while also holding
+ down the shift key. The length of the line in
+ real-world units will be shown at the start of
+ the line.
+
+ 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.
+
+ You can pre-load images for your favorite
+ launch sites before you leave home; check out
+ <<_load_maps>>.
+
+ ==== Location
+
+ The Location tab shows the raw GPS data
+ received from TeleGPS.
+
+ .TeleGPS Location View
+ image::telegps-location.png[width="5.5in"]
+
+ ==== Status
+
+ The Status tab shows data relative to the
+ location of TeleGPS when the application first
+ received telemetry from it.
+
+ .TeleGPS Status View
+ image::telegps-status.png[width="5.5in"]
+
+ ==== Table
+
+ The Table tab shows detailed information about
+ the GPS receiver
+
+ .TeleGPS Information Table
+ image::telegps-table.png[width="5.5in"]
+
+ === TeleGPS Menus
+
+ TeleGPS has three or four menus at the top of
+ the window:
+
+ File::
+
+ New Window, Graph Data, Export Data, Load Maps,
+ Preferences, Close and Exit
+
+ Monitor::
+
+ Connect Device, Disconnect and Scan Channels
+
+ Device::
+
+ Download Data, Configure Device and Flash Device
+
+ Frequency::
+
+ This shows the current monitoring frequency with a
+ drop-down menu listing other configured
+ frequencies. You can change the set of frequencies
+ shown here from the Preferences dialog. This menu is
+ only shown when the TeleGPS application is connected
+ to a TeleDongle or TeleBT device.
+
+
+ ==== New Window
+
+ This creates another telemetry monitoring window, in case
+ you have multiple TeleDongle devices connected to the
+ computer.
+
+ === Graph Data
+
+ The Graph tab shows a plot of the the GPS data
+ collected. The X axis is time in seconds; there are a
+ variety of Y axes available for different kinds of
+ data. This window also allows you to see some
+ statistics computed from the data, and an overall map
+ of the entire data record.
+
+ ==== Data Graph
+
+ .TeleGPS Graph
+ image::telegps-graph-graph.png[width="5.5in"]
+
+ ==== Graph Configuration
+
+ .TeleGPS Graph Configuration
+ image::telegps-graph-configure.png[width="5.5in"]
+
+ This selects which graph elements to show, and, at the
+ bottom, lets you switch between metric and imperial
+ units
+
+ ==== Statistics
+
+ .TeleGPS Statistics
+ image::telegps-graph-stats.png[width="5.5in"]
+
+ Shows overall data computed from the flight.
+
+ ==== Map
+
+ .TeleGPS Map
+ image::telegps-graph-map.png[width="6in"]
+
+ Shows a map of the area overlaid with the GPS track. As with
+ the telemetry monitoring window, you can select the style
+ of map and zoom level using buttons along the side;
+ you can scroll the map by dragging within the map pressing
+ the left button and you can draw a line to measure
+ distances using either the left button with the shift key,
+ or any other button.
+
+ === Export Data
+
+ 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 data file, which
+ can be either a .eeprom or .telem. The .eeprom files
+ contain higher resolution and more continuous data,
+ while .telem files contain receiver signal strength
+ information. 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.
+
+ ==== Comma Separated Value Format
+
+ 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 TeleGPS, 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.
+
+ 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.
+
+ ==== Keyhole Markup Language (for Google Earth)
+
+ 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 path in 3D.
+
+ include::load-maps.raw[]
+
+ === Preferences
+
+ .TeleGPS Preferences Window
+ image::telegps-preferences.png[width="2.4in"]
+
+ include::config-ui.raw[]
+
+ === Close
+
+ This closes the current window, leaving any other windows
+ open and the application running.
+
+ === Exit
+
+ This closes all TeleGPS windows and terminates the
+ application.
+
+ === Connect Device
+
+ Selecting this item brings up a dialog box listing all
+ of the connected TeleDongle devices. When you choose
+ one of these, AltosUI will display telemetry data as
+ received by the selected TeleDongle device.
+
+ .Device Selection Dialog
+ image::device-selection.png[width="3.1in"]
+
+ === Disconnect
+
+ Disconnects the currently connected TeleDongle or
+ TeleBT
+
+ === Scan Channels
+
+ .Radio Scanning Dialog
+ image::telegps-scan.png[width="3.1in"]
+
+ Scans the configured set of frequencies looking for
+ telemetry signals. A list of all of the discovered
+ signals is show; selecting one of those and clicking
+ on 'Monitor' will select that frequency in the
+ associated TeleGPS application window.
+
+ === Download Data
+
+ TeleGPS records data to its internal flash memory.
+ On-board data is recorded at the same rate as
+ telemetry but is not subject to radio drop-outs. As
+ such, it generally provides a more complete and
+ precise record. The 'Download Data' menu entry allows
+ you to read the flash memory and write it to disk.
+
+ Select the 'Download Data' menu entry to bring up a
+ list of connected TeleGPS devices. After the device
+ has been selected, a dialog showing the data stored in
+ the device will be shown allowing you to select which
+ entries to download and which to delete. You must
+ erase flights in order for the space they consume to
+ be reused by another track. This prevents accidentally
+ losing data if you neglect to download data before
+ starting TeleGPS again. Note that if there is no more
+ space available in the device, then no data will be
+ recorded.
+
+ The file name for each data log is computed
+ automatically from the recorded date, altimeter serial
+ number and flight number information.
+
+ === Configure Device
+
+ .TeleGPS Configuration Dialog
+ image::telegps-configure.png[width="3.6in"]
+
+ Select this button and then select any connected TeleGPS
+ device from the list provided.
+
+ 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.
+
+ At the bottom of the dialog, there are four buttons:
+
+ 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.
+
+ Reset::
+ This resets the dialog to the most recently saved
+ values, erasing any changes you have made.
+
+ 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.
+
+ Close::
+
+ This closes the dialog. Any unsaved changes will be
+ lost.
+
+ The rest of the dialog contains the parameters to be configured.
+
+ include::config-device.raw[]
+
+ === Flash Device
+
+ This reprograms TeleGPS devices with new
+ firmware. Please read the directions for flashing
+ devices in <<_updating_device_firmware>>.
--- /dev/null
+[dedication]
+== Acknowledgments
+
+ Thanks to Anthony (AJ) Towns for major contributions including
+ the TeleGPS 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!
+
+ Have fun using these products, and we hope to meet all of you
+ out on the rocket flight line somewhere.
+
+ [verse]
+ Bdale Garbee, KB0G
+ NAR #87103, TRA #12201
+
+ [verse]
+ Keith Packard, KD7SQG
+ NAR #88757, TRA #12200
--- /dev/null
+<subtitle>An Owner's Manual for the TeleGPS recording GPS tracker</subtitle>
+<author>
+ <firstname>Bdale</firstname>
+ <surname>Garbee</surname>
+ <email>bdale@gag.com</email>
+</author>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<copyright>
+ <year>2015</year>
+ <holder>Bdale Garbee and Keith Packard</holder>
+</copyright>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="telegps-v1.0-top.jpg" width="4.0in"/>
+ </imageobject>
+</mediaobject>
+<corpauthor>
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="telegps-oneline.svg" width="3in"/>
+ </imageobject>
+ </inlinemediaobject>
+</corpauthor>
+
+<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>
+ <?dbhtml filename="telegps-revhistory.html"?>
+ <revision>
+ <revnumber>1.6.1</revnumber>
+ <date>15 July 2015</date>
+ <revremark>
+ Minor release adding TeleBT v3.0 support.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.6</revnumber>
+ <date>8 January 2015</date>
+ <revremark>
+ Major release adding TeleDongle v3.0 support.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.5</revnumber>
+ <date>6 September 2014</date>
+ <revremark>
+ Major release adding EasyMega support.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.4.2</revnumber>
+ <date>17 August 2014</date>
+ <revremark>
+ Minor release fixing some Windows installation bugs.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.4.1</revnumber>
+ <date>20 June 2014</date>
+ <revremark>
+ Minor release fixing some installation bugs.
+ </revremark>
+ </revision>
+ <revision>
+ <revnumber>1.4</revnumber>
+ <date>15 June 2014</date>
+ <revremark>
+ Initial version
+ </revremark>
+ </revision>
+</revhistory>
--- /dev/null
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="849.46857"
+ height="136.09171"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="telegps-oneline-font.svg">
+ <defs
+ id="defs4">
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient3175"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3169">
+ <stop
+ style="stop-color:#ff8a00;stop-opacity:1;"
+ offset="0"
+ id="stop3171" />
+ <stop
+ id="stop3445"
+ offset="0.71698111"
+ style="stop-color:#c24573;stop-opacity:0.98039216;" />
+ <stop
+ style="stop-color:#8500e7;stop-opacity:0.96078432;"
+ offset="1"
+ id="stop3173" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient3171"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3165">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3167" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3169" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient2838"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3181">
+ <stop
+ style="stop-color:#ff8a00;stop-opacity:1;"
+ offset="0"
+ id="stop3183" />
+ <stop
+ id="stop3185"
+ offset="0.71698111"
+ style="stop-color:#c24573;stop-opacity:0.98039216;" />
+ <stop
+ style="stop-color:#8500e7;stop-opacity:0.96078432;"
+ offset="1"
+ id="stop3187" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient2840"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3190">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3192" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3194" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient2830"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3197">
+ <stop
+ style="stop-color:#ff8a00;stop-opacity:1;"
+ offset="0"
+ id="stop3199" />
+ <stop
+ id="stop3201"
+ offset="0.71698111"
+ style="stop-color:#c24573;stop-opacity:0.98039216;" />
+ <stop
+ style="stop-color:#8500e7;stop-opacity:0.96078432;"
+ offset="1"
+ id="stop3203" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient2832"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3206">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3208" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3210" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient2834"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3213">
+ <stop
+ style="stop-color:#ff8a00;stop-opacity:1;"
+ offset="0"
+ id="stop3215" />
+ <stop
+ id="stop3217"
+ offset="0.71698111"
+ style="stop-color:#c24573;stop-opacity:0.98039216;" />
+ <stop
+ style="stop-color:#8500e7;stop-opacity:0.96078432;"
+ offset="1"
+ id="stop3219" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient2836"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3222">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3224" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3226" />
+ </linearGradient>
+ <radialGradient
+ r="951.68701"
+ fy="2305.2668"
+ fx="951.68713"
+ cy="2305.2668"
+ cx="951.68713"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3232"
+ xlink:href="#linearGradient3169"
+ inkscape:collect="always" />
+ <radialGradient
+ r="951.68701"
+ fy="1205.2668"
+ fx="951.68713"
+ cy="1205.2668"
+ cx="951.68713"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3234"
+ xlink:href="#linearGradient3165"
+ inkscape:collect="always" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient4101"
+ cx="194.54575"
+ cy="361.16367"
+ fx="194.54575"
+ fy="361.16367"
+ r="70.597672"
+ gradientTransform="matrix(1,0,0,0.95908583,137.14286,74.776711)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.979899"
+ inkscape:cx="157.24908"
+ inkscape:cy="-0.91832278"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1617"
+ inkscape:window-height="1038"
+ inkscape:window-x="729"
+ inkscape:window-y="416"
+ inkscape:window-maximized="0" />
+ <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(-261.09094,-353.45446)">
+ <path
+ style="fill:url(#radialGradient4101);fill-opacity:1"
+ d="m 261.09094,466.61035 1.9122,-1.69399 39.0721,-36.4688 20.74158,22.05252 -40.71991,38.37279 z m 36.24983,1.34654 -14.08636,-15.38433 -15.33887,14.40857 14.50759,15.23741 z m 18.98704,-17.58715 -14.47613,-15.53942 -14.95191,14.42099 14.19976,15.37575 z m 43.2565,3.24033 -5.69326,-6.00917 -2.76929,1.85727 c -5.01515,3.36349 -10.61773,4.75193 -13.55344,3.35884 -0.90785,-0.4308 -11.20677,-10.85557 -16.46128,-16.61505 -6.3177,-6.92484 -17.77225,-18.68338 -18.08204,-21.53696 l -0.25491,-2.34789 -6.68224,-3.00173 -6.68224,-3.00173 -0.12416,-2.54849 c -0.24316,-4.99109 2.61694,-11.66135 7.10652,-16.57368 6.51922,-7.13306 14.23173,-10.81215 21.4071,-10.21178 l 2.49577,0.20881 2.34108,7.3087 2.34109,7.3087 2.0542,0.21626 c 1.12981,0.11895 2.29245,0.36702 2.58364,0.55127 0.29119,0.18424 11.17756,11.55849 16.63562,17.46044 5.67391,6.13537 16.35301,17.71615 16.74619,18.65715 1.36492,3.26672 -0.56522,9.34479 -4.44838,14.00803 -0.92939,1.1161 -1.6875,2.14976 -1.6847,2.29703 0.003,0.14726 2.44601,2.88431 5.42933,6.08233 2.98332,3.19801 5.42421,6.02814 5.42421,6.28919 0,0.66794 -0.91528,1.72591 -1.73982,2.01104 -0.50334,0.17406 -2.27007,-1.42112 -6.38899,-5.76858 z m -13.8944,-6.52384 c 0.96195,-0.49074 2.46683,-1.3673 3.34417,-1.94791 l 1.59519,-1.05564 -1.69025,-1.72225 c -1.71532,-1.74777 -2.09589,-2.99732 -1.1891,-3.90412 0.98407,-0.98406 2.33559,-0.53387 3.9423,1.31314 l 1.57825,1.81431 1.43638,-1.7099 c 1.7115,-2.03742 3.3933,-5.47555 3.39008,-6.9304 -0.0104,-4.68327 -7.01613,-2.68794 -13.36898,3.80766 -4.26282,4.35861 -6.32786,9.57528 -4.26584,10.77629 1.19252,0.69458 3.36009,0.51166 5.2278,-0.44118 z m -37.53066,-44.39022 c 2.23934,-2.70633 7.29399,-6.99375 10.13666,-8.59806 1.69887,-0.95877 2.21231,-1.46174 2.04152,-1.99985 -0.1255,-0.3954 -1.05734,-3.0661 -2.07077,-5.93487 l -1.84259,-5.21596 -1.60649,0.12825 c -4.1301,0.32972 -9.06228,2.86043 -13.29918,6.82384 -4.03277,3.77245 -7.7843,10.20829 -7.89014,13.53572 l -0.0463,1.4539 5.4085,2.47197 5.4085,2.47197 1.02919,-1.54008 c 0.56606,-0.84704 1.79503,-2.46562 2.73105,-3.59683 z m 32.91039,-10.47213 40.55794,-38.76942 c 7.09795,7.71166 14.5366,15.63755 20.65837,22.2503 l -40.53088,38.2414 z m 35.73645,1.02093 -14.2595,-15.3791 -15.29495,14.35785 14.65467,15.14661 z m 18.6801,-17.55816 -14.10162,-15.40128 -15.32812,14.3973 14.52992,15.24342 z"
+ id="path3063"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccscssascccssscccscasscsssssccssscssssscssscssccccsccccccccccccccccc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:195.13301086px;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none"
+ x="418.66663"
+ y="488.37537"
+ id="text3022"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="418.66663"
+ y="488.37537"
+ id="tspan3026">TeleGPS</tspan></text>
+ </g>
+</svg>
--- /dev/null
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="444"
+ height="98"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="telegps-oneline.svg">
+ <defs
+ id="defs4">
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient3175"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3169">
+ <stop
+ style="stop-color:#ff8a00;stop-opacity:1;"
+ offset="0"
+ id="stop3171" />
+ <stop
+ id="stop3445"
+ offset="0.71698111"
+ style="stop-color:#c24573;stop-opacity:0.98039216;" />
+ <stop
+ style="stop-color:#8500e7;stop-opacity:0.96078432;"
+ offset="1"
+ id="stop3173" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient3171"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3165">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3167" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3169" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient2838"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3181">
+ <stop
+ style="stop-color:#ff8a00;stop-opacity:1;"
+ offset="0"
+ id="stop3183" />
+ <stop
+ id="stop3185"
+ offset="0.71698111"
+ style="stop-color:#c24573;stop-opacity:0.98039216;" />
+ <stop
+ style="stop-color:#8500e7;stop-opacity:0.96078432;"
+ offset="1"
+ id="stop3187" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient2840"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3190">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3192" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3194" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient2830"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3197">
+ <stop
+ style="stop-color:#ff8a00;stop-opacity:1;"
+ offset="0"
+ id="stop3199" />
+ <stop
+ id="stop3201"
+ offset="0.71698111"
+ style="stop-color:#c24573;stop-opacity:0.98039216;" />
+ <stop
+ style="stop-color:#8500e7;stop-opacity:0.96078432;"
+ offset="1"
+ id="stop3203" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient2832"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3206">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3208" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3210" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient2834"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="2305.2668"
+ fx="951.68713"
+ fy="2305.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3213">
+ <stop
+ style="stop-color:#ff8a00;stop-opacity:1;"
+ offset="0"
+ id="stop3215" />
+ <stop
+ id="stop3217"
+ offset="0.71698111"
+ style="stop-color:#c24573;stop-opacity:0.98039216;" />
+ <stop
+ style="stop-color:#8500e7;stop-opacity:0.96078432;"
+ offset="1"
+ id="stop3219" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3165"
+ id="radialGradient2836"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ cx="951.68713"
+ cy="1205.2668"
+ fx="951.68713"
+ fy="1205.2668"
+ r="951.68701" />
+ <linearGradient
+ id="linearGradient3222">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3224" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3226" />
+ </linearGradient>
+ <radialGradient
+ r="951.68701"
+ fy="2305.2668"
+ fx="951.68713"
+ cy="2305.2668"
+ cx="951.68713"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3232"
+ xlink:href="#linearGradient3169"
+ inkscape:collect="always" />
+ <radialGradient
+ r="951.68701"
+ fy="1205.2668"
+ fx="951.68713"
+ cy="1205.2668"
+ cx="951.68713"
+ gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3234"
+ xlink:href="#linearGradient3165"
+ inkscape:collect="always" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3169"
+ id="radialGradient4101"
+ cx="194.54575"
+ cy="361.16367"
+ fx="194.54575"
+ fy="361.16367"
+ r="70.597672"
+ gradientTransform="matrix(0.39116682,0,0,0.37516256,264.74942,305.15926)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8"
+ inkscape:cx="199.46382"
+ inkscape:cy="-0.91832278"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="2060"
+ inkscape:window-height="1038"
+ inkscape:window-x="128"
+ inkscape:window-y="382"
+ inkscape:window-maximized="0" />
+ <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(-261.09094,-391.54617)">
+ <path
+ style="fill:url(#radialGradient4101);fill-opacity:1"
+ d="m 313.2338,458.43158 0.74799,-0.66263 15.28371,-14.26539 8.11342,8.62622 -15.92828,15.01016 z m 14.17973,0.52672 -5.51012,-6.01784 -6.00005,5.63616 5.67488,5.96037 z m 7.4271,-6.87951 -5.66258,-6.0785 -5.84869,5.64101 5.55447,6.01448 z m 16.92051,1.26751 -2.22702,-2.35058 -1.08325,0.7265 c -1.96176,1.31568 -4.1533,1.8588 -5.30166,1.31387 -0.35512,-0.16852 -4.38371,-4.24634 -6.4391,-6.49926 -2.47128,-2.70877 -6.95192,-7.30832 -7.0731,-8.42455 l -0.0997,-0.91841 -2.61387,-1.17418 -2.61387,-1.17418 -0.0486,-0.99688 c -0.0951,-1.95235 1.02366,-4.56153 2.77984,-6.48307 2.5501,-2.79022 5.56698,-4.22936 8.37374,-3.99451 l 0.97627,0.0817 0.91575,2.85892 0.91576,2.85892 0.80353,0.0846 c 0.44195,0.0465 0.89673,0.14357 1.01064,0.21564 0.1139,0.0721 4.37229,4.5213 6.5073,6.82994 2.21944,2.39996 6.39675,6.92997 6.55055,7.29806 0.53391,1.27783 -0.22109,3.65537 -1.74006,5.47948 -0.36354,0.43658 -0.66009,0.84091 -0.659,0.89852 10e-4,0.0576 0.9568,1.12825 2.12378,2.37921 1.16697,1.25095 2.12177,2.358 2.12177,2.46012 0,0.26127 -0.35803,0.67512 -0.68056,0.78665 -0.19689,0.0681 -0.88798,-0.55589 -2.49916,-2.25648 z m -5.43503,-2.55191 c 0.37628,-0.19196 0.96494,-0.53484 1.30813,-0.76195 l 0.62398,-0.41293 -0.66117,-0.67369 c -0.67097,-0.68367 -0.81984,-1.17245 -0.46513,-1.52716 0.38493,-0.38494 0.9136,-0.20884 1.54209,0.51365 l 0.61736,0.7097 0.56187,-0.66886 c 0.66948,-0.79697 1.32734,-2.14185 1.32608,-2.71094 -0.004,-1.83194 -2.74447,-1.05143 -5.2295,1.48943 -1.66747,1.70495 -2.47525,3.74553 -1.66865,4.21533 0.46647,0.2717 1.31435,0.20014 2.04494,-0.17258 z m -14.68075,-17.36398 c 0.87596,-1.05862 2.85317,-2.73572 3.96513,-3.36327 0.66454,-0.37504 0.86538,-0.57179 0.79857,-0.78228 -0.0491,-0.15467 -0.4136,-1.19935 -0.81002,-2.32152 l -0.72076,-2.04031 -0.6284,0.0502 c -1.61556,0.12898 -3.54486,1.11891 -5.2022,2.66926 -1.57748,1.47566 -3.04496,3.99315 -3.08636,5.29473 l -0.0181,0.56872 2.11562,0.96695 2.11563,0.96695 0.40259,-0.60243 c 0.22142,-0.33133 0.70215,-0.96447 1.06829,-1.40696 z m 12.87345,-4.09635 15.86492,-15.16531 c 2.77649,3.01655 5.68624,6.11689 8.08087,8.70358 l -15.85433,14.95877 z m 13.97892,0.39936 -5.57785,-6.0158 -5.98287,5.61632 5.73242,5.92485 z m 7.30703,-6.86817 -5.51608,-6.02447 -5.99586,5.63174 5.68363,5.96272 z"
+ id="path3063"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccscssascccssscccscasscsssssccssscssssscssscssccccsccccccccccccccccc" />
+ <g
+ id="g4484"
+ style="fill:#78079a;fill-opacity:1">
+ <path
+ d="m 397.31307,420.68962 11.6021,0 c 2.13722,0 3.66381,-0.99229 3.66381,-3.12952 0,-2.13723 -1.52659,-3.12951 -3.66381,-3.12951 l -29.92119,0 c -2.13723,0 -3.66382,0.99228 -3.66382,3.12951 0,2.13723 1.52659,3.12952 3.66382,3.12952 l 11.60209,0 0,42.51556 c 0,2.36622 1.06862,3.96914 3.3585,3.96914 2.28989,0 3.3585,-1.60292 3.3585,-3.96914 l 0,-42.51556 z"
+ id="path4214"
+ inkscape:connector-curvature="0"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" />
+ <path
+ d="m 416.63996,442.82519 c 0.99228,-4.88509 4.50344,-9.31221 11.83108,-9.31221 6.18269,0 10.0755,3.96914 10.38082,9.31221 l -22.2119,0 z m 25.18875,5.19041 c 3.66382,0 3.74015,-0.83963 3.74015,-4.04547 0,-9.61752 -7.55662,-16.25819 -17.02149,-16.25819 -11.37311,0 -19.38771,7.78561 -19.38771,19.23505 0,13.434 8.47258,19.99834 18.54808,19.99834 l 14.65528,0 c 2.0609,0 3.43483,-0.91596 3.43483,-2.90052 0,-1.98457 -1.37393,-2.90053 -3.43483,-2.90053 l -14.50262,0 c -6.25902,0 -12.06007,-4.27445 -11.52576,-13.12868 l 25.49407,0 z"
+ id="path4216"
+ inkscape:connector-curvature="0"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" />
+ <path
+ d="m 460.34936,418.17074 c 0,-2.28989 -0.83962,-3.96913 -3.3585,-3.96913 -2.51888,0 -3.3585,1.67924 -3.3585,3.96913 l 0,45.03444 c 0,2.36622 1.06861,3.96914 3.3585,3.96914 2.28989,0 3.3585,-1.60292 3.3585,-3.96914 l 0,-45.03444 z"
+ id="path4218"
+ inkscape:connector-curvature="0"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" />
+ <path
+ d="m 476.12335,442.82519 c 0.99228,-4.88509 4.50344,-9.31221 11.83108,-9.31221 6.18269,0 10.0755,3.96914 10.38082,9.31221 l -22.2119,0 z m 25.18875,5.19041 c 3.66382,0 3.74015,-0.83963 3.74015,-4.04547 0,-9.61752 -7.55663,-16.25819 -17.02149,-16.25819 -11.37311,0 -19.38771,7.78561 -19.38771,19.23505 0,13.434 8.47258,19.99834 18.54808,19.99834 l 14.65528,0 c 2.0609,0 3.43483,-0.91596 3.43483,-2.90052 0,-1.98457 -1.37393,-2.90053 -3.43483,-2.90053 l -14.50262,0 c -6.25902,0 -12.06007,-4.27445 -11.52576,-13.12868 l 25.49407,0 z"
+ id="path4220"
+ inkscape:connector-curvature="0"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" />
+ <path
+ d="m 547.99836,461.14428 c -15.11326,0 -29.84486,-8.09093 -29.84486,-25.11242 0,-10.53348 5.87738,-15.34224 13.89198,-15.34224 l 17.40314,0 c 2.13723,0 3.66382,-0.99229 3.66382,-3.12952 0,-2.13723 -1.52659,-3.12951 -3.66382,-3.12951 l -18.70074,0 c -12.44172,0 -20.07467,8.93056 -20.07467,21.21962 0,20.9143 17.09781,31.75309 35.95122,31.75309 5.19041,0 8.09093,-0.45797 8.09093,-4.88509 l 0,-29.84485 c 0,-4.42712 -1.83191,-4.96142 -5.64839,-4.96142 l -12.89969,0 c -2.13723,0 -3.66382,0.99228 -3.66382,3.12951 0,2.13723 1.52659,3.12951 3.66382,3.12951 l 11.83108,0 0,27.17332 z"
+ id="path4222"
+ inkscape:connector-curvature="0"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" />
+ <path
+ d="m 571.73446,443.8938 c 9.38854,-3.3585 29.53954,-7.02232 29.53954,-20.37999 0,-6.10637 -4.88509,-9.08322 -10.91513,-9.08322 l -22.2119,0 c -2.36621,0 -3.12951,1.52659 -3.12951,3.66382 l 0,45.11077 c 0,2.36622 1.06862,3.96914 3.3585,3.96914 2.28989,0 3.3585,-1.60292 3.3585,-3.96914 l 0,-19.31138 z m 17.40314,-23.20418 c 2.67154,0 4.65611,0.91595 4.65611,3.89281 0,6.86966 -14.34996,9.23587 -22.05925,12.44171 l 0,-16.33452 17.40314,0 z"
+ id="path4224"
+ inkscape:connector-curvature="0"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" />
+ <path
+ d="m 615.90185,414.43059 c -6.1827,0 -11.60208,3.51116 -11.60208,10.45715 0,18.70074 34.04297,4.04547 34.04297,22.59355 0,8.16726 -4.80877,13.20502 -15.80021,13.20502 l -14.80793,0 c -2.13722,0 -3.66382,0.99228 -3.66382,3.12951 0,2.13723 1.5266,3.12951 3.66382,3.12951 l 16.79248,0 c 12.97606,0 20.99064,-8.54891 20.99064,-19.6167 0,-24.65445 -34.04298,-12.89969 -34.04298,-22.51722 0,-3.96913 4.12181,-4.12179 6.56433,-4.12179 l 17.09782,0 c 2.13726,0 3.66383,-0.99229 3.66383,-3.12952 0,-2.13723 -1.52657,-3.12951 -3.66383,-3.12951 l -19.23504,0 z"
+ id="path4226"
+ inkscape:connector-curvature="0"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+</svg>
--- /dev/null
+== TeleGPS Quick Start Guide
+
+ TeleGPS is designed to be easy to use. Requiring no external
+ components, flying takes just a few steps.
+
+ 1. First, download and install the software from
+ http://altusmetrum.org/AltOS. This will make sure that
+ you have the right device drivers installed.
+
+ 2. Next, plug in the battery and USB cable and connect TeleGPS to
+ your computer. This will charge the battery and allow you to
+ configure the device.
+
+ 3. Start the TeleGPS application and set the callsign and frequency
+ on your TeleGPS device; refer to <<_configure_device>> for instructions.
+
+ 4. Unplug TeleGPS when the battery charger light goes green. This
+ will enable the radio and logging portions of the TeleGPS
+ firmware.
+
+ 5. Connect TeleDongle to your computer and start TeleGPS or start
+ AltosDroid on your android device and connect to TeleBT. Set the
+ frequency to match the TeleGPS and you should be receiving telemetry.
--- /dev/null
+[appendix]
+== Release Notes
+
+ :leveloffset: 2
+ include::release-notes-1.6.2.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.6.1.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.6.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.5.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.4.2.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.4.1.raw[]
+
+ <<<<
+ :leveloffset: 2
+ include::release-notes-1.4.raw[]
--- /dev/null
+[appendix]
+== Technical Information
+
+ === GPS Receiver
+
+ TeleGPS uses the u-Blox Max-7Q GPS receiver.
+
+ === Micro-controller
+
+ TeleGPS uses an NXP LPC11U14 micro-controller. This
+ tiny CPU contains 32kB of flash for the application
+ and 4kB of RAM for temporary data storage.
+
+ === Lithium Polymer Battery
+
+ Shipping restrictions may prevent us from including a
+ battery battery with TeleGPS.
+
+ === Mechanical Considerations
+
+ TeleGPS is designed to be rugged enough for typical
+ rocketry applications. The 4 mounting holes on the
+ board are sized for use with 4-40 or M3 screws.
+
+ === On-board data storage
+
+ TeleGPS has 2MB of non-volatile storage, separate from
+ the code storage memory. The TeleGPS firmware uses
+ this to log information during flight.
--- /dev/null
+[appendix]
+== TeleGPS System Operation
+
+ === GFSK Telemetry
+
+ TeleGPS's native telemetry system doesn't use a
+ 'normal packet radio' mode like APRS because it's not
+ very efficient. 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 forward
+ error correction and interleaving, this allows us to
+ have a very robust 19.2 kilobit data link with only
+ 10-40 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 with our 10mW units and over 100k feet AGL with
+ the 40mW devices.
+
+ :aprsdevices: TeleGPS
+ :configure_section: _configure_device
+ include::aprs-operation.raw[]
+
+ === Configurable Parameters
+
+ Configuring TeleGPS is very simple; the few configurable
+ parameters can all be set using the TeleGPS application over
+ USB. Check out <<_configure_device>>.
--- /dev/null
+[appendix]
+== Updating Device Firmware
+
+ TeleGPS is programmed directly over its USB connectors.
+
+ You may wish to begin by ensuring you have current firmware images.
+ These are distributed as part of the TeleGPS software bundle that
+ also includes the TeleGPS 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 http://www.altusmetrum.org/AltOS/
+
+ === Updating TeleGPS Firmware
+
+ . Attach a battery and power switch to the target
+ device. Power up the device.
+
+ . Using a Micro USB cable, connect the target device to
+ your computer's USB socket.
+
+ . Run TeleGPS, and select 'Flash Device' from the
+ Device menu.
+
+ . Select the target device in the Device Selection
+ dialog.
+
+ . Select the image you want to flash to the device,
+ which should have a name in the form
+ <product>-v<product-version>-<software-version>.ihx,
+ such as TeleGPS-v1.0-1.4.0.ihx.
+
+ . 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.
+
+ . Hit the 'OK' button and the software should proceed
+ to flash the device with new firmware, showing a
+ progress bar.
+
+ . Verify that the device is working by using the
+ 'Configure Device item to check over the
+ configuration.
--- /dev/null
+== Using TeleGPS Hardware
+
+ === Hooking Up Lithium Polymer Batteries
+
+ TeleGPS has a two pin JST PH series connector to connect up
+ a single-cell Lithium Polymer cell (3.7V nominal). You can
+ purchase matching batteries from the Altus Metrum store, or
+ other vendors, or you can make your own. Pin 1 of the
+ connector is positive, pin 2 is negative. Spark Fun sells a
+ cable with the connector attached, which they call a
+ link:https://www.sparkfun.com/products/9914[JST Jumper 2 Wire Assembly]
+
+
+ [WARNING]
+ Many RC vendors also sell lithium polymer batteries with
+ this same connector. All that we have found use the opposite
+ polarity, and if you use them that way, you will damage or
+ destroy TeleGPS.
+
+ === On-board Data Recording
+
+ TeleGPS logs GPS data at a user-configurable
+ rate. Data are logged to a 2MB on-board flash memory
+ part, which can be partitioned into several
+ equal-sized blocks, one for each flight. 64kB of this
+ storage are reserved to hold configuration data,
+ leaving 1984kB for flight data.
+
+ 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 you
+ can store more flights.
+
+ To compute the amount of space needed for a single
+ log, you can divide the expected time (in seconds) by
+ the sample period (by default, 1 second per sample)
+ and then multiply the result by 32 bytes per
+ sample. For instance, a sample period of 1 second and
+ a flight lasting one hour will take 32 * 3600 = 115200
+ bytes. TeleGPS does try to reduce log space used by
+ not recording position information when it isn't
+ moving, so actual space consumed may be less than
+ this.
+
+ The default size allows for four flights of 496kB
+ each, which provides over four hours of logging at 1
+ sample per second.
+
+ TeleGPS will not overwrite existing flight data, so be
+ sure to download flight data and erase it from the
+ onboard flash before it fills up. TeleGPS will still
+ report telemetry even if memory is full, so the only
+ thing you will lose is the on-board data log.
+
+ === Installation
+
+ The battery connectors are a standard 2-pin JST
+ connector and match batteries sold by Spark Fun. These
+ batteries are single-cell Lithium Polymer batteries
+ that nominally provide 3.7 volts. Other vendors sell
+ similar batteries for RC aircraft using mating
+ connectors, however the polarity for those is
+ generally reversed from the batteries used by Altus
+ Metrum products. In particular, the Tenergy batteries
+ supplied for use in Featherweight flight computers are
+ not compatible with Altus Metrum flight computers or
+ battery chargers.
+
+ [WARNING]
+ Check polarity and voltage before connecting any
+ battery not purchased from Altus Metrum or Spark
+ Fun.
+
+ TeleGPS uses an integrate GPS patch antenna and won't
+ receive GPS signals if installed inside a metal or
+ carbon fiber compartment. Test GPS reception and
+ telemetry transmission with the system installed and
+ all other electronics powered up to verify signal
+ reception and make sure there isn't any interference
+ from other systems.
--- /dev/null
+= TeleGPS Owner's Manual
+:doctype: book
+:numbered:
+:telegps: 1
+:radio: 1
+:gps: 1
+:application: TeleGPS
+
+ include::telegps-dedication.raw[]
+
+ include::telegps-quick-start.raw[]
+
+ include::telegps-using.raw[]
+
+ include::telegps-application.raw[]
+
+ include::telegps-system-operation.raw[]
+
+ include::handling.raw[]
+
+ include::telegps-specs.raw[]
+
+ include::telegps-updating-firmware.raw[]
+
+ include::telegps-release-notes.raw[]
+++ /dev/null
-<?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>TeleGPS Owner's Manual</title>
- <subtitle>A recording GPS tracker</subtitle>
- <bookinfo>
- <author>
- <firstname>Keith</firstname>
- <surname>Packard</surname>
- </author>
- <copyright>
- <year>2015</year>
- <holder>Bdale Garbee and Keith Packard</holder>
- </copyright>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-v1.0-top.jpg" width="4in"/>
- </imageobject>
- </mediaobject>
- <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.6</revnumber>
- <date>8 January 2015</date>
- <revremark>
- Major release adding TeleDongle v3.0 support.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.4.1</revnumber>
- <date>20 June 2014</date>
- <revremark>
- Minor release fixing some installation bugs.
- </revremark>
- </revision>
- <revision>
- <revnumber>1.4</revnumber>
- <date>13 June 2014</date>
- <revremark>
- Initial release
- </revremark>
- </revision>
- </revhistory>
- </bookinfo>
- <dedication>
- <title>Acknowledgements</title>
- <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>
- </dedication>
- <chapter>
- <title>Quick Start Guide</title>
- <para>
- TeleGPS is designed to be easy to use. Requiring no external
- components, flying takes just a few steps.
- </para>
- <para>
- First, download and install the software from <ulink
- url="http://altusmetrum.org/AltOS"/>. This will make sure that
- you have the right device drivers installed.
- </para>
- <para>
- Next, plug in the battery and USB cable and connect TeleGPS to
- your computer. This will charge the battery and allow you to
- configure the device.
- </para>
- <para>
- Start the TeleGPS application and set the callsign and frequency
- on your TeleGPS device; refer to the Configure TeleGPS section
- in the TeleGPS Application chapter for instructions.
- </para>
- <para>
- Unplug TeleGPS when the battery charger light goes green. This
- will enable the radio and logging portions of the TeleGPS
- firmware.
- </para>
- <para>
- Connect TeleDongle to your computer and start TeleGPS or start
- AltosDroid on your android device and connect to TeleBT. Set the
- frequency to match the TeleGPS and you should be receiving telemetry.
- </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 batteries have an
- extraordinary power density. This is great because we can fly with
- much less battery mass... but if they are punctured
- or their contacts are allowed to short, they can and will release their
- energy very rapidly!
- Thus we recommend that you take some care when handling TeleGPS
- to keep conductive material from coming in contact with the exposed metal elements.
- </para>
- <para>
- As with all other rocketry electronics, Altus Metrum devices must
- be protected from exposure to corrosive motor exhaust and ejection
- charge gasses.
- </para>
- </chapter>
- <chapter>
- <title>TeleGPS Hardware</title>
- <section>
- <title>Hooking Up Lithium Polymer Batteries</title>
- <para>
- TeleGPS has a two pin JST PH series connector to connect up
- a single-cell Lithium Polymer cell (3.7V nominal). You can
- purchase matching batteries from the Altus Metrum store, or
- other vendors, or you can make your own. Pin 1 of the
- connector is positive, pin 2 is negative. Spark Fun sells a
- cable with the connector attached, which they call a <ulink
- url="https://www.sparkfun.com/products/9914">JST Jumper 2
- Wire Assembly</ulink>.
- </para>
- <para>
- Many RC vendors also sell lithium polymer batteries with
- this same connector. All that we have found use the opposite
- polarity, and if you use them that way, you will damage or
- destroy TeleGPS.
- </para>
- </section>
- <section>
- <title>On-board Data Recording</title>
- <para>
- TeleGPS logs GPS data at a user-configurable rate. Data are
- logged to a 2MB on-board flash memory part, which can be
- partitioned into several equal-sized blocks, one for each
- flight. 64kB of this storage are reserved to hold
- configuration data, leaving 1984kB for flight 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 you can store more flights.
- </para>
- <para>
- To compute the amount of space needed for a single log, you
- can divide the expected time (in seconds) by the sample period
- (by default, 1 second per sample) and then multiply the result
- by 32 bytes per sample. For instance, a sample period of 1
- second and a flight lasting one hour will take 32 * 3600 =
- 115200 bytes. TeleGPS does try to reduce log space used by not
- recording position information when it isn't moving, so actual
- space consumed may be less than this.
- </para>
- <para>
- The default size allows for four flights of 496kB each, which
- provides over four hours of logging at 1 sample per second.
- </para>
- <para>
- TeleGPS will not overwrite existing flight data, so be sure to
- download flight data and erase it from the onboard flash
- before it fills up. TeleGPS will still report telemetry even
- if memory is full, so the only thing you will lose is the
- on-board data log.
- </para>
- </section>
- <section>
- <title>Installation</title>
- <para>
- The battery connectors are a standard 2-pin JST connector and
- match batteries sold by Spark Fun. These batteries are
- single-cell Lithium Polymer batteries that nominally provide 3.7
- volts. Other vendors sell similar batteries for RC aircraft
- using mating connectors, however the polarity for those is
- generally reversed from the batteries used by Altus Metrum
- products. In particular, the Tenergy batteries supplied for use
- in Featherweight flight computers are not compatible with Altus
- Metrum flight computers or battery chargers. <emphasis>Check
- polarity and voltage before connecting any battery not purchased
- from Altus Metrum or Spark Fun.</emphasis>
- </para>
- <para>
- TeleGPS uses an integrate GPS patch antenna and won't
- receive GPS signals if installed inside a metal or carbon
- fiber compartment. Test GPS reception and telemetry
- transmission with the system installed and all other
- electronics powered up to verify signal reception and make
- sure there isn't any interference from other systems.
- </para>
- </section>
- </chapter>
- <chapter>
- <title>System Operation</title>
- <section>
- <title>GFSK Telemetry</title>
- <para>
- TeleGPS's native telemetry system doesn't use a 'normal packet
- radio' mode like APRS because it's not very efficient. 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 forward
- error correction and interleaving, this allows us to have a
- very robust 19.2 kilobit data link with only 10-40 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 with our 10mW units and over 100k feet AGL with
- the 40mW devices.
- </para>
- </section>
- <section>
- <title>APRS</title>
- <para>
- TeleGPS can send APRS if desired, and the
- interval between APRS packets can be configured. As each APRS
- packet takes a full second to transmit, we recommend an
- interval of at least 5 seconds to avoid consuming too much
- battery power or radio channel bandwidth. You can configure
- the APRS interval using AltosUI; that process is described in
- the Configure Altimeter section of the AltosUI chapter.
- </para>
- <para>
- AltOS uses the APRS compressed position report data format,
- which provides for higher position precision and shorter
- packets than the original APRS format. It also includes
- altitude data, which is invaluable when tracking rockets. We
- haven't found a receiver which doesn't handle compressed
- positions, but it's just possible that you have one, so if you
- have an older device that can receive the raw packets but
- isn't displaying position information, it's possible that this
- is the cause.
- </para>
- <para>
- The APRS packet format includes a comment field that can have
- arbitrary text in it. AltOS uses this to send status
- information about the flight computer. It sends four fields as
- shown in the following table.
- </para>
- <table frame='all'>
- <title>Altus Metrum APRS Comments</title>
- <?dbfo keep-together="always"?>
- <tgroup cols='3' align='center' colsep='1' rowsep='1'>
- <colspec align='center' colwidth='*' colname='Field'/>
- <colspec align='center' colwidth='*' colname='Example'/>
- <colspec align='center' colwidth='4*' colname='Description'/>
- <thead>
- <row>
- <entry align='center'>Field</entry>
- <entry align='center'>Example</entry>
- <entry align='center'>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>1</entry>
- <entry>L</entry>
- <entry>GPS Status U for unlocked, L for locked</entry>
- </row>
- <row>
- <entry>2</entry>
- <entry>6</entry>
- <entry>Number of Satellites in View</entry>
- </row>
- <row>
- <entry>3</entry>
- <entry>B4.0</entry>
- <entry>Battery Voltage</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>
- Here's an example of an APRS comment showing GPS lock with 6
- satellites in view and a battery at 4.0V.
- <screen>
- L6 B4.0
- </screen>
- </para>
- <para>
- Make sure your primary battery is above 3.8V and GPS is locked
- with at least 5 or 6 satellites in view before starting. If GPS
- is switching between L and U regularly, then it doesn't have a
- good lock and you should wait until it becomes stable.
- </para>
- <para>
- If the GPS receiver loses lock, the APRS data transmitted will
- contain the last position for which GPS lock was
- available. You can tell that this has happened by noticing
- that the GPS status character switches from 'L' to 'U'. Before
- GPS has locked, APRS will transmit zero for latitude,
- longitude and altitude.
- </para>
- </section>
- <section>
- <title>Configurable Parameters</title>
- <para>
- Configuring TeleGPS is very
- simple; the few configurable parameters can all be set
- using the TeleGPS application over USB. Read
- the Configure TeleGPS section in the TeleGPS Software chapter below
- for more information.
- </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
- TeleGPS and the receiver must be configured to the same
- frequency to successfully communicate with each other.
- </para>
- </section>
- <section>
- <title>Callsign</title>
- <para>
- This sets the callsign used for telemetry and APRS to
- identify the device.
- </para>
- </section>
- <section>
- <title>Telemetry/RDF/APRS Enable</title>
- <para>
- You can completely disable the radio, if necessary, leaving
- TeleGPS only logging data to internal memory.
- </para>
- </section>
- <section>
- <title>APRS Interval</title>
- <para>
- This selects how often APRS packets are transmitted. Set
- this to zero to disable APRS without also disabling the
- regular telemetry and RDF transmissions. As APRS takes a
- full second to transmit a single position report, we
- recommend sending packets no more than once every 5 seconds.
- </para>
- </section>
- <section>
- <title>Maximum Flight Log</title>
- <para>
- Changing this value will set the maximum amount of flight
- log storage that an individual flight will use. The
- available storage is divided into as many flights of the
- specified size as can fit in the available space. You can
- download and erase individual flight logs. If you fill up
- the available storage, future flights will not get logged
- until you erase some of the stored ones.
- </para>
- </section>
- <section>
- <title>Logging Trigger Motion</title>
- <para>
- If TeleGPS moves less than this distance over a long period
- of time, it will not log that location, saving storage space.
- </para>
- </section>
- <section>
- <title>Position Reporting Interval</title>
- <para>
- This sets how often TeleGPS reports position information via
- telemetry and to the on-board log. Reducing this value will
- save power and logging memory consumption.
- </para>
- </section>
- </section>
- </chapter>
- <chapter>
- <title>TeleGPS Application</title>
- <para>
- The TeleGPS application provides a graphical user interface for
- interacting with the Altus Metrum product family. TeleGPS can
- monitor telemetry data, configure devices and many other
- tasks. The primary interface window is for displaying data
- received over the telemetry link. There are additional
- tasks available from the main window menu bar. This chapter
- is split into sections, each of which documents one of the tasks
- provided from the top-level toolbar.
- </para>
- <section>
- <title>Telemetry Monitoring</title>
- <para>
- This is the window brought up when you start the
- application. If you have a TeleDongle device connected to the
- computer, it will automatically be selected for telemetry monitoring
- </para>
- <para>
- All telemetry data received are automatically recorded in
- suitable log files. The name of the files includes the current
- date and TeleGPS 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. The TeleGPS application 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. TeleGPS remembers how many
- times it has flown.
- </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 -100dBm;
- weaker signals may not be receivable. The packet link uses
- error detection and correction techniques which prevent
- incorrect data from being reported.
- </para>
- </listitem>
- <listitem>
- <para>
- The age of the displayed data, in seconds since the last
- successfully received telemetry packet. In normal operation
- this will stay in the low single digits. If the number starts
- counting up, then you are no longer receiving data over the radio
- link from the flight computer.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Finally, the largest portion of the window contains a set of
- tabs, each of which contain some information about the TeleGPS
- board. The final 'table' tab displays many of the raw telemetry
- values in one place in a spreadsheet-like format.
- </para>
- <section>
- <title>Map</title>
- <para>
- The Map tab shows the TeleGPS track over time on top of map
- data making it easy to locate the device.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-map.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- The map's default 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>
- You can adjust the style of map and the zoom level with
- buttons on the right side of the map window. You can draw a
- line on the map by moving the mouse over the map with a
- button other than the left one pressed, or by pressing the
- left button while also holding down the shift key. The
- length of the line in real-world units will be shown at the
- start of the line.
- </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>
- <title>Location</title>
- <para>
- The Location tab shows the raw GPS data received from TeleGPS.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-location.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>Status</title>
- <para>
- The Status tab shows data relative to the location of
- TeleGPS when the application first received telemetry from
- it.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-status.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>Table</title>
- <para>
- The Table tab shows detailed information about the GPS
- receiver
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-table.png" width="5.5in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- </section>
- <!--
- <variablelist>
- <varlistentry>
- <term></term>
- <listitem>
- <para>
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- -->
- <section>
- <title>TeleGPS Menus</title>
- <para>
- TeleGPS has three or four menus at the top of the window:
- <variablelist>
- <varlistentry>
- <term>File</term>
- <listitem>
- <para>
- New Window, Graph Data, Export Data, Load Maps, Preferences, Close and Exit
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Monitor</term>
- <listitem>
- <para>
- Connect Device, Disconnect and Scan Channels
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Device</term>
- <listitem>
- <para>
- Download Data, Configure Device and Flash Device
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Frequency</term>
- <listitem>
- <para>
- This shows the current monitoring frequency with a
- drop-down menu listing other configured
- frequencies. You can change the set of frequencies
- shown here from the Preferences dialog. This menu is
- only shown when the TeleGPS application is connected
- to a TeleDongle or TeleBT device.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <section>
- <title>New Window</title>
- <para>
- This creates another telemetry monitoring window, in case
- you have multiple TeleDongle devices connected to the
- computer.
- </para>
- </section>
- <section>
- <title>Graph Data</title>
- <para>
- This brings up a file dialog to load a saved log, either
- a .telem file of recorded telemetry or .eeprom of saved
- data from on-board memory. It looks a bit like the flight
- monitoring window, using a selection of tabs to show
- different views of the saved data.
- </para>
- <section>
- <title>Graph</title>
- <para>
- The Graph tab shows a plot of the the GPS data
- collected. The X axis is time in seconds; there are a
- variety of Y axes available for different kinds of data.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-graph-graph.png" width="6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>Configure Graph</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-graph-configure.png" width="6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- This selects which graph elements to show, and, at the
- bottom, lets you switch between metric and imperial units
- </para>
- </section>
- <section>
- <title>Statistics</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-graph-stats.png" width="6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- Shows overall data computed from the flight.
- </para>
- </section>
- <section>
- <title>Map</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-graph-map.png" width="6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- Shows a map of the area overlaid with the GPS track. As with
- the telemetry monitoring window, you can select the style
- of map and zoom level using buttons along the side;
- you can scroll the map by dragging within the map pressing
- the left button and you can draw a line to measure
- distances using either the left button with the shift key,
- or any other button.
- </para>
- </section>
- </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 data file, which can be either a .eeprom or .telem.
- The .eeprom files contain higher resolution and more continuous data,
- while .telem files contain receiver signal strength information.
- 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 TeleGPS, 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>Load Maps</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="load-maps.png" width="5.2in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- Before using TeleGPS, you can use Load Maps to load map data
- in case you don't have access to the internet while
- receiving telemetry.
- </para>
- <para>
- There's a drop-down menu of rocket 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 from our server at run-time, so as
- new sites are sent in, they'll get automatically added to
- this list. If the launch site isn't in the list, you can
- manually enter the lat/lon values
- </para>
- <para>
- There are four different kinds of maps you can view; you can
- select which to download by selecting as many as you like from
- the available types:
- <variablelist>
- <varlistentry>
- <term>Hybrid</term>
- <listitem>
- <para>
- A combination of satellite imagery and road data. This
- is the default view.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Satellite</term>
- <listitem>
- <para>
- Just the satellite imagery without any annotation.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Roadmap</term>
- <listitem>
- <para>
- Roads, political boundaries and a few geographic features.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Terrain</term>
- <listitem>
- <para>
- Contour intervals and shading that show hills and
- valleys.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- <para>
- You can specify the range of zoom levels to download; smaller
- numbers show more area with less resolution. The default
- level, 0, shows about 3m/pixel. One zoom level change
- doubles or halves that number.
- </para>
- <para>
- The Tile Radius value sets how large an area around the center
- point to download. Each tile is 512x512 pixels, and the
- 'radius' value specifies how many tiles away from the center
- will be downloaded. Specify a radius of 0 and you get only the
- center tile. A radius of 1 loads a 3x3 grid, centered on the
- specified location.
- </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>Preferences</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-preferences.png" width="2.4in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <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>
- <variablelist>
- <varlistentry>
- <term>Enable</term>
- <listitem>
- <para>Turns all voice announcements on and off</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Test Voice</term>
- <listitem>
- <para>
- Plays a short message allowing you to verify
- that the audio system is working and the volume settings
- are reasonable
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </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>
- <para>
- Note that to successfully command a flight computer over the radio
- (to configure the altimeter, monitor idle, or fire pyro charges),
- the callsign configured here must exactly match the callsign
- configured in the flight computer. This matching is case
- sensitive.
- </para>
- </section>
- <section>
- <title>Imperial Units</title>
- <para>
- This switches between metric units (meters) and imperial
- units (feet and miles). This affects the display of values
- use during flight monitoring, configuration, data graphing
- and all of the voice announcements. It does not change the
- units used when exporting to CSV files, those are always
- produced in metric units.
- </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>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>Look & Feel</title>
- <para>
- Adjust the style of the windows. By default, the TeleGPS
- application attempts to blend in with the native style.
- </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>Close</title>
- <para>
- This closes the current window, leaving any other windows
- open and the application running.
- </para>
- </section>
- <section>
- <title>Exit</title>
- <para>
- This closes all TeleGPS windows and terminates the application.
- </para>
- </section>
- <section>
- <title>Connect Device</title>
- <para>
- Selecting this item brings up a dialog box listing all of
- the connected TeleDongle devices. When you choose one of
- these, AltosUI will display telemetry data as received by
- the selected TeleDongle device.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="device-selection.png" width="3.1in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>Disconnect</title>
- <para>
- Disconnects the currently connected TeleDongle or TeleBT
- </para>
- </section>
- <section>
- <title>Scan Channels</title>
- <para>
- Scans the configured set of frequencies looking for
- telemetry signals. A list of all of the discovered signals
- is show; selecting one of those and clicking on 'Monitor'
- will select that frequency in the associated TeleGPS
- application window.
- </para>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-scan.png" width="3.1in"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- </section>
- <section>
- <title>Download Data</title>
- <para>
- TeleGPS records data to its internal flash memory.
- On-board data is recorded at the same rate as telemetry
- but is not subject to radio drop-outs. As
- such, it generally provides a more complete and precise record.
- The 'Download Data' menu entry allows you to read the
- flash memory and write it to disk.
- </para>
- <para>
- Select the 'Download Data' menu entry to bring up a list of
- connected TeleGPS devices. After the device has been
- selected, a dialog showing the data stored in the
- device will be shown allowing you to select which entries to
- download and which to delete. You must erase flights in order for the space they
- consume to be reused by another track. This prevents
- accidentally losing data if you neglect to download
- data before starting TeleGPS again. Note that if there is no more
- space available in the device, then no data will be recorded.
- </para>
- <para>
- The file name for each data log is computed automatically
- from the recorded date, altimeter serial number and flight
- number information.
- </para>
- </section>
- <section>
- <title>Configure Device</title>
- <informalfigure>
- <mediaobject>
- <imageobject>
- <imagedata fileref="telegps-configure.png" width="3.6in" scalefit="1"/>
- </imageobject>
- </mediaobject>
- </informalfigure>
- <para>
- Select this button and then select any connected TeleGPS
- device from the list provided.
- </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>
- <variablelist>
- <varlistentry>
- <term>Save</term>
- <listitem>
- <para>
- 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>
- </varlistentry>
- <varlistentry>
- <term>Reset</term>
- <listitem>
- <para>
- This resets the dialog to the most recently saved values,
- erasing any changes you have made.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Reboot</term>
- <listitem>
- <para>
- This reboots the device. This will restart logging for
- a new flight number, if any log information has been
- saved for the current flight.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Close</term>
- <listitem>
- <para>
- This closes the dialog. Any unsaved changes will be
- lost.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- <para>
- The rest of the dialog contains the parameters to be configured.
- </para>
- <section>
- <title>Frequency</title>
- <para>
- This configures which of the frequencies to use for both
- telemetry and packet command mode. Note that if you set this
- value via packet command mode, the TeleDongle frequency will
- also be automatically reconfigured to match so that
- communication will continue afterwards.
- </para>
- </section>
- <section>
- <title>RF 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>Telemetry/RDF/APRS Enable</title>
- <para>
- Enables the radio for transmission during flight. When
- disabled, the radio will not transmit anything during flight
- at all.
- </para>
- </section>
- <section>
- <title>APRS Interval</title>
- <para>
- How often to transmit GPS information via APRS (in
- seconds). When set to zero, APRS transmission is
- disabled. This option is available on TeleMetrum v2 and
- TeleMega boards. TeleMetrum v1 boards cannot transmit APRS
- packets. Note that a single APRS packet takes nearly a full
- second to transmit, so enabling this option will prevent
- sending any other telemetry during that time.
- </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 Log Size</title>
- <para>
- This sets the space (in kilobytes) allocated for each data
- log. The available space will be divided into chunks of this
- size. A smaller value will allow more logs to be stored,
- a larger value will record data for longer times.
- </para>
- </section>
- <section>
- <title>Logging Trigger Motion</title>
- <para>
- If TeleGPS moves less than this distance over a long period
- of time, it will not log that location, saving storage space.
- </para>
- </section>
- <section>
- <title>Position Reporting Interval</title>
- <para>
- This sets how often TeleGPS reports position information via
- telemetry and to the on-board log. Reducing this value will
- save power and logging memory consumption.
- </para>
- </section>
- </section>
- <section>
- <title>Flash Device</title>
- <para>
- This reprograms TeleGPS devices with new firmware. Please
- read the directions for flashing devices in the Updating
- Device Firmware chapter below.
- </para>
- </section>
- </section>
- </chapter>
- <chapter>
- <title>Updating Device Firmware</title>
- <para>
- TeleGPS is programmed directly over its USB connectors.
- </para>
- <para>
- You may wish to begin by ensuring you have current firmware images.
- These are distributed as part of the TeleGPS software bundle that
- also includes the TeleGPS 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>
- <section>
- <title>
- Updating TeleGPS Firmware
- </title>
- <orderedlist inheritnum='inherit' numeration='arabic'>
- <listitem>
- <para>
- Attach a battery and power switch to the target
- device. Power up the device.
- </para>
- </listitem>
- <listitem>
- <para>
- Using a Micro USB cable, connect the target device to your
- computer's USB socket.
- </para>
- </listitem>
- <listitem>
- <para>
- Run TeleGPS, and select 'Flash Device' from the Device menu.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the target device in the Device Selection dialog.
- </para>
- </listitem>
- <listitem>
- <para>
- Select the image you want to flash to the device, which
- should have a name in the form
- <product>-v<product-version>-<software-version>.ihx, such
- as TeleGPS-v1.0-1.4.0.ihx.
- </para>
- </listitem>
- <listitem>
- <para>
- 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.
- </para>
- </listitem>
- <listitem>
- <para>
- Hit the 'OK' button and the software should proceed to flash
- the device with new firmware, showing a progress bar.
- </para>
- </listitem>
- <listitem>
- <para>
- Verify that the device is working by using the 'Configure
- Altimeter' item to check over the configuration.
- </para>
- </listitem>
- </orderedlist>
-<!--
- <section>
- <title>Recovering From Self-Flashing Failure</title>
- <para>
- If the firmware loading fails, it can leave the device
- unable to boot. Not to worry, you can force the device to
- start the boot loader instead, which will let you try to
- flash the device again.
- </para>
- <para>
- On each device, connecting two pins from one of the exposed
- connectors will force the boot loader to start, even if the
- regular operating system has been corrupted in some way.
- </para>
- <variablelist>
- <varlistentry>
- <term>TeleMega</term>
- <listitem>
- <para>
- Connect pin 6 and pin 1 of the companion connector. Pin 1
- can be identified by the square pad around it, and then
- the pins could sequentially across the board. Be very
- careful to <emphasis>not</emphasis> short pin 8 to
- anything as that is connected directly to the battery. Pin
- 7 carries 3.3V and the board will crash if that is
- connected to pin 1, but shouldn't damage the board.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>TeleMetrum v2</term>
- <listitem>
- <para>
- Connect pin 6 and pin 1 of the companion connector. Pin 1
- can be identified by the square pad around it, and then
- the pins could sequentially across the board. Be very
- careful to <emphasis>not</emphasis> short pin 8 to
- anything as that is connected directly to the battery. Pin
- 7 carries 3.3V and the board will crash if that is
- connected to pin 1, but shouldn't damage the board.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>EasyMini</term>
- <listitem>
- <para>
- Connect pin 6 and pin 1 of the debug connector, which is
- the six holes next to the beeper. Pin 1 can be identified
- by the square pad around it, and then the pins could
- sequentially across the board, making Pin 6 the one on the
- other end of the row.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </section>
- -->
- </section>
- </chapter>
- <chapter>
- <title>Technical Information</title>
- <section>
- <title>GPS Receiver</title>
- <para>
- TeleGPS uses the u-Blox Max-7Q GPS receiver.
- </para>
- </section>
- <section>
- <title>Micro-controller</title>
- <para>
- TeleGPS uses an NXP LPC11U14 micro-controller. This tiny
- CPU contains 32kB of flash for the application and 4kB of RAM for
- temporary data storage.
- </para>
- </section>
- <section>
- <title>Lithium Polymer Battery</title>
- <para>
- Shipping restrictions may prevent us from including a battery
- battery with TeleGPS.
- </para>
- </section>
- <section>
- <title>Mechanical Considerations</title>
- <para>
- TeleGPS is designed to be rugged enough for typical rocketry
- applications. The 4 mounting holes on the board are sized for
- use with 4-40 or M3 screws.
- </para>
- </section>
- <section>
- <title>On-board data storage</title>
- <para>
- TeleGPS has 2MB of non-volatile storage, separate from the
- code storage memory. The TeleGPS firmware uses this to log
- information during flight.
- </para>
- </section>
- </chapter>
- <appendix>
- <title>Release Notes</title>
- <simplesect>
- <title>Version 1.6</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.6.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.4.1</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.4.1.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- <simplesect>
- <title>Version 1.4</title>
- <xi:include
- xmlns:xi="http://www.w3.org/2001/XInclude"
- href="release-notes-1.4.xsl"
- xpointer="xpointer(/article/*)"/>
- </simplesect>
- </appendix>
-</book>
-<!-- LocalWords: Altusmetrum TeleGPS
--->
--- /dev/null
+= TeleMega Outline and Hole Pattern
+:doctype: article
+
+ This image, when printed, provides a precise template for the
+ mounting holes in TeleMega. TeleMega has overall dimensions of
+ 1.250 x 3.250 inches, and the mounting holes are sized for use
+ with 4-40 or M3 screws.
+
+ image::telemega.svg[align="center"]
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
- "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
-<article>
- <title>TeleMega Outline and Hole Pattern</title>
- <para>
- This image, when printed, provides a precise template for the
- mounting holes in TeleMega. TeleMega has overall dimensions
- of 1.250 x 3.250 inches, and the mounting holes are sized for
- use with 4-40 or M3 screws.
- </para>
- <informalfigure>
- <mediaobject id="TeleMegaTemplate">
- <imageobject>
- <imagedata format="SVG" fileref="telemega.svg"
- scalefit="0" scale="100" align="center" />
- </imageobject>
- </mediaobject>
- </informalfigure>
-</article>
-
-<!-- LocalWords: Altusmetrum
--->
--- /dev/null
+== TeleMega
+
+ .TeleMega Board
+ image::telemega-v1.0-top.jpg[width="5.5in"]
+
+ TeleMega is a 1¼ inch by 3¼ inch circuit board. It was
+ designed to easily fit in a 38mm coupler. Like TeleMetrum,
+ TeleMega has an accelerometer and so it must be mounted so that
+ the board is aligned with the flight axis. It can be mounted
+ either antenna up or down.
+
+ TeleMega v2.0 has a few minor changes from v1.0:
+
+ * Companion connector matches EasyMega functions
+ * Serial port connector replaced with servo connector with
+ support for up to 4 PWM channels.
+ * Radio switched from cc1120 to cc1200.
+
+ None of these affect operation using the stock firmware, but
+ they do mean that the device needs different firmware to
+ operate correctly, so make sure you load the right firmware
+ when reflashing the device.
+
+ === TeleMega Screw Terminals
+
+ TeleMega has two sets of nine screw terminals on the end of
+ the board opposite the telemetry antenna. They are as follows:
+
+ .TeleMega Screw Terminals
+ [options="header",grid="all",cols="2,3,10"]
+ |====
+ |Terminal #|Terminal Name|Description
+
+ |Top 1
+ |Switch Input
+ |Switch connection to positive battery terminal
+
+ |Top 2
+ |Switch Output
+ |Switch connection to flight computer
+
+ |Top 3
+ |GND
+ |Ground connection for use with external active switch
+
+ |Top 4
+ |Main -
+ |Main pyro channel connection to pyro circuit
+
+ |Top 5
+ |Main +
+ |Main pyro channel common connection to battery +
+
+ |Top 6
+ |Apogee -
+ |Apogee pyro channel connection to pyro circuit
+
+ |Top 7
+ |Apogee +
+ |Apogee pyro channel common connection to battery +
+
+ |Top 8
+ |D -
+ |D pyro channel connection to pyro circuit
+
+ |Top 9
+ |D +
+ |D pyro channel common connection to battery +
+
+ |Bottom 1
+ |GND
+ |Ground connection for negative pyro battery terminal
+
+ |Bottom 2
+ |Pyro
+ |Positive pyro battery terminal
+
+ |Bottom 3
+ |Lipo
+ |Power switch output. Use to connect main battery to pyro battery input
+
+ |Bottom 4
+ |A -
+ |A pyro channel connection to pyro circuit
+
+ |Bottom 5
+ |A +
+ |A pyro channel common connection to battery +
+
+ |Bottom 6
+ |B -
+ |B pyro channel connection to pyro circuit
+
+ |Bottom 7
+ |B +
+ |B pyro channel common connection to battery +
+
+ |Bottom 8
+ |C -
+ |C pyro channel connection to pyro circuit
+
+ |Bottom 9
+ |C +
+ |C pyro channel common connection to battery +
+ |====
+
+ === Using a Separate Pyro Battery with TeleMega
+
+ TeleMega provides explicit support for an external pyro
+ battery. All that is required is to remove the jumper
+ between the lipo terminal (Bottom 3) and the pyro terminal
+ (Bottom 2). Then hook the negative pyro battery terminal to ground
+ (Bottom 1) and the positive pyro battery to the pyro battery
+ input (Bottom 2). You can then use the existing pyro screw
+ terminals to hook up all of the pyro charges.
+
+ === Using Only One Battery With TeleMega
+
+ Because TeleMega has built-in support for a separate pyro
+ battery, if you want to fly with just one battery running
+ both the computer and firing the charges, you need to
+ connect the flight computer battery to the pyro
+ circuit. TeleMega has two screw terminals for this—hook a
+ wire from the Lipo terminal (Bottom 3) to the Pyro terminal
+ (Bottom 2).
+
+ === Using an Active Switch with TeleMega
+
+ As explained above, an external active switch requires three
+ connections, one to the positive battery terminal, one to
+ the flight computer positive input and one to ground.
+
+ The positive battery terminal is available on Top terminal
+ 1, the positive flight computer input is on Top terminal
+ 2. Ground is on Top terminal 3.
--- /dev/null
+= TeleMetrum Outline and Hole Pattern
+:doctype: article
+
+ This image, when printed, provides a precise template for the
+ mounting holes in TeleMetrum. TeleMetrum has overall dimensions of
+ 1.000 x 2.750 inches, and the mounting holes are sized for use
+ with 4-40 or M3 screws.
+
+ image::telemetrum.svg[align="center"]
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
- "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
-<article>
- <title>TeleMetrum Outline and Hole Pattern</title>
- <para>
- This image, when printed, provides a precise template for the
- mounting holes in TeleMetrum. TeleMetrum has overall dimensions
- of 1.000 x 2.750 inches, and the mounting holes are sized for
- use with 4-40 or M3 screws.
- </para>
- <informalfigure>
- <mediaobject id="TeleMetrumTemplate">
- <imageobject>
- <imagedata format="SVG" fileref="telemetrum.svg"
- scalefit="0" scale="100" align="center" />
- </imageobject>
- </mediaobject>
- </informalfigure>
-</article>
-
-<!-- LocalWords: Altusmetrum
--->
--- /dev/null
+== TeleMetrum
+
+ .TeleMetrum v2 Board
+ image::telemetrum-v2.0-th.jpg[width="5.5in"]
+
+ .TeleMetrum v1 Board
+ image::telemetrum-v1.1-thside.jpg[width="5.5in"]
+
+ TeleMetrum is a 1 inch by 2¾ 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 ¼
+ 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.
+
+ There are two generations of the TeleMetrum design. The
+ major changes in the v2 generation are:
+
+ * uBlox GPS chip certified for altitude records
+
+ * Higher power radio (40mW vs 10mW)
+
+ * APRS support
+
+ Otherwise, they're the same size, with mounting holes and
+ screw terminals in the same position.
+
+ === TeleMetrum Screw Terminals
+
+ TeleMetrum has six screw terminals on the end of the board
+ opposite the telemetry antenna. Two are for the power
+ switch, and two each for the apogee and main igniter
+ circuits. Using the picture above and starting from the top,
+ the terminals are as follows:
+
+ .TeleMetrum Screw Terminals
+ [options="header",grid="all",cols="2,3,10"]
+ |=========================
+ |Terminal #|Terminal Name|Description
+ |1 |Switch Output |Switch connection to flight computer
+ |2 |Switch Input |Switch connection to positive battery terminal
+ |3 |Main + |Main pyro channel common connection to battery +
+ |4 |Main - |Main pyro channel connection to pyro circuit
+ |5 |Apogee + |Apogee pyro channel common connection to battery +
+ |6 |Apogee - |Apogee pyro channel connection to pyro circuit
+ |========================
+
+ === Using a Separate Pyro Battery with TeleMetrum
+
+ As described above, using an external pyro battery involves
+ connecting the negative battery terminal to the flight
+ computer ground, connecting the positive battery terminal to
+ one of the igniter leads and connecting the other igniter
+ lead to the per-channel pyro circuit connection.
+
+ To connect the negative battery terminal to the TeleMetrum
+ ground, insert a small piece of wire, 24 to 28 gauge
+ stranded, into the GND hole just above the screw terminal
+ strip and solder it in place.
+
+ Connecting the positive battery terminal to the pyro
+ charges must be done separate from TeleMetrum, by soldering
+ them together or using some other connector.
+
+
+ The other lead from each pyro charge is then inserted into
+ the appropriate per-pyro channel screw terminal (terminal 4 for the
+ Main charge, terminal 6 for the Apogee charge).
+
+ === Using an Active Switch with TeleMetrum
+
+ As explained above, an external active switch requires three
+ connections, one to the positive battery terminal, one to
+ the flight computer positive input and one to ground.
+
+
+ The positive battery terminal is available on screw terminal
+ 2, the positive flight computer input is on terminal 1. To
+ hook a lead to ground, solder a piece of wire, 24 to 28
+ gauge stranded, to the GND hole just above terminal 1.
+
--- /dev/null
+<subtitle>Packet Definitions</subtitle>
+<author>
+ <firstname>Keith</firstname>
+ <surname>Packard</surname>
+ <email>keithp@keithp.com</email>
+</author>
+<date>1 July 2011</date>
+<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>
+ <?dbhtml filename="telemetry-revhistory.html"?>
+ <revision>
+ <revnumber>0.1</revnumber>
+ <date>1 July 2011</date>
+ <revremark>Initial content</revremark>
+ </revision>
+</revhistory>
--- /dev/null
+= AltOS Telemetry
+:doctype: article
+:toc:
+:numbered:
+
+== Packet Format Design
+
+ 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.
+
+ 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.
+
+ 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.
+
+== Packet Formats
+
+ This section first defines the packet header common to all packets
+ and then the per-packet data layout.
+
+ === Packet Header
+
+ .Telemetry Packet Header
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |0 |uint16_t |serial |Device serial Number
+ |2 |uint16_t |tick |Device time in 100ths of a second
+ |4 |uint8_t |type |Packet type
+ |5
+ |====
+
+ 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.
+
+ === TeleMetrum v1.x, TeleMini and TeleNano Sensor Data
+
+ .Sensor Packet Type
+ [options="border",cols="1,3"]
+ |====
+ |Type |Description
+ |0x01 |TeleMetrum v1.x Sensor Data
+ |0x02 |TeleMini Sensor Data
+ |0x03 |TeleNano Sensor Data
+ |====
+
+ TeleMetrum v1.x, TeleMini and TeleNano share this same
+ packet format for sensor data. Each uses a distinct
+ packet type so that the receiver knows which data
+ values are valid and which are undefined.
+
+ 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
+
+ .Sensor Packet Contents
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |5 |uint8_t |state |Flight state
+ |6 |int16_t |accel |accelerometer (TM only)
+ |8 |int16_t |pres |pressure sensor
+ |10 |int16_t |temp |temperature sensor
+ |12 |int16_t |v_batt |battery voltage
+ |14 |int16_t |sense_d |drogue continuity sense (TM/Tm)
+ |16 |int16_t |sense_m |main continuity sense (TM/Tm)
+ |18 |int16_t |acceleration |m/s² * 16
+ |20 |int16_t |speed |m/s * 16
+ |22 |int16_t |height |m
+ |24 |int16_t |ground_pres |Average barometer reading on ground
+ |26 |int16_t |ground_accel |TM
+ |28 |int16_t |accel_plus_g |TM
+ |30 |int16_t |accel_minus_g |TM
+ |32
+ |====
+
+ === TeleMega Sensor Data
+
+ .TeleMega Packet Type
+ [options="border",cols="1,3"]
+ |====
+ |Type |Description
+ |0x08 |TeleMega IMU Sensor Data
+ |0x09 |TeleMega Kalman and Voltage Data
+ |====
+
+ TeleMega has a lot of sensors, and so it splits the sensor
+ data into two packets. The raw IMU data are sent more often;
+ the voltage values don't change very fast, and the Kalman
+ values can be reconstructed from the IMU data.
+
+ IMU Sensor Data packets are transmitted once per second on the
+ ground, 10 times per second during ascent and once per second
+ during descent and landing
+
+ Kalman and Voltage Data packets are transmitted once per second on the
+ ground, 5 times per second during ascent and once per second
+ during descent and landing
+
+ The high-g accelerometer is reported separately from the data
+ for the 9-axis IMU (accel/gyro/mag). The 9-axis IMU is mounted
+ so that the X axis is "across" the board (along the short
+ axis0, the Y axis is "along" the board (along the long axis,
+ with the high-g accelerometer) and the Z axis is "through" the
+ board (perpendicular to the board). Rotation measurements are
+ around the respective axis, so Y rotation measures the spin
+ rate of the rocket while X and Z rotation measure the tilt
+ rate.
+
+ The overall tilt angle of the rocket is computed by first
+ measuring the orientation of the rocket on the pad using the 3
+ axis accelerometer, and then integrating the overall tilt rate
+ from the 3 axis gyroscope to compute the total orientation
+ change of the airframe since liftoff.
+
+ .TeleMega IMU Sensor Packet Contents
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |5 |uint8_t |orient |Angle from vertical in degrees
+ |6 |int16_t |accel |High G accelerometer
+ |8 |int32_t |pres |pressure (Pa * 10)
+ |12 |int16_t |temp |temperature (°C * 100)
+ |14 |int16_t |accel_x |X axis acceleration (across)
+ |16 |int16_t |accel_y |Y axis acceleration (along)
+ |18 |int16_t |accel_z |Z axis acceleration (through)
+ |20 |int16_t |gyro_x |X axis rotation (across)
+ |22 |int16_t |gyro_y |Y axis rotation (along)
+ |24 |int16_t |gyro_z |Z axis rotation (through)
+ |26 |int16_t |mag_x |X field strength (across)
+ |28 |int16_t |mag_y |Y field strength (along)
+ |30 |int16_t |mag_z |Z field strength (through)
+ |32
+ |====
+
+ .TeleMega Kalman and Voltage Data Packet Contents
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |5 |uint8_t |state |Flight state
+ |6 |int16_t |v_batt |battery voltage
+ |8 |int16_t |v_pyro |pyro battery voltage
+ |10 |int8_t[6] |sense |pyro continuity sense
+ |16 |int32_t |ground_pres |Average barometer reading on ground
+ |20 |int16_t |ground_accel |Average accelerometer reading on ground
+ |22 |int16_t |accel_plus_g |Accel calibration at +1g
+ |24 |int16_t |accel_minus_g |Accel calibration at -1g
+ |26 |int16_t |acceleration |m/s² * 16
+ |28 |int16_t |speed |m/s * 16
+ |30 |int16_t |height |m
+ |32
+ |====
+
+ === TeleMetrum v2 Sensor Data
+
+ .TeleMetrum v2 Packet Type
+ [options="border",cols="1,3"]
+ |====
+ |Type |Description
+ |0x0A |TeleMetrum v2 Sensor Data
+ |0x0B |TeleMetrum v2 Calibration Data
+ |====
+
+ TeleMetrum v2 has higher resolution barometric data than
+ TeleMetrum v1, and so the constant calibration data is
+ split out into a separate packet.
+
+ TeleMetrum v2 Sensor Data packets are transmitted once per second on the
+ ground, 10 times per second during ascent and once per second
+ during descent and landing
+
+ TeleMetrum v2 Calibration Data packets are always transmitted once per second.
+
+ .TeleMetrum v2 Sensor Packet Contents
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |5 |uint8_t |state |Flight state
+ |6 |int16_t |accel |accelerometer
+ |8 |int32_t |pres |pressure sensor (Pa * 10)
+ |12 |int16_t |temp |temperature sensor (°C * 100)
+ |14 |int16_t |acceleration |m/s² * 16
+ |16 |int16_t |speed |m/s * 16
+ |18 |int16_t |height |m
+ |20 |int16_t |v_batt |battery voltage
+ |22 |int16_t |sense_d |drogue continuity sense
+ |24 |int16_t |sense_m |main continuity sense
+ |26 |pad[6] |pad bytes |
+ |32
+ |====
+
+ .TeleMetrum v2 Calibration Data Packet Contents
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |5 |pad[3] |pad bytes |
+ |8 |int32_t |ground_pres |Average barometer reading on ground
+ |12 |int16_t |ground_accel |Average accelerometer reading on ground
+ |14 |int16_t |accel_plus_g |Accel calibration at +1g
+ |16 |int16_t |accel_minus_g |Accel calibration at -1g
+ |18 |pad[14] |pad bytes |
+ |32
+ |====
+
+ === Configuration Data
+
+ .Configuration Packet Type
+ [options="border",cols="1,3"]
+ |====
+ |Type |Description
+ |0x04 |Configuration Data
+ |====
+
+ This provides a description of the software installed on the
+ flight computer as well as any user-specified configuration data.
+
+ Configuration data packets are transmitted once per second
+ during all phases of the flight
+
+ .Configuration Packet Contents
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |5 |uint8_t |type |Device type
+ |6 |uint16_t |flight |Flight number
+ |8 |uint8_t |config_major |Config major version
+ |9 |uint8_t |config_minor |Config minor version
+ |10 |uint16_t |apogee_delay |Apogee deploy delay in seconds
+ |12 |uint16_t |main_deploy |Main deploy alt in meters
+ |14 |uint16_t |flight_log_max |Maximum flight log size (kB)
+ |16 |char |callsign[8] |Radio operator identifier
+ |24 |char |version[8] |Software version identifier
+ |32
+ |====
+
+ === GPS Location
+
+ .GPS Packet Type
+ [options="border",cols="1,3"]
+ |====
+ |Type |Description
+ |0x05 |GPS Location
+ |====
+
+ This packet provides all of the information available from the
+ GPS receiver—position, time, speed and precision
+ estimates.
+
+ GPS Location packets are transmitted once per second during
+ all phases of the flight
+
+ .GPS Location Packet Contents
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |5 |uint8_t |flags |See GPS Flags table below
+ |6 |int16_t |altitude |m
+ |8 |int32_t |latitude |degrees * 107
+ |12 |int32_t |longitude |degrees * 107
+ |16 |uint8_t |year |
+ |17 |uint8_t |month |
+ |18 |uint8_t |day |
+ |19 |uint8_t |hour |
+ |20 |uint8_t |minute |
+ |21 |uint8_t |second |
+ |22 |uint8_t |pdop |* 5
+ |23 |uint8_t |hdop |* 5
+ |24 |uint8_t |vdop |* 5
+ |25 |uint8_t |mode |See GPS Mode table below
+ |26 |uint16_t |ground_speed |cm/s
+ |28 |int16_t |climb_rate |cm/s
+ |30 |uint8_t |course |/ 2
+ |31 |uint8_t |unused[1] |
+ |32
+ |====
+
+ 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.
+
+ .GPS Flags
+ [options="border",cols="1,2,7"]
+ |====
+ |Bits |Name |Description
+ |0-3 |nsats |Number of satellites in solution
+ |4 |valid |GPS solution is valid
+ |5 |running |GPS receiver is operational
+ |6 |date_valid |Reported date is valid
+ |7 |course_valid |ground speed, course and climb rates are valid
+ |====
+
+ 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.
+
+ .GPS Mode
+ [options="border",cols="1,3,7"]
+ |====
+ |Mode |Name |Description
+ |N |Not Valid |All data are invalid
+ |A |Autonomous mode |
+ Data are derived from satellite data
+
+ |D |Differential Mode |
+ Data are augmented with differential data from a
+ known ground station. The SkyTraq unit in TeleMetrum
+ does not support this mode
+
+ |E |Estimated |
+ Data are estimated using dead reckoning from the
+ last known data
+
+ |M |Manual |
+ Data were entered manually
+
+ |S |Simulated |
+ GPS receiver testing mode
+
+ |====
+
+ === GPS Satellite Data
+
+ .GPS Satellite Data Packet Type
+ [options="border",cols="1,3"]
+ |====
+ |Type |Description
+ |0x06 |GPS Satellite Data
+ |====
+
+ 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.
+
+ GPS Satellite data are transmitted once per second
+ during all phases of the flight.
+
+ .GPS Satellite Data Contents
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |5 |uint8_t |channels |Number of reported satellite information
+ |6 |sat_info_t |sats[12] |See Per-Satellite data table below
+ |30 |uint8_t |unused[2] |
+ |32
+ |====
+
+ .GPS Per-Satellite data (sat_info_t)
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |0 |uint8_t |svid |Space Vehicle Identifier
+ |1 |uint8_t |c_n_1 |C/N1 signal quality indicator
+ |2
+ |====
+
+ === Companion Data
+
+ .Companion Data Packet Type
+ [options="border",cols="1,3"]
+ |====
+ |Type |Description
+ |0x07 |Companion Data
+ |====
+
+ When a companion board is attached to TeleMega or
+ TeleMetrum, it can provide telemetry data to be
+ included in the downlink. The companion board can
+ provide up to 12 16-bit data values.
+
+ The companion board itself specifies the transmission
+ rate. On the ground and during descent, that rate is
+ limited to one packet per second. During ascent, that
+ rate is limited to 10 packets per second.
+
+ .Companion Data Contents
+ [options="border",cols="2,3,3,9"]
+ |====
+ |Offset |Data Type |Name |Description
+ |5 |uint8_t |board_id |Type of companion board attached
+ |6 |uint8_t |update_period |How often telemetry is sent, in 1/100ths of a second
+ |7 |uint8_t |channels |Number of data channels supplied
+ |8 |uint16_t[12] |companion_data |Up to 12 channels of 16-bit companion data
+ |32
+ |====
+
+== Data Transmission
+
+ Altus Metrum devices use Texas Instruments sub-GHz digital
+ radio products. Ground stations use parts with HW FEC while
+ some flight computers perform FEC in software. TeleGPS is
+ transmit-only.
+
+ .Altus Metrum Radio Parts
+ [options="border",cols="1,4,4"]
+ |====
+ |Part Number |Description |Used in
+
+ |CC1111
+ |10mW transceiver with integrated SoC
+ |TeleDongle v0.2, TeleBT v1.0, TeleMetrum v1.x, TeleMini
+
+ |CC1120
+ |35mW transceiver with SW FEC
+ |TeleMetrum v2, TeleMega
+
+ |CC1200
+ |35mW transceiver with HW FEC
+ |TeleDongle v3.0, TeleBT v3.0
+
+ |CC115L
+ |14mW transmitter with SW FEC
+ |TeleGPS
+
+ |====
+
+ === Modulation Scheme
+
+ Texas Instruments provides a tool for computing
+ modulation parameters given a desired modulation
+ format and basic bit rate.
+
+ While we might like to use something with better
+ low-signal performance like BPSK, the radios we use
+ don't support that, but do support Gaussian frequency
+ shift keying (GFSK). Regular frequency shift keying
+ (FSK) encodes the signal by switching the carrier
+ between two frequencies. The Gaussian version is
+ essentially the same, but the shift between
+ frequencies gently follows a gaussian curve, rather
+ than switching immediately. This tames the bandwidth
+ of the signal without affecting the ability to
+ transmit data.
+
+ For AltOS, there are three available bit rates,
+ 38.4kBaud, 9.6kBaud and 2.4kBaud resulting in the
+ following signal parmeters:
+
+ .Modulation Scheme
+ [options="border",cols="1,1,1"]
+ |====
+ |Rate |Deviation |Receiver Bandwidth
+ |38.4kBaud |20.5kHz |100kHz
+ |9.6kBaud |5.125kHz |25kHz
+ |2.4kBaud |1.5kHz |5kHz
+ |====
+
+ === Error Correction
+
+ The cc1111 and cc1200 provide forward error correction
+ in hardware; on the cc1120 and cc115l that's done in
+ software. AltOS uses this to improve reception of weak
+ signals. As it's a rate 1/2 encoding, each bit of data
+ takes two bits when transmitted, so the effective data
+ rate is half of the raw transmitted bit rate.
+
+ .Error Correction
+ [options="border",cols="1,1,1"]
+ |====
+ |Parameter |Value |Description
+
+ |Error Correction
+ |Convolutional coding
+ |1/2 rate, constraint length m=4
+
+ |Interleaving
+ |4 x 4
+ |Reduce effect of noise burst
+
+ |Data Whitening
+ |XOR with 9-bit PNR
+ |Rotate right with bit 8 = bit 0 xor bit 5, initial value 111111111
+
+ |====
+
+== TeleDongle serial packet format
+
+ 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.
+
+ ....
+ TELEM 224f01080b05765e00701f1a1bbeb8d7b60b070605140c000600000000000000003fa988
+ ....
+
+ 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.
+
+ .TeleDongle serial Packet Format
+
+ [options="border",cols="2,1,1,5"]
+ |====
+ |Offset |Name |Example |Description
+
+ |0
+ |length
+ |22
+ |Total length of data bytes in the line. Note that
+ this includes the added RSSI and status bytes
+
+ |1 ·· length-3
+ |packet
+ |4f ·· 00
+ |Bytes of actual packet data
+
+ |length-2
+ |rssi
+ |3f
+ |Received signal strength. dBm = rssi / 2 - 74
+
+ |length-1
+ |lqi
+ |a9
+ |Link Quality Indicator and CRC status. Bit 7
+ is set when the CRC is correct
+
+ |length
+ |checksum
+ |88
+ |(0x5a + sum(bytes 1 ·· length-1)) % 256
+
+ |====
+
+== History and Motivation
+
+ 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.
+
+ 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.
+
+ 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.
+++ /dev/null
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE article 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>
- <para>
- This section first defines the packet header common to all packets
- and then the per-packet data layout.
- </para>
- <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>TeleMetrum v1.x, TeleMini and TeleNano 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 v1.x 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 v1.x, TeleMini and TeleNano share this same packet
- format for sensor data. Each uses a distinct packet type so
- that the receiver knows which data values are valid and which
- are undefined.
- </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>TeleMega 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>0x08</entry>
- <entry>TeleMega IMU Sensor Data</entry>
- </row>
- <row>
- <entry>0x09</entry>
- <entry>TeleMega Kalman and Voltage Data</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- <para>
- TeleMega has a lot of sensors, and so it splits the sensor
- data into two packets. The raw IMU data are sent more often;
- the voltage values don't change very fast, and the Kalman
- values can be reconstructed from the IMU data.
- </para>
- <para>
- IMU Sensor Data packets are transmitted once per second on the
- ground, 10 times per second during ascent and once per second
- during descent and landing
- </para>
- <para>
- Kalman and Voltage Data packets are transmitted once per second on the
- ground, 5 times per second during ascent and once per second
- during descent and landing
- </para>
- <para>
- The high-g accelerometer is reported separately from the data
- for the 9-axis IMU (accel/gyro/mag). The 9-axis IMU is mounted
- so that the X axis is "across" the board (along the short
- axis0, the Y axis is "along" the board (along the long axis,
- with the high-g accelerometer) and the Z axis is "through" the
- board (perpendicular to the board). Rotation measurements are
- around the respective axis, so Y rotation measures the spin
- rate of the rocket while X and Z rotation measure the tilt
- rate.
- </para>
- <para>
- The overall tilt angle of the rocket is computed by first
- measuring the orientation of the rocket on the pad using the 3
- axis accelerometer, and then integrating the overall tilt rate
- from the 3 axis gyroscope to compute the total orientation
- change of the airframe since liftoff.
- </para>
- <table frame='all'>
- <title>TeleMega IMU 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>orient</entry><entry>Angle from vertical in degrees</entry>
- </row>
- <row>
- <entry>6</entry><entry>int16_t</entry><entry>accel</entry><entry>High G accelerometer</entry>
- </row>
- <row>
- <entry>8</entry><entry>int32_t</entry><entry>pres</entry><entry>pressure (Pa * 10)</entry>
- </row>
- <row>
- <entry>12</entry><entry>int16_t</entry><entry>temp</entry><entry>temperature (°C * 100)</entry>
- </row>
- <row>
- <entry>14</entry><entry>int16_t</entry><entry>accel_x</entry><entry>X axis acceleration (across)</entry>
- </row>
- <row>
- <entry>16</entry><entry>int16_t</entry><entry>accel_y</entry><entry>Y axis acceleration (along)</entry>
- </row>
- <row>
- <entry>18</entry><entry>int16_t</entry><entry>accel_z</entry><entry>Z axis acceleration (through)</entry>
- </row>
- <row>
- <entry>20</entry><entry>int16_t</entry><entry>gyro_x</entry><entry>X axis rotation (across)</entry>
- </row>
- <row>
- <entry>22</entry><entry>int16_t</entry><entry>gyro_y</entry><entry>Y axis rotation (along)</entry>
- </row>
- <row>
- <entry>24</entry><entry>int16_t</entry><entry>gyro_z</entry><entry>Z axis rotation (through)</entry>
- </row>
- <row>
- <entry>26</entry><entry>int16_t</entry><entry>mag_x</entry><entry>X field strength (across)</entry>
- </row>
- <row>
- <entry>28</entry><entry>int16_t</entry><entry>mag_y</entry><entry>Y field strength (along)</entry>
- </row>
- <row>
- <entry>30</entry><entry>int16_t</entry><entry>mag_z</entry><entry>Z field strength (through)</entry>
- </row>
- <row>
- <entry>32</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <table frame='all'>
- <title>TeleMega Kalman and Voltage Data 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>v_batt</entry><entry>battery voltage</entry>
- </row>
- <row>
- <entry>8</entry><entry>int16_t</entry><entry>v_pyro</entry><entry>pyro battery voltage</entry>
- </row>
- <row>
- <entry>10</entry><entry>int8_t[6]</entry><entry>sense</entry><entry>pyro continuity sense</entry>
- </row>
- <row>
- <entry>16</entry><entry>int32_t</entry><entry>ground_pres</entry><entry>Average barometer reading on ground</entry>
- </row>
- <row>
- <entry>20</entry><entry>int16_t</entry><entry>ground_accel</entry><entry>Average accelerometer reading on ground</entry>
- </row>
- <row>
- <entry>22</entry><entry>int16_t</entry><entry>accel_plus_g</entry><entry>Accel calibration at +1g</entry>
- </row>
- <row>
- <entry>24</entry><entry>int16_t</entry><entry>accel_minus_g</entry><entry>Accel calibration at -1g</entry>
- </row>
- <row>
- <entry>26</entry><entry>int16_t</entry><entry>acceleration</entry><entry>m/s² * 16</entry>
- </row>
- <row>
- <entry>28</entry><entry>int16_t</entry><entry>speed</entry><entry>m/s * 16</entry>
- </row>
- <row>
- <entry>30</entry><entry>int16_t</entry><entry>height</entry><entry>m</entry>
- </row>
- <row>
- <entry>32</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>TeleMetrum v2 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>0x0A</entry>
- <entry>TeleMetrum v2 Sensor Data</entry>
- </row>
- <row>
- <entry>0x0B</entry>
- <entry>TeleMetrum v2 Calibration Data</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- <para>
- TeleMetrum v2 has higher resolution barometric data than
- TeleMetrum v1, and so the constant calibration data is
- split out into a separate packet.
- </para>
- <para>
- TeleMetrum v2 Sensor Data packets are transmitted once per second on the
- ground, 10 times per second during ascent and once per second
- during descent and landing
- </para>
- <para>
- TeleMetrum v2 Calibration Data packets are always transmitted once per second.
- </para>
- <table frame='all'>
- <title>TeleMetrum v2 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</entry>
- </row>
- <row>
- <entry>8</entry><entry>int32_t</entry><entry>pres</entry><entry>pressure sensor (Pa * 10)</entry>
- </row>
- <row>
- <entry>12</entry><entry>int16_t</entry><entry>temp</entry><entry>temperature sensor (°C * 100)</entry>
- </row>
-
- <row>
- <entry>14</entry><entry>int16_t</entry><entry>acceleration</entry><entry>m/s² * 16</entry>
- </row>
- <row>
- <entry>16</entry><entry>int16_t</entry><entry>speed</entry><entry>m/s * 16</entry>
- </row>
- <row>
- <entry>18</entry><entry>int16_t</entry><entry>height</entry><entry>m</entry>
- </row>
-
- <row>
- <entry>20</entry><entry>int16_t</entry><entry>v_batt</entry><entry>battery voltage</entry>
- </row>
- <row>
- <entry>22</entry><entry>int16_t</entry><entry>sense_d</entry><entry>drogue continuity sense</entry>
- </row>
- <row>
- <entry>24</entry><entry>int16_t</entry><entry>sense_m</entry><entry>main continuity sense</entry>
- </row>
- <row>
- <entry>26</entry><entry>pad[6]</entry><entry>pad bytes</entry><entry></entry>
- </row>
- <row>
- <entry>32</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <table frame='all'>
- <title>TeleMetrum v2 Calibration Data 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>pad[3]</entry><entry>pad bytes</entry><entry></entry>
- </row>
- <row>
- <entry>8</entry><entry>int32_t</entry><entry>ground_pres</entry><entry>Average barometer reading on ground</entry>
- </row>
- <row>
- <entry>12</entry><entry>int16_t</entry><entry>ground_accel</entry><entry>Average accelerometer reading on ground</entry>
- </row>
- <row>
- <entry>14</entry><entry>int16_t</entry><entry>accel_plus_g</entry><entry>Accel calibration at +1g</entry>
- </row>
- <row>
- <entry>16</entry><entry>int16_t</entry><entry>accel_minus_g</entry><entry>Accel calibration at -1g</entry>
- </row>
- <row>
- <entry>18</entry><entry>pad[14]</entry><entry>pad bytes</entry><entry></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
- 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>
- <title>Companion Data 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>0x07</entry>
- <entry>Companion Data Data</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- <para>
- When a companion board is attached to TeleMega or TeleMetrum,
- it can provide telemetry data to be included in the
- downlink. The companion board can provide up to 12 16-bit data
- values.
- </para>
- <para>
- The companion board itself specifies the transmission rate. On
- the ground and during descent, that rate is limited to one
- packet per second. During ascent, that rate is limited to 10
- packets per second.
- </para>
- <table frame='all'>
- <title>Companion 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>board_id</entry>
- <entry>Type of companion board attached</entry>
- </row>
- <row>
- <entry>6</entry><entry>uint8_t</entry><entry>update_period</entry>
- <entry>How often telemetry is sent, in 1/100ths of a second</entry>
- </row>
- <row>
- <entry>7</entry><entry>uint8_t</entry><entry>channels</entry>
- <entry>Number of data channels supplied</entry>
- </row>
- <row>
- <entry>8</entry><entry>uint16_t[12]</entry><entry>companion_data</entry>
- <entry>Up to 12 channels of 16-bit companion data</entry>
- </row>
- <row>
- <entry>32</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- </section>
- <section>
- <title>Data Transmission</title>
- <para>
- Altus Metrum devices use Texas Instruments sub-GHz digital radio
- products. Ground stations use parts with HW FEC while some
- flight computers perform FEC in software. TeleGPS is
- transmit-only.
- </para>
- <table>
- <title>Altus Metrum Radio Parts</title>
- <tgroup cols='3'>
- <colspec align="center" colwidth="*" colname="Part Number"/>
- <colspec align="center" colwidth="*" colname="Description"/>
- <colspec align="left" colwidth="*" colname="Used in"/>
- <thead>
- <row>
- <entry align="center">Part Number</entry>
- <entry align="center">Description</entry>
- <entry align="center">Used in</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>CC1111</entry><entry>10mW transceiver with integrated SoC</entry>
- <entry>TeleDongle v0.2, TeleBT v1.0, TeleMetrum v1.x, TeleMini</entry>
- </row>
- <row>
- <entry>CC1120</entry><entry>35mW transceiver with SW FEC</entry>
- <entry>TeleMetrum v2, TeleMega</entry>
- </row>
- <row>
- <entry>CC1200</entry><entry>35mW transceiver with HW FEC</entry>
- <entry>TeleDongle v3.0, TeleBT v3.0</entry>
- </row>
- <row>
- <entry>CC115L</entry><entry>14mW transmitter with SW FEC</entry>
- <entry>TeleGPS</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <section>
- <title>Modulation Scheme</title>
- <para>
- Texas Instruments provides a tool for computing modulation
- parameters given a desired modulation format and basic bit
- rate.
-
- While we might like to use something with better low-signal
- performance like BPSK, the radios we use don't support that,
- but do support Gaussian frequency shift keying (GFSK). Regular
- frequency shift keying (FSK) encodes the signal by switching
- the carrier between two frequencies. The Gaussian version is
- essentially the same, but the shift between frequencies gently
- follows a gaussian curve, rather than switching
- immediately. This tames the bandwidth of the signal without
- affecting the ability to transmit data.
-
- For AltOS, there are three available bit rates, 38.4kBaud,
- 9.6kBaud and 2.4kBaud resulting in the following signal
- parmeters:
-
- </para>
- <table>
- <title>Modulation Scheme</title>
- <tgroup cols='3'>
- <colspec align="center" colwidth="*" colname="rate"/>
- <colspec align="center" colwidth="*" colname="deviation"/>
- <colspec align="center" colwidth="*" colname="bandwidth"/>
- <thead>
- <row>
- <entry align='center'>Rate</entry>
- <entry align='center'>Deviation</entry>
- <entry align='center'>Receiver Bandwidth</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>38.4kBaud</entry>
- <entry>20.5kHz</entry>
- <entry>100kHz</entry>
- </row>
- <row>
- <entry>9.6kBaud</entry>
- <entry>5.125kHz</entry>
- <entry>25kHz</entry>
- </row>
- <row>
- <entry>2.4kBaud</entry>
- <entry>1.5kHz</entry>
- <entry>5kHz</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>Error Correction</title>
- <para>
- The cc1111 and cc1200 provide forward error correction in
- hardware; on the cc1120 and cc115l that's done in
- software. AltOS uses this to improve reception of weak
- signals. As it's a rate 1/2 encoding, each bit of data takes
- two bits when transmitted, so the effective data rate is half
- of the raw transmitted bit rate.
- </para>
- <table>
- <title>Error Correction</title>
- <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</entry>
- <entry>1/2 rate, 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>
- <title>Packet Format</title>
- <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>
--- /dev/null
+= TeleMini Outline and Hole Pattern
+:doctype: article
+
+ This image, when printed, provides a precise template for the
+ mounting holes in TeleMini. TeleMini has overall dimensions of
+ 0.500 x 1.500 inches, and the mounting holes are sized for use
+ with 2-56 or M2 screws.
+
+ image::telemini.svg[align="center"]
--- /dev/null
+== TeleMini v1.0
+
+ .TeleMini v1.0 Board
+ image::telemini-v1-top.jpg[width="5.5in"]
+
+ TeleMini v1.0 is ½ inches by 1½ inches. 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 ¼ wave UHF wire antenna attached to
+ the center of one end of the board is about 7 inches long. Two
+ wires for the power switch are connected to holes in the
+ middle of the board. Screw terminals for 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.
+
+ === TeleMini v1.0 Screw Terminals
+
+ TeleMini v1.0 has four screw terminals on the end of the
+ board opposite the telemetry antenna. Two are for the apogee
+ and two are for main igniter circuits. There are also wires
+ soldered to the board for the power switch. Using the
+ picture above and starting from the top for the terminals
+ and from the left for the power switch wires, the
+ connections are as follows:
+
+ .TeleMini v1.0 Screw Terminals
+ [options="header",grid="all",cols="2,3,10"]
+ |====
+ |Terminal #|Terminal Name|Description
+
+ |1
+ |Apogee -
+ |Apogee pyro channel connection to pyro circuit
+
+ |2
+ |Apogee +
+ |Apogee pyro channel common connection to battery +
+
+ |3
+ |Main -
+ |Main pyro channel connection to pyro circuit
+
+ |4
+ |Main +
+ |Main pyro channel common connection to battery +
+
+ |Left
+ |Switch Output
+ |Switch connection to flight computer
+
+ |Right
+ |Switch Input
+ |Switch connection to positive battery terminal
+ |====
+
+ === Using a Separate Pyro Battery with TeleMini v1.0
+
+ As described above, using an external pyro battery involves
+ connecting the negative battery terminal to the flight
+ computer ground, connecting the positive battery terminal to
+ one of the igniter leads and connecting the other igniter
+ lead to the per-channel pyro circuit connection. Because
+ there is no solid ground connection to use on TeleMini, this
+ is not recommended.
+
+ The only available ground connection on TeleMini v1.0 are
+ the two mounting holes next to the telemetry
+ antenna. Somehow connect a small piece of wire to one of
+ those holes and hook it to the negative pyro battery terminal.
+
+ Connecting the positive battery terminal to the pyro
+ charges must be done separate from TeleMini v1.0, by soldering
+ them together or using some other connector.
+
+ The other lead from each pyro charge is then inserted into
+ the appropriate per-pyro channel screw terminal (terminal 3 for the
+ Main charge, terminal 1 for the Apogee charge).
+
+ === Using an Active Switch with TeleMini v1.0
+
+ As explained above, an external active switch requires three
+ connections, one to the positive battery terminal, one to
+ the flight computer positive input and one to ground. Again,
+ because TeleMini doesn't have any good ground connection,
+ this is not recommended.
+
+ The positive battery terminal is available on the Right
+ power switch wire, the positive flight computer input is on
+ the left power switch wire. Hook a lead to either of the
+ mounting holes for a ground connection.
--- /dev/null
+<!DOCTYPE t:templates [
+<!ENTITY hsize0 "10pt">
+<!ENTITY hsize1 "12pt">
+<!ENTITY hsize2 "14.4pt">
+<!ENTITY hsize3 "17.28pt">
+<!ENTITY hsize4 "20.736pt">
+<!ENTITY hsize5 "24.8832pt">
+<!ENTITY hsize0space "7.5pt"> <!-- 0.75 * hsize0 -->
+<!ENTITY hsize1space "9pt"> <!-- 0.75 * hsize1 -->
+<!ENTITY hsize2space "10.8pt"> <!-- 0.75 * hsize2 -->
+<!ENTITY hsize3space "12.96pt"> <!-- 0.75 * hsize3 -->
+<!ENTITY hsize4space "15.552pt"> <!-- 0.75 * hsize4 -->
+<!ENTITY hsize5space "18.6624pt"> <!-- 0.75 * hsize5 -->
+]>
+<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
+ xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<!-- ********************************************************************
+ $Id: titlepage.templates.xml 9722 2013-02-01 19:44:13Z bobstayton $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="article" t:wrapper="fo:block"
+ font-family="{$title.fontset}">
+
+ <t:titlepage-content t:side="recto"
+ start-indent="0pt"
+ text-align="center">
+
+ <mediaobject space-before="1em"/>
+
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::article[1]"
+ keep-with-next.within-column="always"
+ font-size="&hsize5;"
+ font-weight="bold"/>
+
+ <subtitle/>
+
+ <date/>
+
+ <corpauthor space-before="0.5em"
+ font-size="&hsize2;"/>
+ <authorgroup space-before="0.5em"
+ font-size="&hsize2;"/>
+ <author space-before="0.5em"
+ font-size="&hsize2;"/>
+
+ <!-- If you add editor, include this t:predicate attribute
+ because only the first editor generates the list of editors.
+ <editor t:predicate="[position() = 1]"/>
+ -->
+ <othercredit space-before="0.15in"/>
+ <releaseinfo space-before="0.15in"/>
+ <copyright space-before="0.15in"/>
+ <legalnotice text-align="start"
+ margin-left="0.5in"
+ margin-right="0.5in"
+ font-family="{$body.fontset}"/>
+ <pubdate space-before="0.15in"/>
+ <revision space-before="0.15in"/>
+ <revhistory space-before="0.15in"/>
+ <abstract space-before="0.15in"
+ text-align="start"
+ margin-left="0.5in"
+ margin-right="0.5in"
+ font-family="{$body.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="set" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="division.title"
+ param:node="ancestor-or-self::set[1]"
+ text-align="center"
+ font-size="&hsize5;"
+ space-before="&hsize5space;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"
+ text-align="center"/>
+ <corpauthor space-before="0.25in"/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="book" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="division.title"
+ param:node="ancestor-or-self::book[1]"
+ text-align="center"
+ font-size="&hsize5;"
+ space-before="&hsize5space;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ text-align="center"
+ font-size="&hsize4;"
+ space-before="&hsize4space;"
+ font-family="{$title.fontset}"/>
+<!--
+ <corpauthor font-size="&hsize3;"
+ keep-with-next.within-column="always"
+ space-before="2in"/>
+ -->
+ <authorgroup space-before="2in"/>
+ <author font-size="&hsize3;"
+ space-before="&hsize2space;"
+ keep-with-next.within-column="always"/>
+ <!-- If you add editor, include this t:predicate attribute
+ because only the first editor generates the list of editors.
+ <editor t:predicate="[position() = 1]"/>
+ -->
+ <mediaobject space-before="1.5in"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ <title
+ t:named-template="book.verso.title"
+ font-size="&hsize2;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <authorgroup t:named-template="verso.authorgroup"/>
+ <author/>
+ <!-- If you add editor, include this t:predicate attribute
+ because only the first editor generates the list of editors.
+ <editor t:predicate="[position() = 1]"/>
+ -->
+ <othercredit/>
+ <releaseinfo space-before="0.15in"/>
+ <pubdate space-before="1em"/>
+ <copyright/>
+ <abstract/>
+ <legalnotice font-size="8pt"/>
+ <corpauthor text-align="center" space-before="0.5in"/>
+ <revhistory space-before="0.5in"/>
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <fo:block break-after="page"/>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ <fo:block break-after="page"/>
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="part" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="division.title"
+ param:node="ancestor-or-self::part[1]"
+ text-align="center"
+ font-size="&hsize5;"
+ space-before="&hsize5space;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ text-align="center"
+ font-size="&hsize4;"
+ space-before="&hsize4space;"
+ font-weight='bold'
+ font-style='italic'
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="partintro" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ text-align="center"
+ font-size="&hsize5;"
+ font-weight="bold"
+ space-before="1em"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ text-align="center"
+ font-size="&hsize2;"
+ font-weight="bold"
+ font-style="italic"
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="reference" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="division.title"
+ param:node="ancestor-or-self::reference[1]"
+ text-align="center"
+ font-size="&hsize5;"
+ space-before="&hsize5space;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"
+ text-align="center"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsynopsisdiv" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsection" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsect1" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsect2" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsect3" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="dedication" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::dedication[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<!-- Same formatting as dedication -->
+ <t:titlepage t:element="acknowledgements" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::acknowledgements[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="preface" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::preface[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="chapter" t:wrapper="fo:block"
+ font-family="{$title.fontset}">
+ <t:titlepage-content t:side="recto" margin-left="{$title.margin.left}">
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::chapter[1]"
+ font-size="&hsize5;"
+ font-weight="bold"/>
+
+ <subtitle space-before="0.5em"
+ font-style="italic"
+ font-size="&hsize2;"
+ font-weight="bold"/>
+
+ <corpauthor space-before="0.5em"
+ space-after="0.5em"
+ font-size="&hsize2;"/>
+
+ <authorgroup space-before="0.5em"
+ space-after="0.5em"
+ font-size="&hsize2;"/>
+
+ <author space-before="0.5em"
+ space-after="0.5em"
+ font-size="&hsize2;"/>
+
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="appendix" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="component.title"
+ param:node="ancestor-or-self::appendix[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="section" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect1" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect2" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect3" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect4" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect5" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="simplesect" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="topic" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-weight="bold"
+ font-size="&hsize3;"
+ space-before="1em"
+ space-after="1em"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="bibliography" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::bibliography[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="bibliodiv" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::bibliodiv[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize4;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="glossary" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::glossary[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="glossdiv" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::glossdiv[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize4;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="index" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::index[1]"
+ param:pagewide="1"
+ margin-left="0pt"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <!-- The indexdiv.title template is used so that manual and -->
+ <!-- automatically generated indexdiv titles get the same -->
+ <!-- formatting. -->
+
+ <t:titlepage t:element="indexdiv" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title t:force="1"
+ t:named-template="indexdiv.title"
+ param:title="title"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="setindex" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::setindex[1]"
+ param:pagewide="1"
+ margin-left="0pt"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="colophon" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::colophon[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="sidebar" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+<t:titlepage t:element="qandaset" t:wrapper="fo:block"
+ font-family="{$title.fontset}">
+
+ <t:titlepage-content t:side="recto"
+ start-indent="0pt"
+ text-align="center">
+
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::qandaset[1]"
+ keep-with-next.within-column="always"
+ font-size="&hsize5;"
+ font-weight="bold"/>
+
+ <subtitle/>
+
+ <corpauthor space-before="0.5em"
+ font-size="&hsize2;"/>
+ <authorgroup space-before="0.5em"
+ font-size="&hsize2;"/>
+ <author space-before="0.5em"
+ font-size="&hsize2;"/>
+
+ <othercredit space-before="0.5em"/>
+ <releaseinfo space-before="0.5em"/>
+ <copyright space-before="0.5em"/>
+ <legalnotice text-align="start"
+ margin-left="0.5in"
+ margin-right="0.5in"
+ font-family="{$body.fontset}"/>
+ <pubdate space-before="0.5em"/>
+ <revision space-before="0.5em"/>
+ <revhistory space-before="0.5em"/>
+ <abstract space-before="0.5em"
+ text-align="start"
+ margin-left="0.5in"
+ margin-right="0.5in"
+ font-family="{$body.fontset}"/>
+ <itermset/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="table.of.contents" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'TableofContents'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.tables" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofTables'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.figures" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofFigures'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.examples" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofExamples'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.equations" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofEquations'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.procedures" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofProcedures'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.unknowns" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofUnknown'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="component.list.of.tables" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofTables'"
+ space-before.minimum="1em"
+ space-before.optimum="1em"
+ space-before.maximum="1em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize1;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="component.list.of.figures" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofFigures'"
+ space-before.minimum="1em"
+ space-before.optimum="1em"
+ space-before.maximum="1em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize1;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="component.list.of.examples" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofExamples'"
+ space-before.minimum="1em"
+ space-before.optimum="1em"
+ space-before.maximum="1em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize1;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="component.list.of.equations" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofEquations'"
+ space-before.minimum="1em"
+ space-before.optimum="1em"
+ space-before.maximum="1em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize1;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="component.list.of.procedures" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofProcedures'"
+ space-before.minimum="1em"
+ space-before.optimum="1em"
+ space-before.maximum="1em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize1;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="component.list.of.unknowns" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofUnknown'"
+ space-before.minimum="1em"
+ space-before.optimum="1em"
+ space-before.maximum="1em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize1;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+</t:templates>
+++ /dev/null
-<!DOCTYPE t:templates [
-<!ENTITY hsize0 "10pt">
-<!ENTITY hsize1 "12pt">
-<!ENTITY hsize2 "14.4pt">
-<!ENTITY hsize3 "17.28pt">
-<!ENTITY hsize4 "20.736pt">
-<!ENTITY hsize5 "24.8832pt">
-<!ENTITY hsize0space "7.5pt"> <!-- 0.75 * hsize0 -->
-<!ENTITY hsize1space "9pt"> <!-- 0.75 * hsize1 -->
-<!ENTITY hsize2space "10.8pt"> <!-- 0.75 * hsize2 -->
-<!ENTITY hsize3space "12.96pt"> <!-- 0.75 * hsize3 -->
-<!ENTITY hsize4space "15.552pt"> <!-- 0.75 * hsize4 -->
-<!ENTITY hsize5space "18.6624pt"> <!-- 0.75 * hsize5 -->
-]>
-<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
- xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-<!-- ********************************************************************
- $Id: titlepage.templates.xml 9722 2013-02-01 19:44:13Z bobstayton $
- ********************************************************************
-
- This file is part of the DocBook XSL Stylesheet distribution.
- See ../README or http://docbook.sf.net/ for copyright
- copyright and other information.
-
- ******************************************************************** -->
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="article" t:wrapper="fo:block"
- font-family="{$title.fontset}">
-
- <t:titlepage-content t:side="recto"
- start-indent="0pt"
- text-align="center">
-
- <title t:named-template="component.title"
- param:node="ancestor-or-self::article[1]"
- keep-with-next.within-column="always"
- font-size="&hsize5;"
- font-weight="bold"/>
-
- <subtitle/>
-
- <corpauthor space-before="0.5em"
- font-size="&hsize2;"/>
- <authorgroup space-before="0.5em"
- font-size="&hsize2;"/>
- <author space-before="0.5em"
- font-size="&hsize2;"/>
-
- <!-- If you add editor, include this t:predicate attribute
- because only the first editor generates the list of editors.
- <editor t:predicate="[position() = 1]"/>
- -->
- <othercredit space-before="0.5em"/>
- <releaseinfo space-before="0.5em"/>
- <copyright space-before="0.5em"/>
- <legalnotice text-align="start"
- margin-left="0.5in"
- margin-right="0.5in"
- font-family="{$body.fontset}"/>
- <pubdate space-before="0.5em"/>
- <revision space-before="0.5em"/>
- <revhistory space-before="0.5em"/>
- <abstract space-before="0.5em"
- text-align="start"
- margin-left="0.5in"
- margin-right="0.5in"
- font-family="{$body.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="set" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:named-template="division.title"
- param:node="ancestor-or-self::set[1]"
- text-align="center"
- font-size="&hsize5;"
- space-before="&hsize5space;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"
- text-align="center"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="book" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:named-template="division.title"
- param:node="ancestor-or-self::book[1]"
- text-align="center"
- font-size="&hsize5;"
- space-before="&hsize5space;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- <subtitle
- text-align="center"
- font-size="&hsize4;"
- space-before="&hsize4space;"
- font-family="{$title.fontset}"/>
- <corpauthor font-size="&hsize3;"
- keep-with-next.within-column="always"
- space-before="2in"/>
- <authorgroup space-before="2in"/>
- <author font-size="&hsize3;"
- space-before="&hsize2space;"
- keep-with-next.within-column="always"/>
- <!-- If you add editor, include this t:predicate attribute
- because only the first editor generates the list of editors.
- <editor t:predicate="[position() = 1]"/>
- -->
- <mediaobject space-before="1.5in"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- <title
- t:named-template="book.verso.title"
- font-size="&hsize2;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup t:named-template="verso.authorgroup"/>
- <author/>
- <!-- If you add editor, include this t:predicate attribute
- because only the first editor generates the list of editors.
- <editor t:predicate="[position() = 1]"/>
- -->
- <othercredit/>
- <releaseinfo space-before="0.5em"/>
- <pubdate space-before="1em"/>
- <copyright/>
- <abstract/>
- <legalnotice font-size="8pt"/>
- </t:titlepage-content>
-
- <t:titlepage-separator>
- <fo:block break-after="page"/>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- <fo:block break-after="page"/>
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="part" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:named-template="division.title"
- param:node="ancestor-or-self::part[1]"
- text-align="center"
- font-size="&hsize5;"
- space-before="&hsize5space;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- <subtitle
- text-align="center"
- font-size="&hsize4;"
- space-before="&hsize4space;"
- font-weight='bold'
- font-style='italic'
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="partintro" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- text-align="center"
- font-size="&hsize5;"
- font-weight="bold"
- space-before="1em"
- font-family="{$title.fontset}"/>
- <subtitle
- text-align="center"
- font-size="&hsize2;"
- font-weight="bold"
- font-style="italic"
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="reference" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:named-template="division.title"
- param:node="ancestor-or-self::reference[1]"
- text-align="center"
- font-size="&hsize5;"
- space-before="&hsize5space;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"
- text-align="center"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="refsynopsisdiv" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="refsection" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="refsect1" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="refsect2" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="refsect3" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="dedication" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="component.title"
- param:node="ancestor-or-self::dedication[1]"
- margin-left="{$title.margin.left}"
- font-size="&hsize5;"
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<!-- Same formatting as dedication -->
- <t:titlepage t:element="acknowledgements" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="component.title"
- param:node="ancestor-or-self::acknowledgements[1]"
- margin-left="{$title.margin.left}"
- font-size="&hsize5;"
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="preface" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="component.title"
- param:node="ancestor-or-self::preface[1]"
- margin-left="{$title.margin.left}"
- font-size="&hsize5;"
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="chapter" t:wrapper="fo:block"
- font-family="{$title.fontset}">
- <t:titlepage-content t:side="recto" margin-left="{$title.margin.left}">
- <title t:named-template="component.title"
- param:node="ancestor-or-self::chapter[1]"
- font-size="&hsize5;"
- font-weight="bold"/>
-
- <subtitle space-before="0.5em"
- font-style="italic"
- font-size="&hsize2;"
- font-weight="bold"/>
-
- <corpauthor space-before="0.5em"
- space-after="0.5em"
- font-size="&hsize2;"/>
-
- <authorgroup space-before="0.5em"
- space-after="0.5em"
- font-size="&hsize2;"/>
-
- <author space-before="0.5em"
- space-after="0.5em"
- font-size="&hsize2;"/>
-
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="appendix" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:named-template="component.title"
- param:node="ancestor-or-self::appendix[1]"
- margin-left="{$title.margin.left}"
- font-size="&hsize5;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="section" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- margin-left="{$title.margin.left}"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="sect1" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- margin-left="{$title.margin.left}"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="sect2" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- margin-left="{$title.margin.left}"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="sect3" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- margin-left="{$title.margin.left}"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="sect4" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- margin-left="{$title.margin.left}"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="sect5" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- margin-left="{$title.margin.left}"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="simplesect" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- margin-left="{$title.margin.left}"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <corpauthor/>
- <authorgroup/>
- <author/>
- <othercredit/>
- <releaseinfo/>
- <copyright/>
- <legalnotice/>
- <pubdate/>
- <revision/>
- <revhistory/>
- <abstract/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="topic" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- font-weight="bold"
- font-size="&hsize3;"
- space-before="1em"
- space-after="1em"
- font-family="{$title.fontset}"/>
- <subtitle
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="bibliography" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="component.title"
- param:node="ancestor-or-self::bibliography[1]"
- margin-left="{$title.margin.left}"
- font-size="&hsize5;"
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="bibliodiv" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title t:named-template="component.title"
- param:node="ancestor-or-self::bibliodiv[1]"
- margin-left="{$title.margin.left}"
- font-size="&hsize4;"
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="glossary" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="component.title"
- param:node="ancestor-or-self::glossary[1]"
- margin-left="{$title.margin.left}"
- font-size="&hsize5;"
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="glossdiv" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title t:named-template="component.title"
- param:node="ancestor-or-self::glossdiv[1]"
- margin-left="{$title.margin.left}"
- font-size="&hsize4;"
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="index" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="component.title"
- param:node="ancestor-or-self::index[1]"
- param:pagewide="1"
- margin-left="0pt"
- font-size="&hsize5;"
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
-<!-- ==================================================================== -->
-
- <!-- The indexdiv.title template is used so that manual and -->
- <!-- automatically generated indexdiv titles get the same -->
- <!-- formatting. -->
-
- <t:titlepage t:element="indexdiv" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title t:force="1"
- t:named-template="indexdiv.title"
- param:title="title"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="setindex" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="component.title"
- param:node="ancestor-or-self::setindex[1]"
- param:pagewide="1"
- margin-left="0pt"
- font-size="&hsize5;"
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="colophon" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="component.title"
- param:node="ancestor-or-self::colophon[1]"
- margin-left="{$title.margin.left}"
- font-size="&hsize5;"
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="sidebar" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- font-family="{$title.fontset}"
- font-weight="bold"/>
- <subtitle
- font-family="{$title.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
-<!-- ==================================================================== -->
-<t:titlepage t:element="qandaset" t:wrapper="fo:block"
- font-family="{$title.fontset}">
-
- <t:titlepage-content t:side="recto"
- start-indent="0pt"
- text-align="center">
-
- <title t:named-template="component.title"
- param:node="ancestor-or-self::qandaset[1]"
- keep-with-next.within-column="always"
- font-size="&hsize5;"
- font-weight="bold"/>
-
- <subtitle/>
-
- <corpauthor space-before="0.5em"
- font-size="&hsize2;"/>
- <authorgroup space-before="0.5em"
- font-size="&hsize2;"/>
- <author space-before="0.5em"
- font-size="&hsize2;"/>
-
- <othercredit space-before="0.5em"/>
- <releaseinfo space-before="0.5em"/>
- <copyright space-before="0.5em"/>
- <legalnotice text-align="start"
- margin-left="0.5in"
- margin-right="0.5in"
- font-family="{$body.fontset}"/>
- <pubdate space-before="0.5em"/>
- <revision space-before="0.5em"/>
- <revhistory space-before="0.5em"/>
- <abstract space-before="0.5em"
- text-align="start"
- margin-left="0.5in"
- margin-right="0.5in"
- font-family="{$body.fontset}"/>
- <itermset/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
- <t:titlepage t:element="table.of.contents" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'TableofContents'"
- space-before.minimum="1em"
- space-before.optimum="1.5em"
- space-before.maximum="2em"
- space-after="0.5em"
- start-indent="0pt"
- font-size="&hsize3;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="list.of.tables" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofTables'"
- space-before.minimum="1em"
- space-before.optimum="1.5em"
- space-before.maximum="2em"
- space-after="0.5em"
- start-indent="0pt"
- font-size="&hsize3;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="list.of.figures" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofFigures'"
- space-before.minimum="1em"
- space-before.optimum="1.5em"
- space-before.maximum="2em"
- space-after="0.5em"
- start-indent="0pt"
- font-size="&hsize3;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="list.of.examples" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofExamples'"
- space-before.minimum="1em"
- space-before.optimum="1.5em"
- space-before.maximum="2em"
- space-after="0.5em"
- start-indent="0pt"
- font-size="&hsize3;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="list.of.equations" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofEquations'"
- space-before.minimum="1em"
- space-before.optimum="1.5em"
- space-before.maximum="2em"
- space-after="0.5em"
- start-indent="0pt"
- font-size="&hsize3;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="list.of.procedures" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofProcedures'"
- space-before.minimum="1em"
- space-before.optimum="1.5em"
- space-before.maximum="2em"
- space-after="0.5em"
- start-indent="0pt"
- font-size="&hsize3;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="list.of.unknowns" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofUnknown'"
- space-before.minimum="1em"
- space-before.optimum="1.5em"
- space-before.maximum="2em"
- space-after="0.5em"
- start-indent="0pt"
- font-size="&hsize3;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="component.list.of.tables" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofTables'"
- space-before.minimum="1em"
- space-before.optimum="1em"
- space-before.maximum="1em"
- space-after="0.5em"
- margin-left="{$title.margin.left}"
- font-size="&hsize1;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="component.list.of.figures" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofFigures'"
- space-before.minimum="1em"
- space-before.optimum="1em"
- space-before.maximum="1em"
- space-after="0.5em"
- margin-left="{$title.margin.left}"
- font-size="&hsize1;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="component.list.of.examples" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofExamples'"
- space-before.minimum="1em"
- space-before.optimum="1em"
- space-before.maximum="1em"
- space-after="0.5em"
- margin-left="{$title.margin.left}"
- font-size="&hsize1;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="component.list.of.equations" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofEquations'"
- space-before.minimum="1em"
- space-before.optimum="1em"
- space-before.maximum="1em"
- space-after="0.5em"
- margin-left="{$title.margin.left}"
- font-size="&hsize1;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="component.list.of.procedures" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofProcedures'"
- space-before.minimum="1em"
- space-before.optimum="1em"
- space-before.maximum="1em"
- space-after="0.5em"
- margin-left="{$title.margin.left}"
- font-size="&hsize1;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
- <t:titlepage t:element="component.list.of.unknowns" t:wrapper="fo:block">
- <t:titlepage-content t:side="recto">
- <title
- t:force="1"
- t:named-template="gentext"
- param:key="'ListofUnknown'"
- space-before.minimum="1em"
- space-before.optimum="1em"
- space-before.maximum="1em"
- space-after="0.5em"
- margin-left="{$title.margin.left}"
- font-size="&hsize1;"
- font-weight="bold"
- font-family="{$title.fontset}"/>
- </t:titlepage-content>
-
- <t:titlepage-content t:side="verso">
- </t:titlepage-content>
-
- <t:titlepage-separator>
- </t:titlepage-separator>
-
- <t:titlepage-before t:side="recto">
- </t:titlepage-before>
-
- <t:titlepage-before t:side="verso">
- </t:titlepage-before>
- </t:titlepage>
-
-<!-- ==================================================================== -->
-
-</t:templates>
--- /dev/null
+[appendix]
+== Updating Device Firmware
+
+ ifdef::telemega[]
+ TeleMega, TeleMetrum v2, EasyMega, EasyMini and TeleDongle v3
+ are all
+ endif::telemega[]
+ ifndef::telemega[]
+ EasyMini is
+ endif::telemega[]
+ programmed directly over their USB connectors (self
+ programming).
+ ifdef::telemega[]
+ TeleMetrum v1, TeleMini and TeleDongle v0.2 are
+ all programmed by using another device as a programmer (pair
+ programming). It's important to recognize which kind of devices
+ you have before trying to reprogram them.
+ endif::telemega[]
+
+ 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
+ http://www.altusmetrum.org/AltOS/
+
+ ifdef::telemega[]
+ === Updating TeleMega, TeleMetrum v2, EasyMega, EasyMini or TeleDongle v3 Firmware
+ endif::telemega[]
+ ifndef::telemega[]
+ === Updating EasyMini Firmware
+ endif::telemega[]
+
+ Self-programmable devices are reprogrammed by
+ connecting them to your computer over USB.
+
+ . Attach a battery if necessary and power switch to
+ the target device. Power up the device.
+
+ . Using a Micro USB cable, connect the target device to your
+ computer's USB socket.
+
+ . Run AltosUI, and select 'Flash Image' from the File menu.
+
+ . Select the target device in the Device Selection dialog.
+
+ . Select the image you want to flash to the device,
+ which should have a name in the form
+ <product>-v<product-version>-<software-version>.ihx,
+ such as EasyMini-v1.0-1.6.0.ihx.
+
+ . 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.
+
+ . Hit the 'OK' button and the software should proceed
+ to flash the device with new firmware, showing a
+ progress bar.
+
+ . Verify that the device is working by using the
+ 'Configure Altimeter' or 'Configure Groundstation'
+ item to check over the configuration.
+
+ ==== Recovering From Self-Flashing Failure
+
+ If the firmware loading fails, it can leave the device
+ unable to boot. Not to worry, you can force the device to
+ start the boot loader instead, which will let you try to
+ flash the device again.
+
+ On each device, connecting two pins from one of the exposed
+ connectors will force the boot loader to start, even if the
+ regular operating system has been corrupted in some way.
+
+ ifdef::telemega[]
+ TeleMega::
+
+ Connect pin 6 and pin 1 of the companion
+ connector. Pin 1 can be identified by the square pad
+ around it, and then the pins could sequentially across
+ the board. Be very careful to *not* short pin 8 to
+ anything as that is connected directly to the
+ battery. Pin 7 carries 3.3V and the board will crash
+ if that is connected to pin 1, but shouldn't damage
+ the board.
+ endif::telemega[]
+
+ ifdef::easymega[]
+ EasyMega::
+
+ Connect pin 6 and pin 1 of the companion
+ connector. Pin 1 can be identified by the square pad
+ around it, and then the pins could sequentially across
+ the board. Be very careful to *not* short pin 8 to
+ anything as that is connected directly to the
+ battery. Pin 7 carries 3.3V and the board will crash
+ if that is connected to pin 1, but shouldn't damage
+ the board.
+ endif::easymega[]
+
+ ifdef::telemetrum[]
+ TeleMetrum v2::
+
+ Connect pin 6 and pin 1 of the companion
+ connector. Pin 1 can be identified by the square pad
+ around it, and then the pins could sequentially across
+ the board. Be very careful to *not* short pin 8 to
+ anything as that is connected directly to the
+ battery. Pin 7 carries 3.3V and the board will crash
+ if that is connected to pin 1, but shouldn't damage
+ the board.
+ endif::telemetrum[]
+
+ ifdef::easymini[]
+ EasyMini::
+
+ Connect pin 6 and pin 1 of the debug connector, which
+ is the six holes next to the beeper. Pin 1 can be
+ identified by the square pad around it, and then the
+ pins could sequentially across the board, making Pin 6
+ the one on the other end of the row.
+ endif::easymini[]
+
+ ifdef::telemetrum[]
+ TeleDongle v3::
+
+ Connect pin 32 on the CPU to ground. Pin 32 is closest
+ to the USB wires on the row of pins towards the center
+ of the board. Ground is available on the capacitor
+ next to it, on the end towards the USB wires.
+ endif::telemetrum[]
+
+ Once you've located the right pins:
+
+ . Turn the altimeter power off.
+
+ . Connect a battery.
+
+ . Connect the indicated terminals together with a
+ short piece of wire. Take care not to accidentally
+ connect anything else.
+
+ . Connect USB
+
+ . Turn the board power on.
+
+ The board should now be visible over USB as
+ 'AltosFlash' and be ready to receive firmware. Once
+ the board has been powered up, you can remove the
+ piece of wire.
+
+ ifdef::telemetrum,telemini[]
+ === Pair Programming
+
+ The big concept to understand is that you have to use
+ a TeleMetrum v1.0, TeleBT v1.0 or TeleDongle v0.2 as a
+ programmer to update a pair programmed device. Due to
+ limited memory resources in the cc1111, we don't
+ support programming directly over USB for these
+ devices.
+
+ If you need to update the firmware on a TeleDongle
+ v0.2, we recommend updating the altimeter first,
+ before updating TeleDongle. However, note that
+ TeleDongle rarely need to be updated. Any firmware
+ version 1.0.1 or later will work, version 1.2.1 may
+ have improved receiver performance slightly.
+
+ ==== Updating TeleMetrum v1.x Firmware
+
+ . 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.
+
+ . Take the 2 screws out of the TeleDongle v0.2
+ or TeleBT v1.0 case to get access to the
+ circuit board.
+
+ . Plug the 8-pin end of the programming cable
+ to the matching connector on the TeleDongle
+ v0.2 or TeleBT v1.0, 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.
+
+ . Attach a battery to the TeleMetrum board.
+
+ . Plug the TeleDongle v0.2 or TeleBT v1.0 into
+ your computer's USB port, and power up the
+ TeleMetrum.
+
+ . Run AltosUI, and select 'Flash Image' from
+ the File menu.
+
+ . Pick the TeleDongle v0.2 or TeleBT v1.0
+ device from the list, identifying it as the
+ programming device.
+
+ . 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.
+
+ . 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.
+
+ . Hit the 'OK' button and the software should
+ proceed to flash the TeleMetrum with new
+ firmware, showing a progress bar.
+
+ . 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.
+
+ If something goes wrong, give it another try.
+
+ ==== Updating TeleMini Firmware
+
+ You'll need a special 'programming cable' to
+ reprogram the TeleMini. You can make your own
+ using an 8-pin MicroMaTch connector on one end
+ and a set of four pins on the other.
+
+ . Take the 2 screws out of the TeleDongle v0.2
+ or TeleBT v1.0 case to get access to the
+ circuit board.
+
+ . Plug the 8-pin end of the programming cable
+ to the matching connector on the TeleDongle
+ v0.2 or TeleBT v1.0, 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.
+
+ . Attach a battery to the TeleMini board.
+
+ . Plug the TeleDongle v0.2 or TeleBT v1.0 into
+ your computer's USB port, and power up the
+ TeleMini
+
+ . Run AltosUI, and select 'Flash Image' from
+ the File menu.
+
+ . Pick the TeleDongle v0.2 or TeleBT v1.0
+ device from the list, identifying it as the
+ programming device.
+
+ . 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.
+
+ . 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.
+
+ . Hit the 'OK' button and the software should
+ proceed to flash the TeleMini with new
+ firmware, showing a progress bar.
+
+ . 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.
+
+ If something goes wrong, give it another try.
+
+ ==== Updating TeleDongle v0.2 Firmware
+
+ Updating TeleDongle v0.2 firmware is just like
+ updating TeleMetrum v1.x or TeleMini firmware, but you
+ use either a TeleMetrum v1.x, TeleDongle v0.2 or
+ TeleBT v1.0 as the programmer.
+
+ . 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.
+
+ . 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 v1.x, TeleDongle v0.2
+ or TeleBT v1.0.
+
+ . Take the 2 screws out of the TeleDongle v0.2 or
+ TeleBT v1.0 case to get access to the circuit board.
+
+ . 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
+ v0.2. 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.
+
+ . Attach a battery to the TeleMetrum v1.x board if
+ you're using one.
+
+ . Plug both the programmer and the TeleDongle into
+ your computer's USB ports, and power up the
+ programmer.
+
+ . Run AltosUI, and select 'Flash Image' from the File
+ menu.
+
+ . Pick the programmer device from the list,
+ identifying it as the programming device.
+
+
+ . Select the image you want put on the TeleDongle
+ v0.2, 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.
+
+ . 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 v0.2 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.
+
+ . Hit the 'OK' button and the software should proceed
+ to flash the TeleDongle v0.2 with new firmware,
+ showing a progress bar.
+
+ . Confirm that the TeleDongle v0.2 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 v0.2.
+
+ If something goes wrong, give it another try.
+
+ 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.
+ endif::telemetrum,telemini[]
--- /dev/null
+== Using Altus Metrum Hardware
+
+ Here are general instructions for hooking up an Altus Metrum
+ flight computer. Instructions specific to each model will be
+ found in the section devoted to that model below.
+
+ === Wiring and Electrical Interference
+
+ To prevent electrical interference from affecting the
+ operation of the flight computer, it's important to always
+ twist pairs of wires connected to the board. Twist the switch
+ leads, the pyro leads and the battery leads. This reduces
+ interference through a mechanism called common mode rejection.
+
+ === Hooking Up Lithium Polymer Batteries
+
+ All Altus Metrum flight computers have a two pin JST PH
+ series connector to connect up a single-cell Lithium Polymer
+ cell (3.7V nominal). You can purchase matching batteries
+ from the Altus Metrum store, or other vendors, or you can
+ make your own. Pin 1 of the connector is positive, pin 2 is
+ negative. Spark Fun sells a cable with the connector
+ attached, which they call a
+ link:https://www.sparkfun.com/products/9914[JST Jumper 2 Wire Assembly]
+
+ [WARNING]
+ Many RC vendors also sell lithium polymer batteries with
+ this same connector. All that we have found use the opposite
+ polarity, and if you use them that way, you will damage or
+ destroy the flight computer.
+
+ === Hooking Up Pyro Charges
+
+ Altus Metrum flight computers always have two screws for
+ each pyro charge. This means you shouldn't need to put two
+ wires into a screw terminal or connect leads from pyro
+ charges together externally.
+
+ On the flight computer, one lead from each charge is hooked
+ to the positive battery terminal through the power switch.
+ The other lead is connected through the pyro circuit, which
+ is connected to the negative battery terminal when the pyro
+ circuit is fired.
+
+ === Hooking Up a Power Switch
+
+ Altus Metrum flight computers need an external power switch
+ to turn them on. This disconnects both the computer and the
+ pyro charges from the battery, preventing the charges from
+ firing when in the Off position. The switch is in-line with
+ the positive battery terminal.
+
+ === Understanding Beeps
+
+ Altus Metrum flight computers include a beeper to
+ provide information about the state of the system.
+ ifdef::telemini[]
+ TeleMini doesn't have room for a beeper, so instead it
+ uses an LED, which works the same, except for every
+ beep is replaced with the flash of the LED.
+ endif::telemini[]
+
+ Here's a short summary of all of the modes and the
+ beeping
+ ifdef::telemini[(or flashing, in the case of TeleMini v1)]
+ that accompanies each mode. In the description of the
+ beeping pattern, “dit” means a short beep while "dah"
+ means a long beep (three times as long). “Brap” means
+ a long dissonant tone.
+
+ .AltOS Modes
+ [options="border",cols="1,1,2,2"]
+ |====
+ |Mode Name
+ |Abbreviation
+ |Beeps
+ |Description
+
+ |Startup
+ |S
+ |battery voltage in decivolts
+ |Calibrating sensors, detecting orientation.
+
+ |Idle
+ |I
+ |dit dit
+ |Ready to accept commands over USB
+ ifdef::radio[or radio link.]
+
+ |Pad
+ |P
+ |dit dah dah dit
+ |Waiting for launch. Not listening for commands.
+
+ |Boost
+ |B
+ |dah dit dit dit
+ |Accelerating upwards.
+
+ |Fast
+ |F
+ |dit dit dah dit
+ |Decelerating, but moving faster than 200m/s.
+
+ |Coast
+ |C
+ |dah dit dah dit
+ |Decelerating, moving slower than 200m/s
+
+ |Drogue
+ |D
+ |dah dit dit
+ |Descending after apogee. Above main height.
+
+ |Main
+ |M
+ |dah dah
+ |Descending. Below main height.
+
+ |Landed
+ |L
+ |dit dah dit dit
+ |Stable altitude for at least ten seconds.
+
+
+ |Sensor error
+ |X
+ |dah dit dit dah
+ |Error detected during sensor calibration.
+ |====
+
+ Here's a summary of all of the Pad and Idle mode
+ indications. In Idle mode, you'll hear one of these
+ just once after the two short dits indicating idle
+ mode. In Pad mode, after the dit dah dah dit
+ indicating Pad mode, you'll hear these once every five
+ seconds.
+
+ .Pad/Idle Indications
+ [options="header",cols="1,1,3"]
+ |====
+ |Name |Beeps |Description
+
+ |Neither
+ |brap
+ |No continuity detected on either apogee or main igniters.
+
+ |Apogee
+ |dit
+ |Continuity detected only on apogee igniter.
+
+ |Main
+ |dit dit
+ |Continuity detected only on main igniter.
+
+
+ |Both
+ |dit dit dit
+ |Continuity detected on both igniters.
+
+
+ |Storage Full
+ |warble
+ |On-board data logging storage is full. This will
+ not prevent the flight computer from safely
+ controlling the flight or transmitting telemetry
+ signals, but no record of the flight will be
+ stored in on-board flash.
+ |====
+
+ ifdef::radio[]
+ For devices with a radio transmitter, in addition to
+ the digital and APRS telemetry signals, you can also
+ receive audio tones with a standard amateur
+ 70cm FM receiver. While on the pad, you will hear
+ igniter status once every five seconds.
+
+ .Pad Radio Indications
+ [options="header",cols="1,1,3"]
+ |====
+ |Name |Beeps |Description
+
+ |Neither
+ |½ second tone
+ |No continuity detected on either apogee or main igniters.
+
+ |Apogee
+ |dit
+ |Continuity detected only on apogee igniter.
+
+ |Main
+ |dit dit
+ |Continuity detected only on main igniter.
+
+
+ |Both
+ |dit dit dit
+ |Continuity detected on both igniters.
+
+ |====
+
+ During ascent, the tones will be muted to allow the
+ telemetry data to consume the full radio bandwidth.
+
+ During descent and after landing, a ½ second tone will
+ be transmitted every five seconds. This can be used to
+ find the rocket using RDF techniques when the signal
+ is too weak to receive GPS information via telemetry
+ or APRS.
+ endif::radio[]
+
+ === Turning On the Power
+
+ Connect a battery and power switch and turn the switch
+ to "on". The flight computer will signal power on by
+ reporting the battery voltage and then perform an internal self
+ test and sensor calibration.
+
+ Once the self test and calibration are complete, there
+ are two modes that an Altus Metrum flight computer can
+ operate in:
+
+ Flight/Pad::
+ The flight computer is waiting to detect
+ launch and then fly the rocket. In this mode, the USB
+ link is
+ ifdef::radio[disabled, and the radio goes into transmit-only mode.]
+ ifndef::radio[disabled.]
+ The only way to get out of this
+ mode is to power the flight computer down.
+
+ Idle::
+ The flight computer is ready to communicate over USB
+ ifdef::radio[and in packet mode over the radio.]
+ You can configure
+ the flight computer, download data or display
+ the current state.
+
+ ifdef::telemetrum,easymega,telemega[]
+ For flight computers with accelerometers (TeleMetrum,
+ EasyMega and TeleMega), the mode is selected by the
+ orientation of the board during the self test
+ interval. If the board is pointing upwards as if ready
+ to fly, it will enter Flight/Pad mode. Otherwise, it will
+ enter Idle mode.
+ endif::telemetrum,easymega,telemega[]
+
+ ifdef::easymini[]
+ For EasyMini, if the USB cable is connected to a
+ computer, it will enter Idle mode. Otherwise, it will
+ enter Flight/Pad mode.
+ endif::easymini[]
+
+ ifdef::telemini[]
+ For TeleMini v1.0, if a packet link is waiting to
+ connect when the device is powered on, it will enter
+ Idle mode, otherwise it will enter Flight/Pad mode.
+ endif::telemini[]
+
+ You can see in <<_understanding_beeps>>
+ how to tell which mode the flight computer is in.
+
+ === Using an External Active Switch Circuit
+
+ You can use an active switch circuit, such as the
+ Featherweight Magnetic Switch, with any Altus Metrum
+ flight computer. These require three connections, one to
+ the battery, one to the positive power input on the flight
+ computer and one to ground. Find instructions on how to
+ hook these up for each flight computer below. Then follow
+ the instructions that come with your active switch to
+ connect it up.
+
+ === Using a Separate Pyro Battery
+
+ As mentioned above in <<_hooking_up_pyro_charges>>, one
+ lead for each of the pyro charges is connected through
+ the power switch directly to the positive battery
+ terminal. The other lead is connected to the pyro
+ circuit, which connects it to the negative battery
+ terminal when the pyro circuit is fired. The pyro
+ circuit on all of the flight computers is designed to
+ handle up to 16V.
+
+ To use a separate pyro battery, connect the negative pyro
+ battery terminal to the flight computer ground terminal,
+ the positive battery terminal to the igniter and the other
+ igniter lead to the negative pyro terminal on the flight
+ computer. When the pyro channel fires, it will complete the
+ circuit between the negative pyro terminal and the ground
+ terminal, firing the igniter. Specific instructions on how
+ to hook this up for each flight computer will be found
+ in the section below for that flight computer.
+
+ === Using a Different Kind of Battery
+
+ EasyMini
+ ifdef::telemini[and TeleMini v2 are]
+ ifndef::telemini[is]
+ designed to use either a
+ lithium polymer battery or any other battery producing
+ between 4 and 12 volts, such as a rectangular 9V
+ battery.
+
+ ifdef::telemega,easymega,telemetrum[]
+ [WARNING]
+ TeleMega, EasyMega and TeleMetrum are only designed to
+ operate off a single-cell Lithium Polymer battery and
+ cannot be used with any other kind. Connecting a
+ different kind of battery to any of these will destroy
+ the board.
+ endif::telemega,easymega,telemetrum[]
--- /dev/null
+== Using Altus Metrum Products
+
+ ifdef::radio[]
+ === Being Legal
+
+ In the US, you need an
+ link:http://www.altusmetrum.org/Radio/[amateur radio license]
+ or other authorization to legally operate the radio
+ transmitters that are part of our products.
+ endif::radio[]
+
+
+ === In the Rocket
+
+ In the rocket itself, you just need a flight computer
+ and a single-cell, 3.7 volt nominal Li-Po rechargeable
+ battery.
+ ifdef::telemetrum,telemega,easymega[]
+ An 850mAh battery weighs less than a 9V
+ alkaline battery, and will run a TeleMetrum, TeleMega
+ or EasyMega for hours.
+ endif::telemetrum,telemega,easymega[]
+ A 110mAh battery weighs less
+ than a triple A battery and is a good choice for use
+ with
+ ifdef::telemini[TeleMini or]
+ EasyMini.
+
+ ifdef::radio[]
+ By default, we ship TeleMini, TeleMetrum and TeleMega
+ flight computers 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 prefer to install an SMA connector so that you
+ can run a coaxial cable to an antenna mounted
+ elsewhere in the rocket. However, note that the GPS
+ antenna is fixed on all current products, so you
+ really want to install the flight computer in a bay
+ made of RF-transparent materials if at all possible.
+ endif::radio[]
+
+ === On the Ground
+
+ ifdef::radio[]
+ To receive the data stream from the rocket, you need
+ an antenna and short feed-line connected to one of our
+ link:http://www.altusmetrum.org/TeleDongle/[TeleDongle]
+ units. If possible, use an SMA to BNC adapter instead
+ of feedline between the antenna feedpoint and
+ TeleDongle, as this will give you the best
+ performance. 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.
+ endif::radio[]
+
+ 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.
+
+ ifdef::radio[]
+ Alternatively, a TeleBT attached with an SMA to BNC
+ adapter at the feed point of a hand-held yagi used in
+ conjunction with an Android device running AltosDroid
+ makes an outstanding ground station.
+ endif::radio[]
+
+ After the flight,
+ ifdef::radio[]
+ you can use the radio link to
+ extract the more detailed data logged in either
+ TeleMetrum or TeleMini devices, or
+ endif::radio[]
+ you can use a
+ USB cable to plug into the flight computer board directly.
+ 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.
+
+ ifdef::gps[]
+ If your 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. AltosDroid on an
+ Android device with GPS receiver works great for this,
+ too!
+ endif::gps[]
+
+ ifdef::radio[]
+ 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 currently uses a Yaesu
+ FT1D, Bdale has a Yaesu VX-7R, which is a nicer radio
+ in most ways but doesn't support APRS.
+
+ So, to recap, on the ground the hardware you'll need includes:
+
+ . an antenna and feed-line or adapter
+ . a TeleDongle
+ . a notebook computer
+ . optionally, a hand-held GPS receiver
+ . optionally, an HT or receiver covering 435 MHz
+
+ The best hand-held commercial directional antennas we've found for radio
+ direction finding rockets are from
+ link:http://www.arrowantennas.com/[Arrow Antennas].
+
+ 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. TeleDongle and an SMA to BNC
+ adapter fit perfectly between the driven element and
+ reflector of Arrow antennas.
+ endif::radio[]
+
+ === Data Analysis
+
+ 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 flight log in a format usable with Google
+ Maps and Google Earth for visualizing the flight path
+ in two or three dimensions!
+
+ 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.
+
+ === Future Plans
+
+ ifdef::telemetrum,telemega,easymega[]
+ We have designed and prototyped several “companion
+ boards” that can attach to the companion connector on
+ TeleMetrum, TeleMega and EasyMega flight computers to
+ collect more data, provide more pyro channels, and so
+ forth. We do not yet know if or when any of these
+ boards will be produced in enough quantity to sell.
+ If you have specific interests for data collection or
+ control of events in your rockets beyond the
+ capabilities of our existing productions, please let
+ us know!
+ endif::telemetrum,telemega,easymega[]
+
+ 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...
+
+ Watch our link:http://altusmetrum.org/[web site] for
+ more news and information as our family of products
+ evolves!
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
- X.Org DocBook/XML customization
-
- DocBook XSL Stylesheets FO Parameters
- http://docbook.sourceforge.net/release/xsl/current/doc/fo/
--->
-
-<xsl:stylesheet
- version='1.0'
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- >
-<xsl:import href="file:///usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl"/>
-<xsl:include href="titlepage.templates.xsl"/>
-
-
- <!-- Reference Pages HTML/FO Parameters -->
-
-
- <xsl:param name="function.parens" select="1"/>
-
- <!-- ANSI-style function synopses are generated for a funcsynopsis element -->
- <xsl:param name="funcsynopsis.style" select="ansi"/>
-
- <!-- Linking HTML/FO Parameters -->
-
- <!-- open new PDF documents in new tab, don't replace doc in current window -->
- <xsl:attribute-set name="olink.properties">
- <xsl:attribute name="show-destination">new</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Miscellaneous HTML/FO Parameters-->
-
- <!-- SVG will be considered an acceptable image format -->
- <xsl:param name="use.svg" select="1"/>
-
- <!-- ToC/LoT/Index Generation -->
- <!-- put page breaks before and after the Table of Contents,
- so that the ToC is on a page by itself
- Reference: http://www.sagehill.net/docbookxsl/PrintToc.html
- -->
- <xsl:attribute-set name="toc.margin.properties">
- <xsl:attribute name="break-before">page</xsl:attribute>
- <xsl:attribute name="break-after">page</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Pagination and General Styles FO Parameters -->
- <!--
- Speed up ps & pdf creation by not creating pages with "draft" image,
- thus not needing to wait for http fetch of draft.png from docbook website.
- -->
- <xsl:param name="draft.mode" select="no"/>
-
- <!-- Processor Extensions FO Parameters-->
-
- <!-- PDF bookmarks extensions for FOP version 0.90 and later will be used. -->
- <xsl:param name="fop.extensions" select="0"></xsl:param>
- <xsl:param name="fop1.extensions" select="1"></xsl:param>
-
- <!-- Cross Refrences FO Parameters-->
-
- <!-- Make links in pdf output blue so it's easier to tell they're internal
- links
- -->
- <xsl:attribute-set name="xref.properties">
- <xsl:attribute name="color">blue</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Make links in pdf output green so it's easier to tell they're external
- links
- -->
- <xsl:attribute-set name="olink.properties">
- <xsl:attribute name="color">green</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Linking to a target inside a pdf document.
- This feature is only available as of docbook-xsl-1.76.1.
- When set to zero, the link will point to the document -->
- <xsl:param name="insert.olink.pdf.frag" select="0"></xsl:param>
-
-
- <!-- Font Families FO Parameters -->
-
- <!--
- Since a number of documents, especially the credits section in the
- ReleaseNotes, use characters not found in the fop default base-14
- PostScript fonts, set the fonts for the fop generated documents to
- use the free DejaVu and GNU Unifont fonts which cover a much wider
- range of characters.
-
- DejaVu is available from http://dejavu-fonts.org/
- GNU Unifont is available from http://unifoundry.com/unifont.html
-
- To set fop font paths to find them after installing, see
- http://xmlgraphics.apache.org/fop/1.0/fonts.html#basics
- -->
- <xsl:param name="body.font.family">DejaVu Serif</xsl:param>
- <xsl:param name="symbol.font.family">serif,Symbol,AR PL UMing CN,AR PL ShanHeiSun Uni,GNU Unifont</xsl:param>
-
- <!-- Paragraph template bits -->
-
- <!-- make it possible to turn off hyphenation when it's giving us probs -->
- <xsl:template match="para[@hyphenate='false']">
- <fo:block hyphenate="false" xsl:use-attribute-sets="normal.para.spacing">
- <xsl:call-template name="anchor"/>
- <xsl:apply-templates/>
- </fo:block>
- </xsl:template>
-
- <!-- force line break -->
- <xsl:template match="processing-instruction('linebreak')">
- <fo:block/>
- </xsl:template>
-
- <xsl:attribute-set name="informalfigure.properties">
- <xsl:attribute name="text-align">center</xsl:attribute>
- </xsl:attribute-set>
-
-</xsl:stylesheet>
import java.lang.*;
import java.io.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
class MicroIterator implements Iterator<MicroDataPoint> {
int i;
package org.altusmetrum.micropeak;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroDataPoint implements AltosUIDataPoint {
public double time;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroDeviceDialog extends AltosDeviceDialog {
import java.io.*;
import java.util.concurrent.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroDownload extends AltosUIDialog implements Runnable, ActionListener, MicroSerialLog, WindowListener {
MicroPeak owner;
import java.awt.*;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroExport extends JFileChooser {
import java.io.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroFile {
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroFileChooser extends JFileChooser {
JFrame frame;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroFrame extends AltosUIFrame {
static String[] micro_icon_names = {
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
import java.io.*;
import java.util.concurrent.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroPeak extends MicroFrame implements ActionListener, ItemListener {
import java.awt.*;
import java.io.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroRaw extends JTextArea {
import java.io.*;
import java.util.concurrent.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroSave extends JFileChooser {
import java.util.*;
import java.io.*;
import libaltosJNI.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroSerial extends InputStream {
SWIGTYPE_p_altos_file file;
import java.util.*;
import java.io.*;
import libaltosJNI.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altosuilib_9.*;
public interface MicroSerialLog {
package org.altusmetrum.micropeak;
import java.io.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroStats {
double coast_height;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroStatsTable extends JComponent implements AltosFontListener {
GridBagLayout layout;
import java.util.*;
import libaltosJNI.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class MicroUSB extends altos_device implements AltosDevice {
-Subproject commit 8b1c9061fa3a8f1b30ee13b373afe5cc1ad9d382
+Subproject commit bd33f6640cf5882f8630766a9acdd1bc420a9dda
easymega-v1.0 easymega-v1.0/flash-loader \
telemega-v0.1 telemega-v0.1/flash-loader \
telemega-v1.0 telemega-v1.0/flash-loader \
+ telemega-v2.0 telemega-v2.0/flash-loader \
telemetrum-v2.0 telemetrum-v2.0/flash-loader \
megadongle-v0.1 megadongle-v0.1/flash-loader \
telegps-v0.3 telegps-v0.3/flash-loader \
#define ao_spi_fast(b)
#endif
+#if !HAS_COMPANION
+#error HAS_COMPANION not set in ao_companion.c
+#endif
+
#define COMPANION_SELECT() do { \
ao_spi_get_bit(AO_COMPANION_CS_PORT, \
AO_COMPANION_CS_PIN, \
#define AO_LCO_BOX_DIGIT_1 1
#define AO_LCO_BOX_DIGIT_10 2
+#define AO_LCO_DRAG_RACE_START_TIME AO_SEC_TO_TICKS(5)
+#define AO_LCO_DRAG_RACE_STOP_TIME AO_SEC_TO_TICKS(2)
+
+#define AO_LCO_VALID_LAST 1
+#define AO_LCO_VALID_EVER 2
+
static uint8_t ao_lco_min_box, ao_lco_max_box;
-static uint8_t ao_lco_pad;
-static uint8_t ao_lco_box;
+static uint8_t ao_lco_selected[AO_PAD_MAX_BOXES];
+static uint8_t ao_lco_valid[AO_PAD_MAX_BOXES];
+static uint8_t ao_lco_channels[AO_PAD_MAX_BOXES];
+static uint16_t ao_lco_tick_offset[AO_PAD_MAX_BOXES];
+
+/* UI values */
static uint8_t ao_lco_armed;
static uint8_t ao_lco_firing;
-static uint8_t ao_lco_valid;
-static uint8_t ao_lco_got_channels;
-static uint16_t ao_lco_tick_offset;
+static uint16_t ao_lco_fire_tick;
+static uint8_t ao_lco_fire_down;
+static uint8_t ao_lco_drag_race;
+static uint8_t ao_lco_pad;
+static int16_t ao_lco_box;
+
+#define AO_LCO_BOX_DRAG 0x1000
static struct ao_pad_query ao_pad_query;
+static uint8_t ao_lco_display_mutex;
+
static void
ao_lco_set_pad(uint8_t pad)
{
- ao_seven_segment_set(AO_LCO_PAD_DIGIT, pad);
+ ao_mutex_get(&ao_lco_display_mutex);
+ ao_seven_segment_set(AO_LCO_PAD_DIGIT, pad | (ao_lco_drag_race << 4));
+ ao_mutex_put(&ao_lco_display_mutex);
}
+#define SEVEN_SEGMENT_d ((0 << 0) | \
+ (0 << 1) | \
+ (1 << 2) | \
+ (1 << 3) | \
+ (1 << 4) | \
+ (1 << 5) | \
+ (1 << 6))
+
+
+#define SEVEN_SEGMENT_r ((0 << 0) | \
+ (0 << 1) | \
+ (0 << 2) | \
+ (1 << 3) | \
+ (1 << 4) | \
+ (0 << 5) | \
+ (0 << 6))
+
static void
-ao_lco_set_box(uint8_t box)
+ao_lco_set_box(uint16_t box)
{
- ao_seven_segment_set(AO_LCO_BOX_DIGIT_1, box % 10);
- ao_seven_segment_set(AO_LCO_BOX_DIGIT_10, box / 10);
+ ao_mutex_get(&ao_lco_display_mutex);
+ if (box == AO_LCO_BOX_DRAG) {
+ ao_seven_segment_direct(AO_LCO_BOX_DIGIT_10, SEVEN_SEGMENT_d | (ao_lco_drag_race << 7));
+ ao_seven_segment_direct(AO_LCO_BOX_DIGIT_1, SEVEN_SEGMENT_r | (ao_lco_drag_race << 7));
+ } else {
+ ao_seven_segment_set(AO_LCO_BOX_DIGIT_1, box % 10 | (ao_lco_drag_race << 4));
+ ao_seven_segment_set(AO_LCO_BOX_DIGIT_10, box / 10 | (ao_lco_drag_race << 4));
+ }
+ ao_mutex_put(&ao_lco_display_mutex);
}
static void
tenths = decivolts % 10;
ones = (decivolts / 10) % 10;
tens = (decivolts / 100) % 10;
+ ao_mutex_get(&ao_lco_display_mutex);
ao_seven_segment_set(AO_LCO_PAD_DIGIT, tenths);
ao_seven_segment_set(AO_LCO_BOX_DIGIT_1, ones | 0x10);
ao_seven_segment_set(AO_LCO_BOX_DIGIT_10, tens);
+ ao_mutex_put(&ao_lco_display_mutex);
}
static void
ao_lco_set_display(void)
{
- if (ao_lco_pad == 0) {
+ if (ao_lco_pad == 0 && ao_lco_box != AO_LCO_BOX_DRAG) {
ao_lco_set_voltage(ao_pad_query.battery);
} else {
- ao_lco_set_pad(ao_lco_pad);
+ if (ao_lco_box == AO_LCO_BOX_DRAG)
+ ao_lco_set_pad(ao_lco_drag_race);
+ else
+ ao_lco_set_pad(ao_lco_pad);
ao_lco_set_box(ao_lco_box);
}
}
static uint8_t ao_lco_box_mask[MASK_SIZE(AO_PAD_MAX_BOXES)];
static uint8_t
-ao_lco_box_present(uint8_t box)
+ao_lco_box_present(uint16_t box)
{
+ if (box == AO_LCO_BOX_DRAG)
+ return 1;
+
if (box >= AO_PAD_MAX_BOXES)
return 0;
return (ao_lco_box_mask[MASK_ID(box)] >> MASK_SHIFT(box)) & 1;
}
static uint8_t
-ao_lco_pad_present(uint8_t pad)
+ao_lco_pad_present(uint8_t box, uint8_t pad)
{
- if (!ao_lco_got_channels || !ao_pad_query.channels)
- return pad == 0;
/* voltage measurement is always valid */
if (pad == 0)
return 1;
+ if (!ao_lco_channels[box])
+ return 0;
if (pad > AO_PAD_MAX_CHANNELS)
return 0;
- return (ao_pad_query.channels >> (pad - 1)) & 1;
+ return (ao_lco_channels[box] >> (pad - 1)) & 1;
}
static uint8_t
-ao_lco_pad_first(void)
+ao_lco_pad_first(uint8_t box)
{
uint8_t pad;
for (pad = 1; pad <= AO_PAD_MAX_CHANNELS; pad++)
- if (ao_lco_pad_present(pad))
+ if (ao_lco_pad_present(box, pad))
return pad;
return 0;
}
+static struct ao_task ao_lco_drag_task;
+static uint8_t ao_lco_drag_active;
+static uint8_t ao_lco_drag_beep_count;
+static uint8_t ao_lco_drag_beep_on;
+static uint16_t ao_lco_drag_beep_time;
+static uint16_t ao_lco_drag_warn_time;
+
+#define AO_LCO_DRAG_BEEP_TIME AO_MS_TO_TICKS(50)
+#define AO_LCO_DRAG_WARN_TIME AO_SEC_TO_TICKS(5)
+
+static void
+ao_lco_drag_beep_start(void)
+{
+ ao_beep(AO_BEEP_HIGH);
+ PRINTD("beep start\n");
+ ao_lco_drag_beep_on = 1;
+ ao_lco_drag_beep_time = ao_time() + AO_LCO_DRAG_BEEP_TIME;
+}
+
+static void
+ao_lco_drag_beep_stop(void)
+{
+ ao_beep(0);
+ PRINTD("beep stop\n");
+ ao_lco_drag_beep_on = 0;
+ if (ao_lco_drag_beep_count) {
+ --ao_lco_drag_beep_count;
+ if (ao_lco_drag_beep_count)
+ ao_lco_drag_beep_time = ao_time() + AO_LCO_DRAG_BEEP_TIME;
+ }
+}
+
+static void
+ao_lco_drag_beep(uint8_t beeps)
+{
+ PRINTD("beep %d\n", beeps);
+ if (!ao_lco_drag_beep_count)
+ ao_lco_drag_beep_start();
+ ao_lco_drag_beep_count += beeps;
+}
+
+static uint16_t
+ao_lco_drag_beep_check(uint16_t now, uint16_t delay)
+{
+ PRINTD("beep check count %d delta %d\n",
+ ao_lco_drag_beep_count,
+ (int16_t) (now - ao_lco_drag_beep_time));
+ if (ao_lco_drag_beep_count) {
+ if ((int16_t) (now - ao_lco_drag_beep_time) >= 0) {
+ if (ao_lco_drag_beep_on)
+ ao_lco_drag_beep_stop();
+ else
+ ao_lco_drag_beep_start();
+ }
+ }
+
+ if (ao_lco_drag_beep_count) {
+ if (delay > AO_LCO_DRAG_BEEP_TIME)
+ delay = AO_LCO_DRAG_BEEP_TIME;
+ }
+ return delay;
+}
+
+static void
+ao_lco_drag_enable(void)
+{
+ PRINTD("Drag enable\n");
+ ao_lco_drag_race = 1;
+ memset(ao_lco_selected, 0, sizeof (ao_lco_selected));
+ ao_lco_drag_beep(5);
+ ao_lco_set_display();
+ ao_lco_fire_down = 0;
+}
+
+static void
+ao_lco_drag_disable(void)
+{
+ PRINTD("Drag disable\n");
+ ao_lco_drag_race = 0;
+ memset(ao_lco_selected, 0, sizeof (ao_lco_selected));
+ ao_lco_drag_beep(2);
+ ao_lco_set_display();
+ ao_lco_fire_down = 0;
+}
+
+static uint16_t
+ao_lco_drag_button_check(uint16_t now, uint16_t delay)
+{
+ uint16_t button_delay = ~0;
+
+ /*
+ * Check to see if the button has been held down long enough
+ * to switch in/out of drag race mode
+ */
+ if (ao_lco_fire_down) {
+ if (ao_lco_drag_race) {
+ if ((int16_t) (now - ao_lco_fire_tick) >= AO_LCO_DRAG_RACE_STOP_TIME)
+ ao_lco_drag_disable();
+ else
+ button_delay = ao_lco_fire_tick + AO_LCO_DRAG_RACE_STOP_TIME - now;
+ } else {
+ if ((int16_t) (now - ao_lco_fire_tick) >= AO_LCO_DRAG_RACE_START_TIME)
+ ao_lco_drag_enable();
+ else
+ button_delay = ao_lco_fire_tick + AO_LCO_DRAG_RACE_START_TIME - now;
+ }
+ if (delay > button_delay)
+ delay = button_delay;
+ }
+ return delay;
+}
+
+static uint16_t
+ao_lco_drag_warn_check(uint16_t now, uint16_t delay)
+{
+ uint16_t warn_delay = ~0;
+
+ if (ao_lco_drag_race) {
+ if ((int16_t) (now - ao_lco_drag_warn_time) >= 0) {
+ ao_lco_drag_beep(1);
+ ao_lco_drag_warn_time = now + AO_LCO_DRAG_WARN_TIME;
+ }
+ warn_delay = ao_lco_drag_warn_time - now;
+ }
+ if (delay > warn_delay)
+ delay = warn_delay;
+ return delay;
+}
+
+static void
+ao_lco_drag_monitor(void)
+{
+ uint16_t delay = ~0;
+ uint16_t now;
+
+ for (;;) {
+ PRINTD("Drag monitor active %d delay %d\n", ao_lco_drag_active, delay);
+ if (delay == (uint16_t) ~0)
+ ao_sleep(&ao_lco_drag_active);
+ else
+ ao_sleep_for(&ao_lco_drag_active, delay);
+
+ delay = ~0;
+ if (!ao_lco_drag_active)
+ continue;
+
+ now = ao_time();
+ delay = ao_lco_drag_button_check(now, delay);
+ delay = ao_lco_drag_warn_check(now, delay);
+ delay = ao_lco_drag_beep_check(now, delay);
+
+ /* check to see if there's anything left to do here */
+ if (!ao_lco_fire_down && !ao_lco_drag_race && !ao_lco_drag_beep_count) {
+ delay = ~0;
+ ao_lco_drag_active = 0;
+ }
+ }
+}
+
static void
ao_lco_input(void)
{
static struct ao_event event;
- int8_t dir, new_box, new_pad;
+ int8_t dir, new_pad;
+ int16_t new_box;
ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(200));
for (;;) {
new_pad = AO_PAD_MAX_CHANNELS;
if (new_pad == ao_lco_pad)
break;
- } while (!ao_lco_pad_present(new_pad));
+ } while (!ao_lco_pad_present(ao_lco_box, new_pad));
if (new_pad != ao_lco_pad) {
ao_lco_pad = new_pad;
ao_lco_set_display();
dir = (int8_t) event.value;
new_box = ao_lco_box;
do {
- new_box += dir;
- if (new_box > ao_lco_max_box)
- new_box = ao_lco_min_box;
- else if (new_box < ao_lco_min_box)
- new_box = ao_lco_max_box;
+ if (new_box == AO_LCO_BOX_DRAG) {
+ if (dir < 0)
+ new_box = ao_lco_max_box;
+ else
+ new_box = ao_lco_min_box;
+ } else {
+ new_box += dir;
+ if (new_box > ao_lco_max_box)
+ new_box = AO_LCO_BOX_DRAG;
+ else if (new_box < ao_lco_min_box)
+ new_box = AO_LCO_BOX_DRAG;
+ }
if (new_box == ao_lco_box)
break;
} while (!ao_lco_box_present(new_box));
if (ao_lco_box != new_box) {
ao_lco_box = new_box;
ao_lco_pad = 1;
- ao_lco_got_channels = 0;
+ if (ao_lco_box != AO_LCO_BOX_DRAG)
+ ao_lco_channels[ao_lco_box] = 0;
ao_lco_set_display();
}
}
case AO_BUTTON_ARM:
ao_lco_armed = event.value;
PRINTD("Armed %d\n", ao_lco_armed);
+ if (ao_lco_armed) {
+ if (ao_lco_drag_race) {
+ uint8_t box;
+
+ for (box = ao_lco_min_box; box <= ao_lco_max_box; box++) {
+ if (ao_lco_selected[box]) {
+ ao_wakeup(&ao_lco_armed);
+ break;
+ }
+ }
+ } else {
+ memset(ao_lco_selected, 0, sizeof (ao_lco_selected));
+ if (ao_lco_pad != 0 && ao_lco_box != AO_LCO_BOX_DRAG)
+ ao_lco_selected[ao_lco_box] = (1 << (ao_lco_pad - 1));
+ else
+ ao_lco_armed = 0;
+ }
+ }
ao_wakeup(&ao_lco_armed);
break;
case AO_BUTTON_FIRE:
if (ao_lco_armed) {
+ ao_lco_fire_down = 0;
ao_lco_firing = event.value;
PRINTD("Firing %d\n", ao_lco_firing);
ao_wakeup(&ao_lco_armed);
+ } else {
+ if (event.value) {
+ if (ao_lco_box == AO_LCO_BOX_DRAG) {
+ ao_lco_fire_down = 1;
+ ao_lco_fire_tick = ao_time();
+ ao_lco_drag_active = 1;
+ }
+ if (ao_lco_drag_race) {
+ if (ao_lco_pad != 0 && ao_lco_box != AO_LCO_BOX_DRAG) {
+ ao_lco_selected[ao_lco_box] ^= (1 << (ao_lco_pad - 1));
+ PRINTD("Toggle box %d pad %d (pads now %x) to drag race\n",
+ ao_lco_pad, ao_lco_box, ao_lco_selected[ao_lco_box]);
+ ao_lco_drag_beep(ao_lco_pad);
+ }
+ }
+ ao_wakeup(&ao_lco_drag_active);
+ } else {
+ ao_lco_fire_down = 0;
+ if (ao_lco_drag_active)
+ ao_wakeup(&ao_lco_drag_active);
+ }
}
break;
}
#endif
};
-static void
-ao_lco_update(void)
+static uint8_t
+ao_lco_get_channels(uint8_t box, struct ao_pad_query *query)
{
int8_t r;
- uint8_t c;
- r = ao_lco_query(ao_lco_box, &ao_pad_query, &ao_lco_tick_offset);
+ r = ao_lco_query(box, query, &ao_lco_tick_offset[box]);
if (r == AO_RADIO_CMAC_OK) {
- c = ao_lco_got_channels;
- ao_lco_got_channels = 1;
- ao_lco_valid = 1;
- if (!c) {
- if (ao_lco_pad != 0)
- ao_lco_pad = ao_lco_pad_first();
- ao_lco_set_display();
- }
- if (ao_lco_pad == 0)
- ao_lco_set_display();
+ ao_lco_channels[box] = query->channels;
+ ao_lco_valid[box] = AO_LCO_VALID_LAST | AO_LCO_VALID_EVER;
} else
- ao_lco_valid = 0;
-
-#if 0
- PRINTD("lco_query success arm_status %d i0 %d i1 %d i2 %d i3 %d\n",
- query.arm_status,
- query.igniter_status[0],
- query.igniter_status[1],
- query.igniter_status[2],
- query.igniter_status[3]);
-#endif
- PRINTD("ao_lco_update valid %d\n", ao_lco_valid);
+ ao_lco_valid[box] &= ~AO_LCO_VALID_LAST;
+ PRINTD("ao_lco_get_channels(%d) rssi %d valid %d ret %d offset %d\n", box, ao_radio_cmac_rssi, ao_lco_valid[box], r, ao_lco_tick_offset[box]);
ao_wakeup(&ao_pad_query);
+ return ao_lco_valid[box];
+}
+
+static void
+ao_lco_update(void)
+{
+ if (ao_lco_box != AO_LCO_BOX_DRAG) {
+ uint8_t previous_valid = ao_lco_valid[ao_lco_box];
+
+ if (ao_lco_get_channels(ao_lco_box, &ao_pad_query) & AO_LCO_VALID_LAST) {
+ if (!(previous_valid & AO_LCO_VALID_EVER)) {
+ if (ao_lco_pad != 0)
+ ao_lco_pad = ao_lco_pad_first(ao_lco_box);
+ ao_lco_set_display();
+ }
+ if (ao_lco_pad == 0)
+ ao_lco_set_display();
+ }
+ }
}
static void
static void
ao_lco_search(void)
{
- uint16_t tick_offset;
int8_t r;
int8_t try;
uint8_t box;
if ((box % 10) == 0)
ao_lco_set_box(box);
for (try = 0; try < 3; try++) {
- tick_offset = 0;
- r = ao_lco_query(box, &ao_pad_query, &tick_offset);
- PRINTD("box %d result %d\n", box, r);
+ ao_lco_tick_offset[box] = 0;
+ r = ao_lco_query(box, &ao_pad_query, &ao_lco_tick_offset[box]);
+ PRINTD("box %d result %d offset %d\n", box, r, ao_lco_tick_offset[box]);
if (r == AO_RADIO_CMAC_OK) {
++boxes;
ao_lco_box_set_present(box);
ao_lco_box = ao_lco_min_box;
else
ao_lco_min_box = ao_lco_max_box = ao_lco_box = 0;
- ao_lco_valid = 0;
- ao_lco_got_channels = 0;
+ memset(ao_lco_valid, 0, sizeof (ao_lco_valid));
+ memset(ao_lco_channels, 0, sizeof (ao_lco_channels));
ao_lco_pad = 1;
ao_lco_set_display();
}
ao_lco_igniter_status(void)
{
uint8_t c;
+ uint8_t t = 0;
for (;;) {
ao_sleep(&ao_pad_query);
- PRINTD("RSSI %d VALID %d\n", ao_radio_cmac_rssi, ao_lco_valid);
- if (!ao_lco_valid) {
- ao_led_on(AO_LED_RED);
- ao_led_off(AO_LED_GREEN|AO_LED_AMBER);
- continue;
- }
- if (ao_radio_cmac_rssi < -90) {
- ao_led_on(AO_LED_AMBER);
- ao_led_off(AO_LED_RED|AO_LED_GREEN);
+ PRINTD("RSSI %d VALID %d\n", ao_radio_cmac_rssi, ao_lco_box == AO_LCO_BOX_DRAG ? -1 : ao_lco_valid[ao_lco_box]);
+ if (ao_lco_box == AO_LCO_BOX_DRAG) {
+ ao_led_off(AO_LED_RED|AO_LED_GREEN|AO_LED_AMBER);
+ for (c = 0; c < AO_LED_CONTINUITY_NUM; c++)
+ ao_led_off(continuity_led[c]);
} else {
- ao_led_on(AO_LED_GREEN);
- ao_led_off(AO_LED_RED|AO_LED_AMBER);
- }
- if (ao_pad_query.arm_status)
- ao_led_on(AO_LED_REMOTE_ARM);
- else
- ao_led_off(AO_LED_REMOTE_ARM);
- for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) {
- uint8_t status;
-
- if (ao_pad_query.channels & (1 << c))
- status = ao_pad_query.igniter_status[c];
- else
- status = AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_OPEN;
- if (status == AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN)
- ao_led_on(continuity_led[c]);
+ if (!(ao_lco_valid[ao_lco_box] & AO_LCO_VALID_LAST)) {
+ ao_led_on(AO_LED_RED);
+ ao_led_off(AO_LED_GREEN|AO_LED_AMBER);
+ continue;
+ }
+ if (ao_radio_cmac_rssi < -90) {
+ ao_led_on(AO_LED_AMBER);
+ ao_led_off(AO_LED_RED|AO_LED_GREEN);
+ } else {
+ ao_led_on(AO_LED_GREEN);
+ ao_led_off(AO_LED_RED|AO_LED_AMBER);
+ }
+ if (ao_pad_query.arm_status)
+ ao_led_on(AO_LED_REMOTE_ARM);
else
- ao_led_off(continuity_led[c]);
+ ao_led_off(AO_LED_REMOTE_ARM);
+
+ for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) {
+ uint8_t status;
+
+ if (ao_lco_drag_race) {
+ if (ao_lco_selected[ao_lco_box] & (1 << c) && t)
+ ao_led_on(continuity_led[c]);
+ else
+ ao_led_off(continuity_led[c]);
+ } else {
+ if (ao_pad_query.channels & (1 << c))
+ status = ao_pad_query.igniter_status[c];
+ else
+ status = AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_OPEN;
+ if (status == AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN)
+ ao_led_on(continuity_led[c]);
+ else
+ ao_led_off(continuity_led[c]);
+ }
+ }
+ t = 1-t;
}
}
}
ao_lco_monitor(void)
{
uint16_t delay;
+ uint8_t box;
ao_lco_search();
ao_add_task(&ao_lco_input_task, ao_lco_input, "lco input");
ao_add_task(&ao_lco_arm_warn_task, ao_lco_arm_warn, "lco arm warn");
ao_add_task(&ao_lco_igniter_status_task, ao_lco_igniter_status, "lco igniter status");
+ ao_add_task(&ao_lco_drag_task, ao_lco_drag_monitor, "drag race");
for (;;) {
- PRINTD("monitor armed %d firing %d offset %d\n",
- ao_lco_armed, ao_lco_firing, ao_lco_tick_offset);
+ PRINTD("monitor armed %d firing %d\n",
+ ao_lco_armed, ao_lco_firing);
if (ao_lco_armed && ao_lco_firing) {
- PRINTD("Firing box %d pad %d: valid %d\n",
- ao_lco_box, ao_lco_pad, ao_lco_valid);
- if (!ao_lco_valid)
- ao_lco_update();
- if (ao_lco_valid && ao_lco_pad)
- ao_lco_ignite(ao_lco_box, 1 << (ao_lco_pad - 1), ao_lco_tick_offset);
- } else if (ao_lco_armed) {
- PRINTD("Arming box %d pad %d\n",
- ao_lco_box, ao_lco_pad);
- if (!ao_lco_valid)
- ao_lco_update();
- if (ao_lco_pad) {
- ao_lco_arm(ao_lco_box, 1 << (ao_lco_pad - 1), ao_lco_tick_offset);
- ao_delay(AO_MS_TO_TICKS(30));
- ao_lco_update();
- }
+ ao_lco_ignite();
} else {
ao_lco_update();
+ if (ao_lco_armed) {
+ for (box = ao_lco_min_box; box <= ao_lco_max_box; box++) {
+ if (ao_lco_selected[box]) {
+ PRINTD("Arming box %d pads %x\n",
+ box, ao_lco_selected[box]);
+ if (ao_lco_valid[box] & AO_LCO_VALID_EVER) {
+ ao_lco_arm(box, ao_lco_selected[box], ao_lco_tick_offset[box]);
+ ao_delay(AO_MS_TO_TICKS(10));
+ }
+ }
+ }
+ }
}
if (ao_lco_armed && ao_lco_firing)
delay = AO_MS_TO_TICKS(100);
static void
lco_ignite(void)
{
- ao_lco_ignite(lco_box, lco_channels, tick_offset);
+ ao_lco_ignite();
}
static void
}
#endif
ao_mutex_get(&ao_lco_mutex);
- command.tick = ao_time() - *tick_offset;
+ command.tick = ao_time();
command.box = box;
command.cmd = AO_LAUNCH_QUERY;
command.channels = 0;
}
void
-ao_lco_ignite(uint16_t box, uint8_t channels, uint16_t tick_offset)
+ao_lco_ignite(void)
{
ao_mutex_get(&ao_lco_mutex);
- command.tick = ao_time() - tick_offset;
- command.box = box;
+ command.tick = 0;
+ command.box = 0;
command.cmd = AO_LAUNCH_FIRE;
- command.channels = channels;
+ command.channels = 0;
ao_radio_cmac_send(&command, sizeof (command));
ao_mutex_put(&ao_lco_mutex);
}
-
ao_lco_arm(uint16_t box, uint8_t channels, uint16_t tick_offset);
void
-ao_lco_ignite(uint16_t box, uint8_t channels, uint16_t tick_offset);
+ao_lco_ignite(void);
#endif /* _AO_LCO_FUNC_H_ */
PRINTD ("armed\n");
ao_pad_armed = command.channels;
ao_pad_arm_time = ao_time();
-
- /* fall through ... */
+ break;
case AO_LAUNCH_QUERY:
if (command.box != ao_pad_box) {
ao_pad_arm_time, ao_time());
break;
}
- time_difference = command.tick - ao_time();
- if (time_difference < 0)
- time_difference = -time_difference;
- if (time_difference > 10) {
- PRINTD ("time different too large %d\n", time_difference);
- break;
- }
PRINTD ("ignite\n");
ao_pad_ignite = ao_pad_armed;
ao_pad_arm_time = ao_time();
--- /dev/null
+/*
+ * Copyright © 2015 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_PWM_H_
+#define _AO_PWM_H_
+
+#include <stdint.h>
+
+void
+ao_pwm_set(uint8_t pwm, uint16_t value);
+
+void
+ao_pwm_init(void);
+
+#endif /* _AO_PWM_H_ */
(0 << 6), /* F */
};
+
void
-ao_seven_segment_set(uint8_t digit, uint8_t value)
+ao_seven_segment_direct(uint8_t digit, uint8_t segments)
{
uint8_t s;
+
+ for (s = 0; s <= 7; s++)
+ ao_lcd_set(digit, s, !!(segments & (1 << s)));
+ ao_lcd_flush();
+}
+
+void
+ao_seven_segment_set(uint8_t digit, uint8_t value)
+{
uint8_t segments;
if (value == AO_SEVEN_SEGMENT_CLEAR)
if (value & 0x10)
segments |= (1 << 7);
}
-
- for (s = 0; s <= 7; s++)
- ao_lcd_set(digit, s, !!(segments & (1 << s)));
- ao_lcd_flush();
+ ao_seven_segment_direct(digit, segments);
}
void
#define AO_SEVEN_SEGMENT_CLEAR 0xff
+void
+ao_seven_segment_direct(uint8_t digit, uint8_t segments);
+
void
ao_seven_segment_set(uint8_t digit, uint8_t value);
#define HAS_RADIO 0
#define HAS_TELEMETRY 0
#define HAS_APRS 0
+#define HAS_COMPANION 1
#define HAS_SPI_1 1
#define SPI_1_PA5_PA6_PA7 1 /* Barometer */
static __xdata union ao_telemetry_all telemetry;
+static void
+ao_telemetry_send(void)
+{
+ ao_radio_send(&telemetry, sizeof (telemetry));
+ ao_delay(1);
+}
+
#if defined AO_TELEMETRY_SENSOR
/* Send sensor packet */
static void
telemetry.sensor.accel_minus_g = 0;
#endif
- ao_radio_send(&telemetry, sizeof (telemetry));
+ ao_telemetry_send();
}
#endif
telemetry.mega_sensor.mag_z = packet->hmc5883.z;
#endif
- ao_radio_send(&telemetry, sizeof (telemetry));
+ ao_telemetry_send();
}
static __pdata int8_t ao_telemetry_mega_data_max;
telemetry.mega_data.speed = ao_speed;
telemetry.mega_data.height = ao_height;
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_mega_data_cur = ao_telemetry_mega_data_max;
+ ao_telemetry_send();
}
}
#endif /* AO_SEND_MEGA */
telemetry.metrum_sensor.sense_a = packet->adc.sense_a;
telemetry.metrum_sensor.sense_m = packet->adc.sense_m;
- ao_radio_send(&telemetry, sizeof (telemetry));
+ ao_telemetry_send();
}
static __pdata int8_t ao_telemetry_metrum_data_max;
telemetry.metrum_data.accel_minus_g = 2;
#endif
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_metrum_data_cur = ao_telemetry_metrum_data_max;
+ ao_telemetry_send();
}
}
#endif /* AO_SEND_METRUM */
telemetry.mini.ground_pres = ao_ground_pres;
- ao_radio_send(&telemetry, sizeof (telemetry));
+ ao_telemetry_send();
}
#endif /* AO_SEND_MINI */
ao_xmemcpy (telemetry.configuration.version,
CODE_TO_XDATA(ao_version),
AO_MAX_VERSION);
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_config_cur = ao_telemetry_config_max;
+ ao_telemetry_send();
}
}
27);
telemetry.location.tick = ao_gps_tick;
ao_mutex_put(&ao_gps_mutex);
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_loc_cur = ao_telemetry_gps_max;
+ ao_telemetry_send();
}
}
&ao_gps_tracking_data.sats,
AO_MAX_GPS_TRACKING * sizeof (struct ao_telemetry_satellite_info));
ao_mutex_put(&ao_gps_mutex);
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_sat_cur = ao_telemetry_gps_max;
+ ao_telemetry_send();
}
}
#endif
ao_companion_data,
ao_companion_setup.channels * 2);
ao_mutex_put(&ao_companion_mutex);
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_companion_cur = ao_telemetry_companion_max;
+ ao_telemetry_send();
}
}
#endif
--- /dev/null
+/*
+ * Copyright © 2015 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "ao.h"
+#include "ao_pwm.h"
+
+static uint8_t pwm_running;
+
+static uint16_t pwm_value[NUM_PWM];
+
+static void
+ao_pwm_up(void)
+{
+ if (pwm_running++ == 0) {
+ struct stm_tim234 *tim = &AO_PWM_TIMER;
+
+ tim->ccr1 = 0;
+ tim->ccr2 = 0;
+ tim->ccr3 = 0;
+ tim->ccr4 = 0;
+ tim->arr = PWM_MAX - 1; /* turn on the timer */
+ tim->cr1 = ((STM_TIM234_CR1_CKD_1 << STM_TIM234_CR1_CKD) |
+ (0 << STM_TIM234_CR1_ARPE) |
+ (STM_TIM234_CR1_CMS_EDGE << STM_TIM234_CR1_CMS) |
+ (STM_TIM234_CR1_DIR_UP << STM_TIM234_CR1_DIR) |
+ (0 << STM_TIM234_CR1_OPM) |
+ (0 << STM_TIM234_CR1_URS) |
+ (0 << STM_TIM234_CR1_UDIS) |
+ (1 << STM_TIM234_CR1_CEN));
+
+ /* Set the timer running */
+ tim->egr = (1 << STM_TIM234_EGR_UG);
+ }
+}
+
+static void
+ao_pwm_down(void)
+{
+ if (--pwm_running == 0) {
+ struct stm_tim234 *tim = &AO_PWM_TIMER;
+
+ tim->arr = 0;
+ tim->cr1 = ((STM_TIM234_CR1_CKD_1 << STM_TIM234_CR1_CKD) |
+ (0 << STM_TIM234_CR1_ARPE) |
+ (STM_TIM234_CR1_CMS_EDGE << STM_TIM234_CR1_CMS) |
+ (STM_TIM234_CR1_DIR_UP << STM_TIM234_CR1_DIR) |
+ (0 << STM_TIM234_CR1_OPM) |
+ (0 << STM_TIM234_CR1_URS) |
+ (0 << STM_TIM234_CR1_UDIS) |
+ (0 << STM_TIM234_CR1_CEN));
+
+ /* Stop the timer */
+ tim->egr = (1 << STM_TIM234_EGR_UG);
+ }
+}
+
+void
+ao_pwm_set(uint8_t pwm, uint16_t value)
+{
+ struct stm_tim234 *tim = &AO_PWM_TIMER;
+
+ if (value > PWM_MAX)
+ value = PWM_MAX;
+ if (value != 0) {
+ if (pwm_value[pwm] == 0)
+ ao_pwm_up();
+ }
+ switch (pwm) {
+ case 0:
+ tim->ccr1 = value;
+ break;
+ case 1:
+ tim->ccr2 = value;
+ break;
+ case 2:
+ tim->ccr3 = value;
+ break;
+ case 3:
+ tim->ccr4 = value;
+ break;
+ }
+ if (value == 0) {
+ if (pwm_value[pwm] != 0)
+ ao_pwm_down();
+ }
+ pwm_value[pwm] = value;
+}
+
+static void
+ao_pwm_cmd(void)
+{
+ uint8_t ch;
+ uint16_t val;
+
+ ao_cmd_decimal();
+ ch = ao_cmd_lex_u32;
+ ao_cmd_decimal();
+ val = ao_cmd_lex_u32;
+ if (ao_cmd_status != ao_cmd_success)
+ return;
+
+ printf("Set channel %d to %d\n", ch, val);
+ ao_pwm_set(ch, val);
+}
+
+static const struct ao_cmds ao_pwm_cmds[] = {
+ { ao_pwm_cmd, "P <ch> <val>\0Set PWM ch to val" },
+ { 0, NULL },
+};
+
+void
+ao_pwm_init(void)
+{
+ struct stm_tim234 *tim = &AO_PWM_TIMER;
+
+ stm_rcc.apb1enr |= (1 << AO_PWM_TIMER_ENABLE);
+
+ tim->cr1 = 0;
+ tim->psc = AO_PWM_TIMER_SCALE - 1;
+ tim->cnt = 0;
+ tim->ccer = ((1 << STM_TIM234_CCER_CC1E) |
+ (0 << STM_TIM234_CCER_CC1P) |
+ (1 << STM_TIM234_CCER_CC2E) |
+ (0 << STM_TIM234_CCER_CC2P) |
+ (1 << STM_TIM234_CCER_CC3E) |
+ (0 << STM_TIM234_CCER_CC3P) |
+ (1 << STM_TIM234_CCER_CC4E) |
+ (0 << STM_TIM234_CCER_CC4P));
+
+ tim->ccmr1 = ((0 << STM_TIM234_CCMR1_OC2CE) |
+ (STM_TIM234_CCMR1_OC2M_PWM_MODE_1 << STM_TIM234_CCMR1_OC2M) |
+ (0 << STM_TIM234_CCMR1_OC2PE) |
+ (0 << STM_TIM234_CCMR1_OC2FE) |
+ (STM_TIM234_CCMR1_CC2S_OUTPUT << STM_TIM234_CCMR1_CC2S) |
+
+ (0 << STM_TIM234_CCMR1_OC1CE) |
+ (STM_TIM234_CCMR1_OC1M_PWM_MODE_1 << STM_TIM234_CCMR1_OC1M) |
+ (0 << STM_TIM234_CCMR1_OC1PE) |
+ (0 << STM_TIM234_CCMR1_OC1FE) |
+ (STM_TIM234_CCMR1_CC1S_OUTPUT << STM_TIM234_CCMR1_CC1S));
+
+
+ tim->ccmr2 = ((0 << STM_TIM234_CCMR2_OC4CE) |
+ (STM_TIM234_CCMR2_OC4M_PWM_MODE_1 << STM_TIM234_CCMR2_OC4M) |
+ (0 << STM_TIM234_CCMR2_OC4PE) |
+ (0 << STM_TIM234_CCMR2_OC4FE) |
+ (STM_TIM234_CCMR2_CC4S_OUTPUT << STM_TIM234_CCMR2_CC4S) |
+
+ (0 << STM_TIM234_CCMR2_OC3CE) |
+ (STM_TIM234_CCMR2_OC3M_PWM_MODE_1 << STM_TIM234_CCMR2_OC3M) |
+ (0 << STM_TIM234_CCMR2_OC3PE) |
+ (0 << STM_TIM234_CCMR2_OC3FE) |
+ (STM_TIM234_CCMR2_CC3S_OUTPUT << STM_TIM234_CCMR2_CC3S));
+ tim->egr = 0;
+
+ tim->sr = 0;
+ tim->dier = 0;
+ tim->smcr = 0;
+ tim->cr2 = ((0 << STM_TIM234_CR2_TI1S) |
+ (STM_TIM234_CR2_MMS_RESET<< STM_TIM234_CR2_MMS) |
+ (0 << STM_TIM234_CR2_CCDS));
+
+ stm_afr_set(AO_PWM_0_GPIO, AO_PWM_0_PIN, STM_AFR_AF2);
+ stm_ospeedr_set(AO_PWM_0_GPIO, AO_PWM_0_PIN, STM_OSPEEDR_40MHz);
+#if NUM_PWM > 1
+ stm_afr_set(AO_PWM_1_GPIO, AO_PWM_1_PIN, STM_AFR_AF2);
+ stm_ospeedr_set(AO_PWM_1_GPIO, AO_PWM_1_PIN, STM_OSPEEDR_40MHz);
+#endif
+#if NUM_PWM > 2
+ stm_afr_set(AO_PWM_2_GPIO, AO_PWM_2_PIN, STM_AFR_AF2);
+ stm_ospeedr_set(AO_PWM_2_GPIO, AO_PWM_2_PIN, STM_OSPEEDR_40MHz);
+#endif
+#if NUM_PWM > 3
+ stm_afr_set(AO_PWM_3_GPIO, AO_PWM_3_PIN, STM_AFR_AF2);
+ stm_ospeedr_set(AO_PWM_3_GPIO, AO_PWM_3_PIN, STM_OSPEEDR_40MHz);
+#endif
+ ao_cmd_register(&ao_pwm_cmds[0]);
+}
#define STM_TIM234_CCMR1_OC1M_PWM_MODE_1 6
#define STM_TIM234_CCMR1_OC1M_PWM_MODE_2 7
#define STM_TIM234_CCMR1_OC1M_MASK 7
-#define STM_TIM234_CCMR1_OC1PE 11
+#define STM_TIM234_CCMR1_OC1PE 3
#define STM_TIM234_CCMR1_OC1FE 2
#define STM_TIM234_CCMR1_CC1S 0
#define STM_TIM234_CCMR1_CC1S_OUTPUT 0
#define STM_TIM234_CCMR2_OC3M_PWM_MODE_1 6
#define STM_TIM234_CCMR2_OC3M_PWM_MODE_2 7
#define STM_TIM234_CCMR2_OC3M_MASK 7
-#define STM_TIM234_CCMR2_OC3PE 11
+#define STM_TIM234_CCMR2_OC3PE 3
#define STM_TIM234_CCMR2_OC3FE 2
#define STM_TIM234_CCMR2_CC3S 0
#define STM_TIM234_CCMR2_CC3S_OUTPUT 0
#define HAS_RADIO 1
#define HAS_TELEMETRY 1
#define HAS_APRS 1
+#define HAS_COMPANION 1
#define HAS_SPI_1 1
#define SPI_1_PA5_PA6_PA7 1 /* Barometer */
#define HAS_RADIO 1
#define HAS_TELEMETRY 1
#define HAS_APRS 1
+#define HAS_COMPANION 1
#define HAS_SPI_1 1
#define SPI_1_PA5_PA6_PA7 1 /* Barometer */
#define HAS_RADIO 1
#define HAS_TELEMETRY 1
#define HAS_APRS 1
+#define HAS_COMPANION 1
#define HAS_SPI_1 1
#define SPI_1_PA5_PA6_PA7 1 /* Barometer */
--- /dev/null
+ao_product.h
+telemega-*.elf
--- /dev/null
+#
+# AltOS build
+#
+#
+
+include ../stm/Makefile.defs
+
+INC = \
+ ao.h \
+ ao_arch.h \
+ ao_arch_funcs.h \
+ ao_boot.h \
+ ao_companion.h \
+ ao_data.h \
+ ao_sample.h \
+ ao_pins.h \
+ altitude-pa.h \
+ ao_kalman.h \
+ ao_product.h \
+ ao_ms5607.h \
+ ao_hmc5883.h \
+ ao_mpu6000.h \
+ ao_mma655x.h \
+ ao_cc1200_CC1200.h \
+ ao_profile.h \
+ ao_task.h \
+ ao_whiten.h \
+ ao_sample_profile.h \
+ ao_quaternion.h \
+ math.h \
+ ao_mpu.h \
+ stm32l.h \
+ math.h \
+ ao_ms5607_convert.c \
+ Makefile
+
+#
+# Common AltOS sources
+#
+# ao_hmc5883.c
+
+#PROFILE=ao_profile.c
+#PROFILE_DEF=-DAO_PROFILE=1
+
+#SAMPLE_PROFILE=ao_sample_profile.c \
+# ao_sample_profile_timer.c
+#SAMPLE_PROFILE_DEF=-DHAS_SAMPLE_PROFILE=1
+
+#STACK_GUARD=ao_mpu_stm.c
+#STACK_GUARD_DEF=-DHAS_STACK_GUARD=1
+
+MATH_SRC=\
+ ef_acos.c \
+ ef_sqrt.c \
+ ef_rem_pio2.c \
+ kf_cos.c \
+ kf_sin.c \
+ kf_rem_pio2.c \
+ sf_copysign.c \
+ sf_cos.c \
+ sf_fabs.c \
+ sf_floor.c \
+ sf_scalbn.c \
+ sf_sin.c \
+ ef_log.c
+
+ALTOS_SRC = \
+ ao_boot_chain.c \
+ ao_interrupt.c \
+ ao_product.c \
+ ao_romconfig.c \
+ ao_cmd.c \
+ ao_config.c \
+ ao_task.c \
+ ao_led.c \
+ ao_stdio.c \
+ ao_panic.c \
+ ao_timer.c \
+ ao_mutex.c \
+ ao_serial_stm.c \
+ ao_gps_ublox.c \
+ ao_gps_show.c \
+ ao_gps_report_mega.c \
+ ao_ignite.c \
+ ao_freq.c \
+ ao_dma_stm.c \
+ ao_spi_stm.c \
+ ao_cc1200.c \
+ ao_data.c \
+ ao_ms5607.c \
+ ao_mma655x.c \
+ ao_hmc5883.c \
+ ao_adc_stm.c \
+ ao_beep_stm.c \
+ ao_eeprom_stm.c \
+ ao_storage.c \
+ ao_m25.c \
+ ao_usb_stm.c \
+ ao_exti_stm.c \
+ ao_report.c \
+ ao_i2c_stm.c \
+ ao_mpu6000.c \
+ ao_convert_pa.c \
+ ao_convert_volt.c \
+ ao_log.c \
+ ao_log_mega.c \
+ ao_sample.c \
+ ao_kalman.c \
+ ao_flight.c \
+ ao_telemetry.c \
+ ao_packet_slave.c \
+ ao_packet.c \
+ ao_companion.c \
+ ao_pyro.c \
+ ao_aprs.c \
+ ao_pwm_stm.c \
+ $(MATH_SRC) \
+ $(PROFILE) \
+ $(SAMPLE_PROFILE) \
+ $(STACK_GUARD)
+
+PRODUCT=TeleMega-v2.0
+PRODUCT_DEF=-DTELEMEGA
+IDPRODUCT=0x0023
+
+CFLAGS = $(PRODUCT_DEF) $(STM_CFLAGS) $(PROFILE_DEF) $(SAMPLE_PROFILE_DEF) $(STACK_GUARD_DEF) -Os -g
+
+PROGNAME=telemega-v2.0
+PROG=$(PROGNAME)-$(VERSION).elf
+HEX=$(PROGNAME)-$(VERSION).ihx
+
+SRC=$(ALTOS_SRC) ao_telemega.c
+OBJ=$(SRC:.c=.o)
+
+all: $(PROG) $(HEX)
+
+$(PROG): Makefile $(OBJ) altos.ld
+ $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ) $(LIBS)
+
+../altitude-pa.h: make-altitude-pa
+ nickle $< > $@
+
+$(OBJ): $(INC)
+
+ao_product.h: ao-make-product.5c ../Version
+ $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@
+
+distclean: clean
+
+clean:
+ rm -f *.o $(PROGNAME)-*.elf $(PROGNAME)-*.ihx
+ rm -f ao_product.h
+
+install:
+
+uninstall:
--- /dev/null
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_PINS_H_
+#define _AO_PINS_H_
+
+#define HAS_TASK_QUEUE 1
+
+/* 8MHz High speed external crystal */
+#define AO_HSE 8000000
+
+/* PLLVCO = 96MHz (so that USB will work) */
+#define AO_PLLMUL 12
+#define AO_RCC_CFGR_PLLMUL (STM_RCC_CFGR_PLLMUL_12)
+
+/* SYSCLK = 32MHz (no need to go faster than CPU) */
+#define AO_PLLDIV 3
+#define AO_RCC_CFGR_PLLDIV (STM_RCC_CFGR_PLLDIV_3)
+
+/* HCLK = 32MHz (CPU clock) */
+#define AO_AHB_PRESCALER 1
+#define AO_RCC_CFGR_HPRE_DIV STM_RCC_CFGR_HPRE_DIV_1
+
+/* Run APB1 at 16MHz (HCLK/2) */
+#define AO_APB1_PRESCALER 2
+#define AO_RCC_CFGR_PPRE1_DIV STM_RCC_CFGR_PPRE2_DIV_2
+
+/* Run APB2 at 16MHz (HCLK/2) */
+#define AO_APB2_PRESCALER 2
+#define AO_RCC_CFGR_PPRE2_DIV STM_RCC_CFGR_PPRE2_DIV_2
+
+#define HAS_SERIAL_1 0
+#define USE_SERIAL_1_STDIN 0
+#define SERIAL_1_PB6_PB7 0
+#define SERIAL_1_PA9_PA10 1
+
+#define HAS_SERIAL_2 0
+#define USE_SERIAL_2_STDIN 0
+#define SERIAL_2_PA2_PA3 0
+#define SERIAL_2_PD5_PD6 0
+
+#define HAS_SERIAL_3 1
+#define USE_SERIAL_3_STDIN 0
+#define SERIAL_3_PB10_PB11 0
+#define SERIAL_3_PC10_PC11 1
+#define SERIAL_3_PD8_PD9 0
+
+#define ao_gps_getchar ao_serial3_getchar
+#define ao_gps_putchar ao_serial3_putchar
+#define ao_gps_set_speed ao_serial3_set_speed
+#define ao_gps_fifo (ao_stm_usart3.rx_fifo)
+
+#define AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX (1024 * 1024)
+#define AO_CONFIG_MAX_SIZE 1024
+#define LOG_ERASE_MARK 0x55
+#define LOG_MAX_ERASE 128
+
+#define HAS_EEPROM 1
+#define USE_INTERNAL_FLASH 0
+#define USE_EEPROM_CONFIG 1
+#define USE_STORAGE_CONFIG 0
+#define HAS_USB 1
+#define HAS_BEEP 1
+#define HAS_BATTERY_REPORT 1
+#define HAS_RADIO 1
+#define HAS_TELEMETRY 1
+#define HAS_APRS 1
+#define HAS_COMPANION 1
+
+#define HAS_SPI_1 1
+#define SPI_1_PA5_PA6_PA7 1 /* Barometer */
+#define SPI_1_PB3_PB4_PB5 0
+#define SPI_1_PE13_PE14_PE15 1 /* Accelerometer, Gyro */
+#define SPI_1_OSPEEDR STM_OSPEEDR_10MHz
+
+#define HAS_SPI_2 1
+#define SPI_2_PB13_PB14_PB15 1 /* Flash, Companion */
+#define SPI_2_PD1_PD3_PD4 0
+#define SPI_2_OSPEEDR STM_OSPEEDR_10MHz
+
+#define SPI_2_PORT (&stm_gpiob)
+#define SPI_2_SCK_PIN 13
+#define SPI_2_MISO_PIN 14
+#define SPI_2_MOSI_PIN 15
+
+#define HAS_I2C_1 1
+#define I2C_1_PB8_PB9 1
+
+#define HAS_I2C_2 0
+#define I2C_2_PB10_PB11 0
+
+#define PACKET_HAS_SLAVE 1
+#define PACKET_HAS_MASTER 0
+
+#define LOW_LEVEL_DEBUG 0
+
+#define LED_PORT_ENABLE STM_RCC_AHBENR_GPIOCEN
+#define LED_PORT (&stm_gpioc)
+#define LED_PIN_RED 8
+#define LED_PIN_GREEN 9
+#define AO_LED_RED (1 << LED_PIN_RED)
+#define AO_LED_GREEN (1 << LED_PIN_GREEN)
+
+#define LEDS_AVAILABLE (AO_LED_RED | AO_LED_GREEN)
+
+#define HAS_GPS 1
+#define HAS_FLIGHT 1
+#define HAS_ADC 1
+#define HAS_ADC_TEMP 1
+#define HAS_LOG 1
+
+/*
+ * Igniter
+ */
+
+#define HAS_IGNITE 1
+#define HAS_IGNITE_REPORT 1
+
+#define AO_SENSE_PYRO(p,n) ((p)->adc.sense[n])
+#define AO_SENSE_DROGUE(p) ((p)->adc.sense[4])
+#define AO_SENSE_MAIN(p) ((p)->adc.sense[5])
+#define AO_IGNITER_CLOSED 400
+#define AO_IGNITER_OPEN 60
+
+/* Pyro A */
+#define AO_PYRO_PORT_0 (&stm_gpiod)
+#define AO_PYRO_PIN_0 6
+
+/* Pyro B */
+#define AO_PYRO_PORT_1 (&stm_gpiod)
+#define AO_PYRO_PIN_1 7
+
+/* Pyro C */
+#define AO_PYRO_PORT_2 (&stm_gpiob)
+#define AO_PYRO_PIN_2 5
+
+/* Pyro D */
+#define AO_PYRO_PORT_3 (&stm_gpioe)
+#define AO_PYRO_PIN_3 4
+
+/* Drogue */
+#define AO_IGNITER_DROGUE_PORT (&stm_gpioe)
+#define AO_IGNITER_DROGUE_PIN 6
+
+/* Main */
+#define AO_IGNITER_MAIN_PORT (&stm_gpioe)
+#define AO_IGNITER_MAIN_PIN 5
+
+/* Number of general purpose pyro channels available */
+#define AO_PYRO_NUM 4
+
+#define AO_IGNITER_SET_DROGUE(v) stm_gpio_set(AO_IGNITER_DROGUE_PORT, AO_IGNITER_DROGUE_PIN, v)
+#define AO_IGNITER_SET_MAIN(v) stm_gpio_set(AO_IGNITER_MAIN_PORT, AO_IGNITER_MAIN_PIN, v)
+
+/*
+ * ADC
+ */
+#define AO_DATA_RING 32
+#define AO_ADC_NUM_SENSE 6
+
+struct ao_adc {
+ int16_t sense[AO_ADC_NUM_SENSE];
+ int16_t v_batt;
+ int16_t v_pbatt;
+ int16_t temp;
+};
+
+#define AO_ADC_DUMP(p) \
+ printf("tick: %5u A: %5d B: %5d C: %5d D: %5d drogue: %5d main: %5d batt: %5d pbatt: %5d temp: %5d\n", \
+ (p)->tick, \
+ (p)->adc.sense[0], (p)->adc.sense[1], (p)->adc.sense[2], \
+ (p)->adc.sense[3], (p)->adc.sense[4], (p)->adc.sense[5], \
+ (p)->adc.v_batt, (p)->adc.v_pbatt, (p)->adc.temp)
+
+#define AO_ADC_SENSE_A 0
+#define AO_ADC_SENSE_A_PORT (&stm_gpioa)
+#define AO_ADC_SENSE_A_PIN 0
+
+#define AO_ADC_SENSE_B 1
+#define AO_ADC_SENSE_B_PORT (&stm_gpioa)
+#define AO_ADC_SENSE_B_PIN 1
+
+#define AO_ADC_SENSE_C 2
+#define AO_ADC_SENSE_C_PORT (&stm_gpioa)
+#define AO_ADC_SENSE_C_PIN 2
+
+#define AO_ADC_SENSE_D 3
+#define AO_ADC_SENSE_D_PORT (&stm_gpioa)
+#define AO_ADC_SENSE_D_PIN 3
+
+#define AO_ADC_SENSE_DROGUE 4
+#define AO_ADC_SENSE_DROGUE_PORT (&stm_gpioa)
+#define AO_ADC_SENSE_DROGUE_PIN 4
+
+#define AO_ADC_SENSE_MAIN 22
+#define AO_ADC_SENSE_MAIN_PORT (&stm_gpioe)
+#define AO_ADC_SENSE_MAIN_PIN 7
+
+#define AO_ADC_V_BATT 8
+#define AO_ADC_V_BATT_PORT (&stm_gpiob)
+#define AO_ADC_V_BATT_PIN 0
+
+#define AO_ADC_V_PBATT 9
+#define AO_ADC_V_PBATT_PORT (&stm_gpiob)
+#define AO_ADC_V_PBATT_PIN 1
+
+#define AO_ADC_TEMP 16
+
+#define AO_ADC_RCC_AHBENR ((1 << STM_RCC_AHBENR_GPIOAEN) | \
+ (1 << STM_RCC_AHBENR_GPIOEEN) | \
+ (1 << STM_RCC_AHBENR_GPIOBEN))
+
+#define AO_NUM_ADC_PIN (AO_ADC_NUM_SENSE + 2)
+
+#define AO_ADC_PIN0_PORT AO_ADC_SENSE_A_PORT
+#define AO_ADC_PIN0_PIN AO_ADC_SENSE_A_PIN
+#define AO_ADC_PIN1_PORT AO_ADC_SENSE_B_PORT
+#define AO_ADC_PIN1_PIN AO_ADC_SENSE_B_PIN
+#define AO_ADC_PIN2_PORT AO_ADC_SENSE_C_PORT
+#define AO_ADC_PIN2_PIN AO_ADC_SENSE_C_PIN
+#define AO_ADC_PIN3_PORT AO_ADC_SENSE_D_PORT
+#define AO_ADC_PIN3_PIN AO_ADC_SENSE_D_PIN
+#define AO_ADC_PIN4_PORT AO_ADC_SENSE_DROGUE_PORT
+#define AO_ADC_PIN4_PIN AO_ADC_SENSE_DROGUE_PIN
+#define AO_ADC_PIN5_PORT AO_ADC_SENSE_MAIN_PORT
+#define AO_ADC_PIN5_PIN AO_ADC_SENSE_MAIN_PIN
+#define AO_ADC_PIN6_PORT AO_ADC_V_BATT_PORT
+#define AO_ADC_PIN6_PIN AO_ADC_V_BATT_PIN
+#define AO_ADC_PIN7_PORT AO_ADC_V_PBATT_PORT
+#define AO_ADC_PIN7_PIN AO_ADC_V_PBATT_PIN
+
+#define AO_NUM_ADC (AO_ADC_NUM_SENSE + 3)
+
+#define AO_ADC_SQ1 AO_ADC_SENSE_A
+#define AO_ADC_SQ2 AO_ADC_SENSE_B
+#define AO_ADC_SQ3 AO_ADC_SENSE_C
+#define AO_ADC_SQ4 AO_ADC_SENSE_D
+#define AO_ADC_SQ5 AO_ADC_SENSE_DROGUE
+#define AO_ADC_SQ6 AO_ADC_SENSE_MAIN
+#define AO_ADC_SQ7 AO_ADC_V_BATT
+#define AO_ADC_SQ8 AO_ADC_V_PBATT
+#define AO_ADC_SQ9 AO_ADC_TEMP
+
+/*
+ * Voltage divider on ADC battery sampler
+ */
+#define AO_BATTERY_DIV_PLUS 56 /* 5.6k */
+#define AO_BATTERY_DIV_MINUS 100 /* 10k */
+
+/*
+ * Voltage divider on ADC igniter samplers
+ */
+#define AO_IGNITE_DIV_PLUS 100 /* 100k */
+#define AO_IGNITE_DIV_MINUS 27 /* 27k */
+
+/*
+ * ADC reference in decivolts
+ */
+#define AO_ADC_REFERENCE_DV 33
+
+/*
+ * Pressure sensor settings
+ */
+#define HAS_MS5607 1
+#define HAS_MS5611 0
+#define AO_MS5607_PRIVATE_PINS 1
+#define AO_MS5607_CS_PORT (&stm_gpioc)
+#define AO_MS5607_CS_PIN 4
+#define AO_MS5607_CS_MASK (1 << AO_MS5607_CS)
+#define AO_MS5607_MISO_PORT (&stm_gpioa)
+#define AO_MS5607_MISO_PIN 6
+#define AO_MS5607_MISO_MASK (1 << AO_MS5607_MISO)
+#define AO_MS5607_SPI_INDEX AO_SPI_1_PA5_PA6_PA7
+
+/*
+ * SPI Flash memory
+ */
+
+#define M25_MAX_CHIPS 1
+#define AO_M25_SPI_CS_PORT (&stm_gpiod)
+#define AO_M25_SPI_CS_MASK (1 << 3)
+#define AO_M25_SPI_BUS AO_SPI_2_PB13_PB14_PB15
+
+/*
+ * Radio (cc1120)
+ */
+
+/* gets pretty close to 434.550 */
+
+#define AO_RADIO_CAL_DEFAULT 5695733
+
+#define AO_FEC_DEBUG 0
+#define AO_CC1200_SPI_CS_PORT (&stm_gpioc)
+#define AO_CC1200_SPI_CS_PIN 5
+#define AO_CC1200_SPI_BUS AO_SPI_2_PB13_PB14_PB15
+#define AO_CC1200_SPI stm_spi2
+
+#define AO_CC1200_INT_PORT (&stm_gpioe)
+#define AO_CC1200_INT_PIN 1
+#define AO_CC1200_MCU_WAKEUP_PORT (&stm_gpioc)
+#define AO_CC1200_MCU_WAKEUP_PIN (0)
+
+#define AO_CC1200_INT_GPIO 2
+#define AO_CC1200_INT_GPIO_IOCFG CC1200_IOCFG2
+
+#define AO_CC1200_MARC_GPIO 3
+#define AO_CC1200_MARC_GPIO_IOCFG CC1200_IOCFG3
+
+#define HAS_BOOT_RADIO 0
+
+/*
+ * Mag sensor (hmc5883)
+ */
+
+#define HAS_HMC5883 1
+#define AO_HMC5883_INT_PORT (&stm_gpioc)
+#define AO_HMC5883_INT_PIN 12
+#define AO_HMC5883_I2C_INDEX STM_I2C_INDEX(1)
+
+/*
+ * mpu6000
+ */
+
+#define HAS_MPU6000 1
+#define AO_MPU6000_INT_PORT (&stm_gpioe)
+#define AO_MPU6000_INT_PIN 0
+#define AO_MPU6000_SPI_BUS AO_SPI_1_PE13_PE14_PE15
+#define AO_MPU6000_SPI_CS_PORT (&stm_gpiod)
+#define AO_MPU6000_SPI_CS_PIN 2
+#define HAS_IMU 1
+
+/*
+ * mma655x
+ */
+
+#define HAS_MMA655X 1
+#define AO_MMA655X_SPI_INDEX AO_SPI_1_PE13_PE14_PE15
+#define AO_MMA655X_CS_PORT (&stm_gpiod)
+#define AO_MMA655X_CS_PIN 4
+
+#define NUM_CMDS 16
+
+/*
+ * Companion
+ */
+
+#define AO_COMPANION_CS_PORT (&stm_gpiob)
+#define AO_COMPANION_CS_PIN_0 (6)
+#define AO_COMPANION_CS_PIN AO_COMPANION_CS_PIN_0
+#define AO_COMPANION_CS_PIN_1 (7)
+#define AO_COMPANION_SPI_BUS AO_SPI_2_PB13_PB14_PB15
+
+/*
+ * Monitor
+ */
+
+#define HAS_MONITOR 0
+#define LEGACY_MONITOR 0
+#define HAS_MONITOR_PUT 1
+#define AO_MONITOR_LED 0
+#define HAS_RSSI 0
+
+/*
+ * Profiling Viterbi decoding
+ */
+
+#ifndef AO_PROFILE
+#define AO_PROFILE 0
+#endif
+
+/*
+ * PWM output
+ */
+
+#define NUM_PWM 4
+#define PWM_MAX 20000
+#define AO_PWM_TIMER stm_tim4
+#define AO_PWM_TIMER_ENABLE STM_RCC_APB1ENR_TIM4EN
+#define AO_PWM_TIMER_SCALE 32
+
+#define AO_PWM_0_GPIO (&stm_gpiod)
+#define AO_PWM_0_PIN 12
+
+#define AO_PWM_1_GPIO (&stm_gpiod)
+#define AO_PWM_1_PIN 13
+
+#define AO_PWM_2_GPIO (&stm_gpiod)
+#define AO_PWM_2_PIN 14
+
+#define AO_PWM_3_GPIO (&stm_gpiod)
+#define AO_PWM_3_PIN 15
+
+#endif /* _AO_PINS_H_ */
--- /dev/null
+/*
+ * Copyright © 2011 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <ao.h>
+#include <ao_hmc5883.h>
+#include <ao_mpu6000.h>
+#include <ao_mma655x.h>
+#include <ao_log.h>
+#include <ao_exti.h>
+#include <ao_packet.h>
+#include <ao_companion.h>
+#include <ao_profile.h>
+#include <ao_eeprom.h>
+#if HAS_SAMPLE_PROFILE
+#include <ao_sample_profile.h>
+#endif
+#include <ao_pyro.h>
+#if HAS_STACK_GUARD
+#include <ao_mpu.h>
+#endif
+#include <ao_pwm.h>
+
+int
+main(void)
+{
+ ao_clock_init();
+
+#if HAS_STACK_GUARD
+ ao_mpu_init();
+#endif
+
+ ao_task_init();
+ ao_serial_init();
+ ao_led_init(LEDS_AVAILABLE);
+ ao_led_on(AO_LED_GREEN);
+ ao_timer_init();
+
+ ao_i2c_init();
+ ao_spi_init();
+ ao_dma_init();
+ ao_exti_init();
+
+ ao_adc_init();
+#if HAS_BEEP
+ ao_beep_init();
+#endif
+ ao_cmd_init();
+
+#if HAS_MS5607
+ ao_ms5607_init();
+#endif
+#if HAS_HMC5883
+ ao_hmc5883_init();
+#endif
+#if HAS_MPU6000
+ ao_mpu6000_init();
+#endif
+#if HAS_MMA655X
+ ao_mma655x_init();
+#endif
+
+ ao_eeprom_init();
+ ao_storage_init();
+
+ ao_flight_init();
+ ao_log_init();
+ ao_report_init();
+
+ ao_usb_init();
+ ao_gps_init();
+ ao_gps_report_mega_init();
+ ao_telemetry_init();
+ ao_radio_init();
+ ao_packet_slave_init(FALSE);
+ ao_igniter_init();
+ ao_companion_init();
+ ao_pyro_init();
+
+ ao_config_init();
+#if AO_PROFILE
+ ao_profile_init();
+#endif
+#if HAS_SAMPLE_PROFILE
+ ao_sample_profile_init();
+#endif
+
+ ao_pwm_init();
+
+ ao_start_scheduler();
+ return 0;
+}
--- /dev/null
+#
+# AltOS flash loader build
+#
+#
+
+TOPDIR=../..
+HARDWARE=telemega-v2.0
+include $(TOPDIR)/stm/Makefile-flash.defs
--- /dev/null
+/*
+ * Copyright © 2013 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_PINS_H_
+#define _AO_PINS_H_
+
+/* External crystal at 8MHz */
+#define AO_HSE 8000000
+
+#include <ao_flash_stm_pins.h>
+
+/* Companion port cs_companion0 PB6 */
+
+#define AO_BOOT_PIN 1
+#define AO_BOOT_APPLICATION_GPIO stm_gpiob
+#define AO_BOOT_APPLICATION_PIN 6
+#define AO_BOOT_APPLICATION_VALUE 1
+#define AO_BOOT_APPLICATION_MODE AO_EXTI_MODE_PULL_UP
+
+#endif /* _AO_PINS_H_ */
#define HAS_RADIO 1
#define HAS_TELEMETRY 1
#define HAS_APRS 1
+#define HAS_COMPANION 1
#define HAS_SPI_1 1
#define SPI_1_PA5_PA6_PA7 1 /* Barometer */
import java.util.concurrent.*;
import java.util.*;
import java.text.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class TeleGPS
extends AltosUIFrame
import java.io.*;
import java.util.concurrent.*;
import java.text.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class TeleGPSConfig implements ActionListener {
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class TeleGPSConfigUI
extends AltosUIDialog
import javax.swing.*;
import java.io.*;
import java.text.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class TeleGPSDisplayThread extends Thread {
}
public synchronized void notice(boolean spoken) {
- if (old_state != null && old_state.state != state.state) {
+ if (old_state != null && old_state.state() != state.state()) {
report_time = now();
this.notify();
} else if (spoken)
import java.io.*;
import java.util.concurrent.*;
import java.util.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class TeleGPSInfo extends AltosUIFlightTab {
import java.beans.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altosuilib_9.*;
public class TeleGPSPreferences
extends AltosUIConfigure
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class TeleGPSState extends AltosUIFlightTab {
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_8.*;
-import org.altusmetrum.altosuilib_8.*;
+import org.altusmetrum.altoslib_9.*;
+import org.altusmetrum.altosuilib_9.*;
public class TeleGPSStatus extends JComponent implements AltosFlightDisplay {
GridBagLayout layout;
package org.altusmetrum.telegps;
import java.awt.event.*;
-import org.altusmetrum.altoslib_8.*;
+import org.altusmetrum.altoslib_9.*;
public class TeleGPSStatusUpdate implements ActionListener {