diff options
454 files changed, 15232 insertions, 14190 deletions
@@ -1,3 +1,808 @@ +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> diff --git a/Makefile.am b/Makefile.am index 1af40358..e4b9664b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -39,6 +39,7 @@ fat_windows = \  	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: @@ -5,6 +5,8 @@ These are Bdale's notes on how to do a release.  	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 \ @@ -19,8 +21,6 @@ These are Bdale's notes on how to do a release.  		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 diff --git a/altosdroid/res/layout/map_preload.xml b/altosdroid/res/layout/map_preload.xml index dc613bf2..e8b0f26c 100644 --- a/altosdroid/res/layout/map_preload.xml +++ b/altosdroid/res/layout/map_preload.xml @@ -45,7 +45,7 @@  		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" @@ -55,7 +55,7 @@  		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" diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java index 976e64bb..baf38fb7 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java @@ -30,7 +30,7 @@ import android.bluetooth.BluetoothSocket;  import android.os.Handler;  //import android.os.Message; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  public class AltosBluetooth extends AltosDroidLink { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java index db63d810..df348c9d 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java @@ -20,7 +20,7 @@ import java.util.Arrays;  import java.io.*;  import java.lang.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  import android.app.Activity;  import android.graphics.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index 3a07212a..b26a9bc8 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -49,7 +49,7 @@ import android.hardware.usb.*;  import android.graphics.*;  import android.graphics.drawable.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  public class AltosDroid extends FragmentActivity implements AltosUnitsListener { @@ -386,12 +386,12 @@ 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; @@ -408,9 +408,9 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener {  					}  				}  			} 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; @@ -448,8 +448,8 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener {  				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()); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java index 7cbba794..0e3511d3 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java @@ -24,7 +24,7 @@ import java.util.UUID;  import android.os.Handler; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  public abstract class AltosDroidLink extends AltosLink { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java index 5f6ff198..59f08c34 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java @@ -20,7 +20,7 @@ package org.altusmetrum.AltosDroid;  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); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java index a4e27006..02defbcb 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosDroid;  import android.content.Context; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  public class AltosDroidPreferences extends AltosPreferences { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java index 2ff711f5..14e6ce73 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java @@ -24,7 +24,7 @@ import android.content.SharedPreferences;  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"; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java index 9d612a1e..792d0621 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java @@ -17,7 +17,7 @@  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; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java index eb059901..28752110 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java @@ -20,7 +20,7 @@ package org.altusmetrum.AltosDroid;  import java.util.*;  import java.io.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  import android.app.Activity;  import android.graphics.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java index 4ac95c0b..10327091 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java @@ -19,7 +19,7 @@ package org.altusmetrum.AltosDroid;  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.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java index b7eb76a5..12055dc5 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java @@ -28,7 +28,7 @@ import android.hardware.usb.*;  import android.app.*;  import android.os.Handler; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  public class AltosUsb extends AltosDroidLink { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java index 325b89d2..bdc80003 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java @@ -22,7 +22,7 @@ import android.speech.tts.TextToSpeech;  import android.speech.tts.TextToSpeech.OnInitListener;  import android.location.Location; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  public class AltosVoice { @@ -186,9 +186,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())); @@ -211,7 +211,7 @@ public class AltosVoice {  		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(); @@ -312,7 +312,7 @@ public class AltosVoice {  			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; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java index 8846e56c..e1677ce6 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java @@ -34,7 +34,7 @@ import android.view.View.OnClickListener;  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; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java index d7462089..e6ce3809 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java @@ -41,7 +41,7 @@ import android.location.LocationManager;  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 diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java index a503f1bc..095d6b33 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  import android.app.Activity;  import android.os.Bundle; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java index 54ccd18f..3c236d58 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java @@ -20,7 +20,7 @@ package org.altusmetrum.AltosDroid;  import java.util.*;  import java.io.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  import android.app.Activity;  import android.graphics.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index 4d04316f..f5fbaf61 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  import android.app.Activity;  import android.os.Bundle; @@ -191,9 +191,9 @@ public class TabPad extends AltosDroidTab {  			}  			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"); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java index 19bb79d3..ee82d391 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  import android.app.Activity;  import android.os.Bundle; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java index 79020c16..6f595817 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java @@ -1,6 +1,6 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  import android.content.BroadcastReceiver;  import android.content.Context; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 3199f252..473a4bfb 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -25,7 +25,7 @@ import java.util.*;  import java.util.concurrent.*;  import android.os.Handler; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  public class TelemetryReader extends Thread { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java index 4a056d95..92a7ecfa 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -43,7 +43,7 @@ import android.location.LocationManager;  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 { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java index f9191a32..c81dfcd2 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java @@ -18,7 +18,7 @@  package org.altusmetrum.AltosDroid;  import java.util.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  import android.location.Location;  public class TelemetryState { diff --git a/altoslib/AltosAccel.java b/altoslib/AltosAccel.java index e4e7df90..e12b6375 100644 --- a/altoslib/AltosAccel.java +++ b/altoslib/AltosAccel.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; diff --git a/altoslib/AltosCRCException.java b/altoslib/AltosCRCException.java index eaff0808..d2337512 100644 --- a/altoslib/AltosCRCException.java +++ b/altoslib/AltosCRCException.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosCSV.java b/altoslib/AltosCSV.java index edb23e69..8a389812 100644 --- a/altoslib/AltosCSV.java +++ b/altoslib/AltosCSV.java @@ -15,7 +15,7 @@   * 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.*; @@ -129,7 +129,7 @@ public class AltosCSV implements AltosWriter {  	}  	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() { @@ -326,14 +326,14 @@ public class AltosCSV implements AltosWriter {  	}  	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(); @@ -368,7 +368,7 @@ public class AltosCSV implements AltosWriter {  		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; diff --git a/altoslib/AltosCompanion.java b/altoslib/AltosCompanion.java index 86b23eb6..87e701cf 100644 --- a/altoslib/AltosCompanion.java +++ b/altoslib/AltosCompanion.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index 8e052934..7a518ab4 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosConfigDataException.java b/altoslib/AltosConfigDataException.java index da11336d..d1d0d8d0 100644 --- a/altoslib/AltosConfigDataException.java +++ b/altoslib/AltosConfigDataException.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java index f8a2fb14..3306aa4b 100644 --- a/altoslib/AltosConfigValues.java +++ b/altoslib/AltosConfigValues.java @@ -15,7 +15,7 @@   * 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 */ diff --git a/altoslib/AltosConvert.java b/altoslib/AltosConvert.java index fd2f5750..59092a6f 100644 --- a/altoslib/AltosConvert.java +++ b/altoslib/AltosConvert.java @@ -18,7 +18,7 @@  /*   * Sensor data conversion functions   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  public class AltosConvert {  	/* diff --git a/altoslib/AltosDebug.java b/altoslib/AltosDebug.java index 16dcf6f5..35f51dd4 100644 --- a/altoslib/AltosDebug.java +++ b/altoslib/AltosDebug.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; diff --git a/altoslib/AltosDistance.java b/altoslib/AltosDistance.java index a05fb7e2..fe18250e 100644 --- a/altoslib/AltosDistance.java +++ b/altoslib/AltosDistance.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosEeprom.java b/altoslib/AltosEeprom.java index 194b10e8..7379b510 100644 --- a/altoslib/AltosEeprom.java +++ b/altoslib/AltosEeprom.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromChunk.java b/altoslib/AltosEepromChunk.java index 9174c6a9..b996eb00 100644 --- a/altoslib/AltosEepromChunk.java +++ b/altoslib/AltosEepromChunk.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java index baaeb993..67f7fc57 100644 --- a/altoslib/AltosEepromDownload.java +++ b/altoslib/AltosEepromDownload.java @@ -15,7 +15,7 @@   * 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.*; @@ -35,7 +35,7 @@ public class AltosEepromDownload implements Runnable {  	AltosEepromList		flights;  	boolean			success; -	ParseException		parse_exception; +	String			parse_errors;  	AltosState		state;  	private void FlushPending() throws IOException { @@ -88,6 +88,13 @@ public class AltosEepromDownload implements Runnable {  		}  	} +	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; @@ -98,7 +105,14 @@ public class AltosEepromDownload implements Runnable {  		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; @@ -111,12 +125,12 @@ public class AltosEepromDownload implements Runnable {  				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;  			} @@ -147,7 +161,6 @@ public class AltosEepromDownload implements Runnable {  		/* Reset per-capture variables */  		want_file = false; -		eeprom_file = null;  		eeprom_pending = new LinkedList<String>();  		/* Set serial number in the monitor dialog window */ @@ -174,21 +187,17 @@ public class AltosEepromDownload implements Runnable {  			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 () { @@ -198,20 +207,25 @@ public class AltosEepromDownload implements Runnable {  				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);  				} diff --git a/altoslib/AltosEepromFile.java b/altoslib/AltosEepromFile.java index 33d4f63b..d88aeab9 100644 --- a/altoslib/AltosEepromFile.java +++ b/altoslib/AltosEepromFile.java @@ -15,7 +15,7 @@   * 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.*; @@ -72,7 +72,7 @@ public class AltosEepromFile extends AltosStateIterable {  		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) { @@ -117,7 +117,7 @@ public class AltosEepromFile extends AltosStateIterable {  		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;  			} diff --git a/altoslib/AltosEepromGPS.java b/altoslib/AltosEepromGPS.java index aeb61661..07ef2920 100644 --- a/altoslib/AltosEepromGPS.java +++ b/altoslib/AltosEepromGPS.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromHeader.java b/altoslib/AltosEepromHeader.java index 95ecc32c..e7ed93b0 100644 --- a/altoslib/AltosEepromHeader.java +++ b/altoslib/AltosEepromHeader.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromIterable.java b/altoslib/AltosEepromIterable.java index c3cd5d86..f607fbd2 100644 --- a/altoslib/AltosEepromIterable.java +++ b/altoslib/AltosEepromIterable.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromList.java b/altoslib/AltosEepromList.java index 6dc6a3d6..12d10b6e 100644 --- a/altoslib/AltosEepromList.java +++ b/altoslib/AltosEepromList.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromLog.java b/altoslib/AltosEepromLog.java index 538c102b..d1a1ab6c 100644 --- a/altoslib/AltosEepromLog.java +++ b/altoslib/AltosEepromLog.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromMega.java b/altoslib/AltosEepromMega.java index d5f0e0e0..db8ab3a8 100644 --- a/altoslib/AltosEepromMega.java +++ b/altoslib/AltosEepromMega.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromMetrum2.java b/altoslib/AltosEepromMetrum2.java index 1b4cb04a..df0075b9 100644 --- a/altoslib/AltosEepromMetrum2.java +++ b/altoslib/AltosEepromMetrum2.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromMini.java b/altoslib/AltosEepromMini.java index 8d0343b8..228145eb 100644 --- a/altoslib/AltosEepromMini.java +++ b/altoslib/AltosEepromMini.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromMonitor.java b/altoslib/AltosEepromMonitor.java index 1c1d1010..800dc0b9 100644 --- a/altoslib/AltosEepromMonitor.java +++ b/altoslib/AltosEepromMonitor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  public interface AltosEepromMonitor { diff --git a/altoslib/AltosEepromTM.java b/altoslib/AltosEepromTM.java index 44b98e49..316058e2 100644 --- a/altoslib/AltosEepromTM.java +++ b/altoslib/AltosEepromTM.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosEepromTm.java b/altoslib/AltosEepromTm.java index 0a37a2aa..090b65e3 100644 --- a/altoslib/AltosEepromTm.java +++ b/altoslib/AltosEepromTm.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosFile.java b/altoslib/AltosFile.java index cab38d6d..b8d62179 100644 --- a/altoslib/AltosFile.java +++ b/altoslib/AltosFile.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosFlash.java b/altoslib/AltosFlash.java index e4b980b0..627b758b 100644 --- a/altoslib/AltosFlash.java +++ b/altoslib/AltosFlash.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; diff --git a/altoslib/AltosFlashListener.java b/altoslib/AltosFlashListener.java index 6a7351f3..e977c579 100644 --- a/altoslib/AltosFlashListener.java +++ b/altoslib/AltosFlashListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altoslib/AltosFlightDisplay.java b/altoslib/AltosFlightDisplay.java index 33d71fc3..912f470f 100644 --- a/altoslib/AltosFlightDisplay.java +++ b/altoslib/AltosFlightDisplay.java @@ -15,7 +15,7 @@   * 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(); diff --git a/altoslib/AltosFlightReader.java b/altoslib/AltosFlightReader.java index fca0f20b..84b2392b 100644 --- a/altoslib/AltosFlightReader.java +++ b/altoslib/AltosFlightReader.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosFlightStats.java b/altoslib/AltosFlightStats.java index b837ba84..39e8cdae 100644 --- a/altoslib/AltosFlightStats.java +++ b/altoslib/AltosFlightStats.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; @@ -52,7 +52,7 @@ public class AltosFlightStats {  		for (AltosState s : states) {  			state = s; -			if (state.state == AltosLib.ao_flight_landed) +			if (state.state() == AltosLib.ao_flight_landed)  				break;  		} @@ -92,7 +92,7 @@ public class AltosFlightStats {  			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) @@ -138,7 +138,7 @@ public class AltosFlightStats {  			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) diff --git a/altoslib/AltosFontListener.java b/altoslib/AltosFontListener.java index 78049350..ae23e13c 100644 --- a/altoslib/AltosFontListener.java +++ b/altoslib/AltosFontListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altoslib/AltosFrequency.java b/altoslib/AltosFrequency.java index 6d2bb8d0..7c6ffe61 100644 --- a/altoslib/AltosFrequency.java +++ b/altoslib/AltosFrequency.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosGPS.java b/altoslib/AltosGPS.java index a2584e77..a4cd2061 100644 --- a/altoslib/AltosGPS.java +++ b/altoslib/AltosGPS.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosGPSSat.java b/altoslib/AltosGPSSat.java index 44782003..3f9e479e 100644 --- a/altoslib/AltosGPSSat.java +++ b/altoslib/AltosGPSSat.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosGreatCircle.java b/altoslib/AltosGreatCircle.java index e13eca48..9ced17e7 100644 --- a/altoslib/AltosGreatCircle.java +++ b/altoslib/AltosGreatCircle.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosHeight.java b/altoslib/AltosHeight.java index bc20ef24..5cc3c20c 100644 --- a/altoslib/AltosHeight.java +++ b/altoslib/AltosHeight.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosHexfile.java b/altoslib/AltosHexfile.java index ece822d8..fb036d0c 100644 --- a/altoslib/AltosHexfile.java +++ b/altoslib/AltosHexfile.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosHexsym.java b/altoslib/AltosHexsym.java index e1561c7d..0149fde1 100644 --- a/altoslib/AltosHexsym.java +++ b/altoslib/AltosHexsym.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosIMU.java b/altoslib/AltosIMU.java index 7a4a705d..285de8cc 100644 --- a/altoslib/AltosIMU.java +++ b/altoslib/AltosIMU.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosIdle.java b/altoslib/AltosIdle.java index 0e2576cd..2e5981db 100644 --- a/altoslib/AltosIdle.java +++ b/altoslib/AltosIdle.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosIdleFetch.java b/altoslib/AltosIdleFetch.java index 6c0d130b..48db6ab4 100644 --- a/altoslib/AltosIdleFetch.java +++ b/altoslib/AltosIdleFetch.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosIdleMonitor.java b/altoslib/AltosIdleMonitor.java index 1b62f385..d5c1a428 100644 --- a/altoslib/AltosIdleMonitor.java +++ b/altoslib/AltosIdleMonitor.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosIdleMonitorListener.java b/altoslib/AltosIdleMonitorListener.java index 1d06c4d9..5b751e52 100644 --- a/altoslib/AltosIdleMonitorListener.java +++ b/altoslib/AltosIdleMonitorListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altoslib/AltosIgnite.java b/altoslib/AltosIgnite.java index 39f792db..d5348628 100644 --- a/altoslib/AltosIgnite.java +++ b/altoslib/AltosIgnite.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosImage.java b/altoslib/AltosImage.java index fc0192a3..7a0fe9dd 100644 --- a/altoslib/AltosImage.java +++ b/altoslib/AltosImage.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; diff --git a/altoslib/AltosKML.java b/altoslib/AltosKML.java index 81433958..d302535f 100644 --- a/altoslib/AltosKML.java +++ b/altoslib/AltosKML.java @@ -15,7 +15,7 @@   * 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.*; @@ -112,8 +112,8 @@ public class AltosKML implements AltosWriter {  	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); @@ -171,8 +171,8 @@ public class AltosKML implements AltosWriter {  		}  		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); diff --git a/altoslib/AltosLatLon.java b/altoslib/AltosLatLon.java index e438a787..8cd851e5 100644 --- a/altoslib/AltosLatLon.java +++ b/altoslib/AltosLatLon.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosLatitude.java b/altoslib/AltosLatitude.java index 7091ce9c..51d77785 100644 --- a/altoslib/AltosLatitude.java +++ b/altoslib/AltosLatitude.java @@ -15,7 +15,7 @@   * 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"; } diff --git a/altoslib/AltosLaunchSite.java b/altoslib/AltosLaunchSite.java index 0fa9bbd4..7958d186 100644 --- a/altoslib/AltosLaunchSite.java +++ b/altoslib/AltosLaunchSite.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosLaunchSiteListener.java b/altoslib/AltosLaunchSiteListener.java index f4658660..4270dc4a 100644 --- a/altoslib/AltosLaunchSiteListener.java +++ b/altoslib/AltosLaunchSiteListener.java @@ -14,7 +14,7 @@   * 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.*; diff --git a/altoslib/AltosLaunchSites.java b/altoslib/AltosLaunchSites.java index fa4026ba..4e843c10 100644 --- a/altoslib/AltosLaunchSites.java +++ b/altoslib/AltosLaunchSites.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java index e82b1c73..575cfc1a 100644 --- a/altoslib/AltosLib.java +++ b/altoslib/AltosLib.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosLine.java b/altoslib/AltosLine.java index b18aa965..cf3a1984 100644 --- a/altoslib/AltosLine.java +++ b/altoslib/AltosLine.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java index f8bf4702..10967417 100644 --- a/altoslib/AltosLink.java +++ b/altoslib/AltosLink.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosListenerState.java b/altoslib/AltosListenerState.java index 9d7922d5..7df5c9bf 100644 --- a/altoslib/AltosListenerState.java +++ b/altoslib/AltosListenerState.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; diff --git a/altoslib/AltosLocation.java b/altoslib/AltosLocation.java index 231cd94b..436e4b02 100644 --- a/altoslib/AltosLocation.java +++ b/altoslib/AltosLocation.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosLog.java b/altoslib/AltosLog.java index b89bac38..58306d55 100644 --- a/altoslib/AltosLog.java +++ b/altoslib/AltosLog.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosLongitude.java b/altoslib/AltosLongitude.java index e3e53282..bc088602 100644 --- a/altoslib/AltosLongitude.java +++ b/altoslib/AltosLongitude.java @@ -15,7 +15,7 @@   * 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"; } diff --git a/altoslib/AltosMag.java b/altoslib/AltosMag.java index 351125bf..3643ca9e 100644 --- a/altoslib/AltosMag.java +++ b/altoslib/AltosMag.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosMap.java b/altoslib/AltosMap.java index 8a3266c9..6c08f2d7 100644 --- a/altoslib/AltosMap.java +++ b/altoslib/AltosMap.java @@ -15,7 +15,7 @@   * 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.*; @@ -230,23 +230,23 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {  		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); diff --git a/altoslib/AltosMapCache.java b/altoslib/AltosMapCache.java index f0ad433c..744790c6 100644 --- a/altoslib/AltosMapCache.java +++ b/altoslib/AltosMapCache.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosMapCacheListener.java b/altoslib/AltosMapCacheListener.java index dec181bc..c0409630 100644 --- a/altoslib/AltosMapCacheListener.java +++ b/altoslib/AltosMapCacheListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altoslib/AltosMapInterface.java b/altoslib/AltosMapInterface.java index 45398ecd..0a59a808 100644 --- a/altoslib/AltosMapInterface.java +++ b/altoslib/AltosMapInterface.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosMapLine.java b/altoslib/AltosMapLine.java index 09ecb0c9..061f226e 100644 --- a/altoslib/AltosMapLine.java +++ b/altoslib/AltosMapLine.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosMapLoader.java b/altoslib/AltosMapLoader.java index 8573489a..9ed93a42 100644 --- a/altoslib/AltosMapLoader.java +++ b/altoslib/AltosMapLoader.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosMapLoaderListener.java b/altoslib/AltosMapLoaderListener.java index 0b41d9f4..798270cc 100644 --- a/altoslib/AltosMapLoaderListener.java +++ b/altoslib/AltosMapLoaderListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altoslib/AltosMapMark.java b/altoslib/AltosMapMark.java index cc28f438..e87c168d 100644 --- a/altoslib/AltosMapMark.java +++ b/altoslib/AltosMapMark.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosMapPath.java b/altoslib/AltosMapPath.java index 6967f479..64be49be 100644 --- a/altoslib/AltosMapPath.java +++ b/altoslib/AltosMapPath.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosMapPathPoint.java b/altoslib/AltosMapPathPoint.java index 0af98997..d500a7db 100644 --- a/altoslib/AltosMapPathPoint.java +++ b/altoslib/AltosMapPathPoint.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosMapRectangle.java b/altoslib/AltosMapRectangle.java index 9fdab1a0..9c116b82 100644 --- a/altoslib/AltosMapRectangle.java +++ b/altoslib/AltosMapRectangle.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosMapStore.java b/altoslib/AltosMapStore.java index b24fabc8..c0638433 100644 --- a/altoslib/AltosMapStore.java +++ b/altoslib/AltosMapStore.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosMapStoreListener.java b/altoslib/AltosMapStoreListener.java index cef4f926..8912caf7 100644 --- a/altoslib/AltosMapStoreListener.java +++ b/altoslib/AltosMapStoreListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altoslib/AltosMapTile.java b/altoslib/AltosMapTile.java index a6ba5da5..23ab64e4 100644 --- a/altoslib/AltosMapTile.java +++ b/altoslib/AltosMapTile.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosMapTileListener.java b/altoslib/AltosMapTileListener.java index c02483bb..83c1eaed 100644 --- a/altoslib/AltosMapTileListener.java +++ b/altoslib/AltosMapTileListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altoslib/AltosMapTransform.java b/altoslib/AltosMapTransform.java index b8f29107..ae78befa 100644 --- a/altoslib/AltosMapTransform.java +++ b/altoslib/AltosMapTransform.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosMapZoomListener.java b/altoslib/AltosMapZoomListener.java index aa067303..5067aaec 100644 --- a/altoslib/AltosMapZoomListener.java +++ b/altoslib/AltosMapZoomListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altoslib/AltosMma655x.java b/altoslib/AltosMma655x.java index 8b1ac088..17aaa3f8 100644 --- a/altoslib/AltosMma655x.java +++ b/altoslib/AltosMma655x.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.util.concurrent.*; diff --git a/altoslib/AltosMs5607.java b/altoslib/AltosMs5607.java index e7ca1ba3..aa16e231 100644 --- a/altoslib/AltosMs5607.java +++ b/altoslib/AltosMs5607.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosNoSymbol.java b/altoslib/AltosNoSymbol.java index 6ef2a142..51b48666 100644 --- a/altoslib/AltosNoSymbol.java +++ b/altoslib/AltosNoSymbol.java @@ -15,7 +15,7 @@   * 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) { diff --git a/altoslib/AltosOrient.java b/altoslib/AltosOrient.java index 1c2e2aab..a2d501b2 100644 --- a/altoslib/AltosOrient.java +++ b/altoslib/AltosOrient.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosParse.java b/altoslib/AltosParse.java index 8f624b96..18ef807b 100644 --- a/altoslib/AltosParse.java +++ b/altoslib/AltosParse.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosPointDouble.java b/altoslib/AltosPointDouble.java index ecfcbea7..a358ea66 100644 --- a/altoslib/AltosPointDouble.java +++ b/altoslib/AltosPointDouble.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosPointInt.java b/altoslib/AltosPointInt.java index e690aa43..5f9591cc 100644 --- a/altoslib/AltosPointInt.java +++ b/altoslib/AltosPointInt.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosPreferences.java b/altoslib/AltosPreferences.java index a1e76834..91cfc6b6 100644 --- a/altoslib/AltosPreferences.java +++ b/altoslib/AltosPreferences.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosPreferencesBackend.java b/altoslib/AltosPreferencesBackend.java index 3154a519..f43c2ec9 100644 --- a/altoslib/AltosPreferencesBackend.java +++ b/altoslib/AltosPreferencesBackend.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.File; diff --git a/altoslib/AltosProgrammer.java b/altoslib/AltosProgrammer.java index 74ab42b5..7f9b277d 100644 --- a/altoslib/AltosProgrammer.java +++ b/altoslib/AltosProgrammer.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; diff --git a/altoslib/AltosPyro.java b/altoslib/AltosPyro.java index 9b7e79f3..851e35fb 100644 --- a/altoslib/AltosPyro.java +++ b/altoslib/AltosPyro.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosQuaternion.java b/altoslib/AltosQuaternion.java index f78b5065..e96aa7db 100644 --- a/altoslib/AltosQuaternion.java +++ b/altoslib/AltosQuaternion.java @@ -15,7 +15,7 @@   * 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 */ diff --git a/altoslib/AltosRectangle.java b/altoslib/AltosRectangle.java index 1b1cc9f4..6933198a 100644 --- a/altoslib/AltosRectangle.java +++ b/altoslib/AltosRectangle.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosReplayReader.java b/altoslib/AltosReplayReader.java index 9419ec93..5dcb8702 100644 --- a/altoslib/AltosReplayReader.java +++ b/altoslib/AltosReplayReader.java @@ -15,7 +15,7 @@   * 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.*; @@ -39,7 +39,7 @@ public class AltosReplayReader extends AltosFlightReader {  	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());  	} diff --git a/altoslib/AltosRomconfig.java b/altoslib/AltosRomconfig.java index 28134aeb..9c6bb668 100644 --- a/altoslib/AltosRomconfig.java +++ b/altoslib/AltosRomconfig.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; diff --git a/altoslib/AltosRotation.java b/altoslib/AltosRotation.java index 9771c166..e3c4dd56 100644 --- a/altoslib/AltosRotation.java +++ b/altoslib/AltosRotation.java @@ -15,7 +15,7 @@   * 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; @@ -28,7 +28,7 @@ public class AltosRotation {  	}  	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();  	} diff --git a/altoslib/AltosSavedState.java b/altoslib/AltosSavedState.java index e2ca9f73..a5a69c95 100644 --- a/altoslib/AltosSavedState.java +++ b/altoslib/AltosSavedState.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; diff --git a/altoslib/AltosSelfFlash.java b/altoslib/AltosSelfFlash.java index e2988b56..3aa727b3 100644 --- a/altoslib/AltosSelfFlash.java +++ b/altoslib/AltosSelfFlash.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; diff --git a/altoslib/AltosSensorEMini.java b/altoslib/AltosSensorEMini.java index e8b7b044..825cbd5d 100644 --- a/altoslib/AltosSensorEMini.java +++ b/altoslib/AltosSensorEMini.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosSensorMM.java b/altoslib/AltosSensorMM.java index 9be29ae0..c0a92a18 100644 --- a/altoslib/AltosSensorMM.java +++ b/altoslib/AltosSensorMM.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosSensorMega.java b/altoslib/AltosSensorMega.java index 1f71302e..f38d7b44 100644 --- a/altoslib/AltosSensorMega.java +++ b/altoslib/AltosSensorMega.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosSensorMetrum.java b/altoslib/AltosSensorMetrum.java index c00e00d5..fbc10fdd 100644 --- a/altoslib/AltosSensorMetrum.java +++ b/altoslib/AltosSensorMetrum.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosSensorTGPS.java b/altoslib/AltosSensorTGPS.java index 64cce640..a2d22e9a 100644 --- a/altoslib/AltosSensorTGPS.java +++ b/altoslib/AltosSensorTGPS.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosSensorTM.java b/altoslib/AltosSensorTM.java index 4957b94d..e0449568 100644 --- a/altoslib/AltosSensorTM.java +++ b/altoslib/AltosSensorTM.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosSensorTMini.java b/altoslib/AltosSensorTMini.java index 9b2db2ff..74ecacd6 100644 --- a/altoslib/AltosSensorTMini.java +++ b/altoslib/AltosSensorTMini.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosSpeed.java b/altoslib/AltosSpeed.java index b9fca82b..45bd4c6a 100644 --- a/altoslib/AltosSpeed.java +++ b/altoslib/AltosSpeed.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index 4edae54a..523f5a70 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -19,7 +19,7 @@   * Track flight state from telemetry or eeprom data stream   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.io.*; @@ -284,7 +284,7 @@ public class AltosState implements Cloneable, Serializable {  		}  	} -	public int	state; +	private int	state;  	public int	flight;  	public int	serial;  	public int	altitude_32; @@ -1056,6 +1056,10 @@ public class AltosState implements Cloneable, Serializable {  		}  	} +	public int state() { +		return state; +	} +  	public void set_device_type(int device_type) {  		this.device_type = device_type;  		switch (device_type) { @@ -1358,11 +1362,6 @@ public class AltosState implements Cloneable, Serializable {  		}  	} -	public void make_companion (int nchannels) { -		if (companion == null) -			companion = new AltosCompanion(nchannels); -	} -  	public void set_companion(AltosCompanion companion) {  		this.companion = companion;  	} diff --git a/altoslib/AltosStateIterable.java b/altoslib/AltosStateIterable.java index 5533468b..13b8f4ca 100644 --- a/altoslib/AltosStateIterable.java +++ b/altoslib/AltosStateIterable.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosStateUpdate.java b/altoslib/AltosStateUpdate.java index ed2e1826..68212846 100644 --- a/altoslib/AltosStateUpdate.java +++ b/altoslib/AltosStateUpdate.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosTelemetry.java b/altoslib/AltosTelemetry.java index 4c973cd9..0ba9849a 100644 --- a/altoslib/AltosTelemetry.java +++ b/altoslib/AltosTelemetry.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.text.*; @@ -44,7 +44,7 @@ public abstract class AltosTelemetry implements AltosStateUpdate {  	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); diff --git a/altoslib/AltosTelemetryCompanion.java b/altoslib/AltosTelemetryCompanion.java new file mode 100644 index 00000000..c47f9486 --- /dev/null +++ b/altoslib/AltosTelemetryCompanion.java @@ -0,0 +1,54 @@ +/* + * 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); +	} +} diff --git a/altoslib/AltosTelemetryConfiguration.java b/altoslib/AltosTelemetryConfiguration.java index c4cd36b2..20381a53 100644 --- a/altoslib/AltosTelemetryConfiguration.java +++ b/altoslib/AltosTelemetryConfiguration.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosTelemetryFile.java b/altoslib/AltosTelemetryFile.java index d2275f54..a762f615 100644 --- a/altoslib/AltosTelemetryFile.java +++ b/altoslib/AltosTelemetryFile.java @@ -15,7 +15,7 @@   * 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.*; @@ -75,7 +75,7 @@ public class AltosTelemetryFile extends AltosStateIterable {  		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;  			} @@ -93,4 +93,4 @@ public class AltosTelemetryFile extends AltosStateIterable {  		}  		return new AltosTelemetryIterator(state, i);  	} -}
\ No newline at end of file +} diff --git a/altoslib/AltosTelemetryIterable.java b/altoslib/AltosTelemetryIterable.java index e18f7eda..b29881e8 100644 --- a/altoslib/AltosTelemetryIterable.java +++ b/altoslib/AltosTelemetryIterable.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosTelemetryLegacy.java b/altoslib/AltosTelemetryLegacy.java index f8e72c86..b3071a4b 100644 --- a/altoslib/AltosTelemetryLegacy.java +++ b/altoslib/AltosTelemetryLegacy.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.text.*; diff --git a/altoslib/AltosTelemetryLocation.java b/altoslib/AltosTelemetryLocation.java index 9341d003..6fbed4bc 100644 --- a/altoslib/AltosTelemetryLocation.java +++ b/altoslib/AltosTelemetryLocation.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosTelemetryMap.java b/altoslib/AltosTelemetryMap.java index d3242254..5aa0c41d 100644 --- a/altoslib/AltosTelemetryMap.java +++ b/altoslib/AltosTelemetryMap.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosTelemetryMegaData.java b/altoslib/AltosTelemetryMegaData.java index 2af8d931..49657051 100644 --- a/altoslib/AltosTelemetryMegaData.java +++ b/altoslib/AltosTelemetryMegaData.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosTelemetryMegaSensor.java b/altoslib/AltosTelemetryMegaSensor.java index 77a76cd7..2f6256fc 100644 --- a/altoslib/AltosTelemetryMegaSensor.java +++ b/altoslib/AltosTelemetryMegaSensor.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosTelemetryMetrumData.java b/altoslib/AltosTelemetryMetrumData.java index 17a3410a..4fbb9b86 100644 --- a/altoslib/AltosTelemetryMetrumData.java +++ b/altoslib/AltosTelemetryMetrumData.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosTelemetryMetrumSensor.java b/altoslib/AltosTelemetryMetrumSensor.java index 71fbd544..3769c129 100644 --- a/altoslib/AltosTelemetryMetrumSensor.java +++ b/altoslib/AltosTelemetryMetrumSensor.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosTelemetryMini.java b/altoslib/AltosTelemetryMini.java index c9fda5b8..173fac42 100644 --- a/altoslib/AltosTelemetryMini.java +++ b/altoslib/AltosTelemetryMini.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosTelemetryRaw.java b/altoslib/AltosTelemetryRaw.java index 843ca4eb..7fa12f5e 100644 --- a/altoslib/AltosTelemetryRaw.java +++ b/altoslib/AltosTelemetryRaw.java @@ -15,7 +15,7 @@   * 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) { diff --git a/altoslib/AltosTelemetryReader.java b/altoslib/AltosTelemetryReader.java index cbbdceff..2d76f281 100644 --- a/altoslib/AltosTelemetryReader.java +++ b/altoslib/AltosTelemetryReader.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altoslib/AltosTelemetrySatellite.java b/altoslib/AltosTelemetrySatellite.java index 2f4e3354..a3a8abfa 100644 --- a/altoslib/AltosTelemetrySatellite.java +++ b/altoslib/AltosTelemetrySatellite.java @@ -15,7 +15,7 @@   * 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; diff --git a/altoslib/AltosTelemetrySensor.java b/altoslib/AltosTelemetrySensor.java index 27cf22f0..578ac2da 100644 --- a/altoslib/AltosTelemetrySensor.java +++ b/altoslib/AltosTelemetrySensor.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosTelemetryStandard.java b/altoslib/AltosTelemetryStandard.java index 27561826..5a147b2b 100644 --- a/altoslib/AltosTelemetryStandard.java +++ b/altoslib/AltosTelemetryStandard.java @@ -15,7 +15,7 @@   * 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; @@ -68,11 +68,9 @@ public abstract class AltosTelemetryStandard extends AltosTelemetry {  		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; diff --git a/altoslib/AltosTemperature.java b/altoslib/AltosTemperature.java index b4d465a0..19e3393d 100644 --- a/altoslib/AltosTemperature.java +++ b/altoslib/AltosTemperature.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosUnits.java b/altoslib/AltosUnits.java index 6b4fff0c..c211eb6d 100644 --- a/altoslib/AltosUnits.java +++ b/altoslib/AltosUnits.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  import java.text.*; diff --git a/altoslib/AltosUnitsListener.java b/altoslib/AltosUnitsListener.java index 0e31492e..f71c4270 100644 --- a/altoslib/AltosUnitsListener.java +++ b/altoslib/AltosUnitsListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altoslib/AltosVersion.java.in b/altoslib/AltosVersion.java.in index 89ed400f..8c53ef0d 100644 --- a/altoslib/AltosVersion.java.in +++ b/altoslib/AltosVersion.java.in @@ -15,7 +15,7 @@   * 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@"; diff --git a/altoslib/AltosVoltage.java b/altoslib/AltosVoltage.java index fb6f41ee..34f4620e 100644 --- a/altoslib/AltosVoltage.java +++ b/altoslib/AltosVoltage.java @@ -15,7 +15,7 @@   * 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 { diff --git a/altoslib/AltosWriter.java b/altoslib/AltosWriter.java index 1dcd3391..b5cc34f0 100644 --- a/altoslib/AltosWriter.java +++ b/altoslib/AltosWriter.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9;  public interface AltosWriter { diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am index a6b178fa..d1f8f265 100644 --- a/altoslib/Makefile.am +++ b/altoslib/Makefile.am @@ -96,6 +96,7 @@ altoslib_JAVA = \  	AltosStateUpdate.java \  	AltosTelemetry.java \  	AltosTelemetryConfiguration.java \ +	AltosTelemetryCompanion.java \  	AltosTelemetryFile.java \  	AltosTelemetryIterable.java \  	AltosTelemetryLegacy.java \ diff --git a/altosui/Altos.java b/altosui/Altos.java index 4b3d17fe..aae2a793 100644 --- a/altosui/Altos.java +++ b/altosui/Altos.java @@ -20,8 +20,8 @@ package altosui;  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 { diff --git a/altosui/AltosAscent.java b/altosui/AltosAscent.java index 453246bc..2fed6e7c 100644 --- a/altosui/AltosAscent.java +++ b/altosui/AltosAscent.java @@ -21,8 +21,8 @@ import java.util.*;  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; diff --git a/altosui/AltosCompanionInfo.java b/altosui/AltosCompanionInfo.java index 28f26a62..f5080f56 100644 --- a/altosui/AltosCompanionInfo.java +++ b/altosui/AltosCompanionInfo.java @@ -19,8 +19,8 @@ package altosui;  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; diff --git a/altosui/AltosConfig.java b/altosui/AltosConfig.java index 39ed5ca4..50be7f8e 100644 --- a/altosui/AltosConfig.java +++ b/altosui/AltosConfig.java @@ -22,8 +22,8 @@ import javax.swing.*;  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 { diff --git a/altosui/AltosConfigPyroUI.java b/altosui/AltosConfigPyroUI.java index 50a25f00..4ad62405 100644 --- a/altosui/AltosConfigPyroUI.java +++ b/altosui/AltosConfigPyroUI.java @@ -22,8 +22,8 @@ import java.awt.*;  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 diff --git a/altosui/AltosConfigTD.java b/altosui/AltosConfigTD.java index 112ebbc6..3958a013 100644 --- a/altosui/AltosConfigTD.java +++ b/altosui/AltosConfigTD.java @@ -21,8 +21,8 @@ import java.awt.event.*;  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 { diff --git a/altosui/AltosConfigTDUI.java b/altosui/AltosConfigTDUI.java index 857ab64d..94416465 100644 --- a/altosui/AltosConfigTDUI.java +++ b/altosui/AltosConfigTDUI.java @@ -21,8 +21,8 @@ import java.awt.*;  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 diff --git a/altosui/AltosConfigUI.java b/altosui/AltosConfigUI.java index 76837b31..a4216212 100644 --- a/altosui/AltosConfigUI.java +++ b/altosui/AltosConfigUI.java @@ -22,8 +22,8 @@ import java.awt.event.*;  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 diff --git a/altosui/AltosConfigureUI.java b/altosui/AltosConfigureUI.java index fa815762..3d8bb754 100644 --- a/altosui/AltosConfigureUI.java +++ b/altosui/AltosConfigureUI.java @@ -22,7 +22,7 @@ import java.awt.event.*;  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 diff --git a/altosui/AltosDescent.java b/altosui/AltosDescent.java index f5b92816..9257f069 100644 --- a/altosui/AltosDescent.java +++ b/altosui/AltosDescent.java @@ -21,8 +21,8 @@ import java.util.*;  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 { diff --git a/altosui/AltosFlightStatus.java b/altosui/AltosFlightStatus.java index 815a6fa4..cffed41d 100644 --- a/altosui/AltosFlightStatus.java +++ b/altosui/AltosFlightStatus.java @@ -19,8 +19,8 @@ package altosui;  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; @@ -173,14 +173,14 @@ public class AltosFlightStatus extends JComponent implements AltosFlightDisplay  		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();  			}  		} diff --git a/altosui/AltosFlightStatusTableModel.java b/altosui/AltosFlightStatusTableModel.java index b5587a84..f8a643fe 100644 --- a/altosui/AltosFlightStatusTableModel.java +++ b/altosui/AltosFlightStatusTableModel.java @@ -27,7 +27,7 @@ import java.util.*;  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 = { diff --git a/altosui/AltosFlightStatusUpdate.java b/altosui/AltosFlightStatusUpdate.java index 9768c6d1..9fa813d2 100644 --- a/altosui/AltosFlightStatusUpdate.java +++ b/altosui/AltosFlightStatusUpdate.java @@ -18,7 +18,7 @@  package altosui;  import java.awt.event.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  public class AltosFlightStatusUpdate implements ActionListener { diff --git a/altosui/AltosFlightUI.java b/altosui/AltosFlightUI.java index db33e0d9..d7646a77 100644 --- a/altosui/AltosFlightUI.java +++ b/altosui/AltosFlightUI.java @@ -22,8 +22,8 @@ import java.awt.event.*;  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; @@ -53,13 +53,13 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {  	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;  	} @@ -102,7 +102,7 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {  		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); diff --git a/altosui/AltosGraphUI.java b/altosui/AltosGraphUI.java index 6e45a092..8e12f229 100644 --- a/altosui/AltosGraphUI.java +++ b/altosui/AltosGraphUI.java @@ -23,8 +23,8 @@ import java.util.ArrayList;  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; diff --git a/altosui/AltosIdleMonitorUI.java b/altosui/AltosIdleMonitorUI.java index d54b05c5..565ab1b1 100644 --- a/altosui/AltosIdleMonitorUI.java +++ b/altosui/AltosIdleMonitorUI.java @@ -24,8 +24,8 @@ import javax.swing.event.*;  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; diff --git a/altosui/AltosIgniteUI.java b/altosui/AltosIgniteUI.java index 14a2b606..01d58b5e 100644 --- a/altosui/AltosIgniteUI.java +++ b/altosui/AltosIgniteUI.java @@ -24,8 +24,8 @@ import java.io.*;  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 diff --git a/altosui/AltosIgnitor.java b/altosui/AltosIgnitor.java index 682afc5e..e0f9e921 100644 --- a/altosui/AltosIgnitor.java +++ b/altosui/AltosIgnitor.java @@ -20,8 +20,8 @@ package altosui;  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 { diff --git a/altosui/AltosLanded.java b/altosui/AltosLanded.java index c2997b29..423e0e23 100644 --- a/altosui/AltosLanded.java +++ b/altosui/AltosLanded.java @@ -21,8 +21,8 @@ import java.awt.*;  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 { diff --git a/altosui/AltosLaunch.java b/altosui/AltosLaunch.java index 6dc1ca02..da0dfd92 100644 --- a/altosui/AltosLaunch.java +++ b/altosui/AltosLaunch.java @@ -20,7 +20,7 @@ package altosui;  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; diff --git a/altosui/AltosLaunchUI.java b/altosui/AltosLaunchUI.java index 132001bf..e6bc7929 100644 --- a/altosui/AltosLaunchUI.java +++ b/altosui/AltosLaunchUI.java @@ -23,7 +23,7 @@ import javax.swing.*;  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) { diff --git a/altosui/AltosPad.java b/altosui/AltosPad.java index 2f87b681..f984e908 100644 --- a/altosui/AltosPad.java +++ b/altosui/AltosPad.java @@ -18,8 +18,8 @@  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 { @@ -49,10 +49,10 @@ 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"); @@ -121,8 +121,8 @@ public class AltosPad extends AltosUIFlightTab {  	}  	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)  		{ diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java index f6caa4ef..de6aa34c 100644 --- a/altosui/AltosUI.java +++ b/altosui/AltosUI.java @@ -22,8 +22,8 @@ import java.awt.event.*;  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(); @@ -539,7 +539,7 @@ public class AltosUI extends AltosUIFrame {  			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(), diff --git a/altosui/Makefile.am b/altosui/Makefile.am index e6de1d97..dce8420e 100644 --- a/altosui/Makefile.am +++ b/altosui/Makefile.am @@ -149,7 +149,7 @@ TEMPLATE_DOC=\  	$(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) diff --git a/altosui/altos-windows.nsi.in b/altosui/altos-windows.nsi.in index 2f22a4a3..c88b9e34 100644 --- a/altosui/altos-windows.nsi.in +++ b/altosui/altos-windows.nsi.in @@ -145,7 +145,7 @@ Section "Documentation"  	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" diff --git a/altosuilib/AltosBTDevice.java b/altosuilib/AltosBTDevice.java index 0d7d07c0..01421071 100644 --- a/altosuilib/AltosBTDevice.java +++ b/altosuilib/AltosBTDevice.java @@ -15,10 +15,10 @@   * 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 { diff --git a/altosuilib/AltosBTDeviceIterator.java b/altosuilib/AltosBTDeviceIterator.java index ca6c436e..b8c4c6cf 100644 --- a/altosuilib/AltosBTDeviceIterator.java +++ b/altosuilib/AltosBTDeviceIterator.java @@ -15,11 +15,11 @@   * 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; diff --git a/altosuilib/AltosBTKnown.java b/altosuilib/AltosBTKnown.java index 0d10fafd..e444d310 100644 --- a/altosuilib/AltosBTKnown.java +++ b/altosuilib/AltosBTKnown.java @@ -15,10 +15,10 @@   * 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>(); diff --git a/altosuilib/AltosBTManage.java b/altosuilib/AltosBTManage.java index 8a912c94..65744141 100644 --- a/altosuilib/AltosBTManage.java +++ b/altosuilib/AltosBTManage.java @@ -15,7 +15,7 @@   * 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.*; @@ -23,7 +23,7 @@ import javax.swing.*;  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; diff --git a/altosuilib/AltosCSVUI.java b/altosuilib/AltosCSVUI.java index 281a9081..d5796cb1 100644 --- a/altosuilib/AltosCSVUI.java +++ b/altosuilib/AltosCSVUI.java @@ -15,13 +15,13 @@   * 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 diff --git a/altosuilib/AltosConfigFreqUI.java b/altosuilib/AltosConfigFreqUI.java index 04d93f6e..ccfdc1a3 100644 --- a/altosuilib/AltosConfigFreqUI.java +++ b/altosuilib/AltosConfigFreqUI.java @@ -15,14 +15,14 @@   * 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; diff --git a/altosuilib/AltosDataChooser.java b/altosuilib/AltosDataChooser.java index d30aec3f..f7bc516b 100644 --- a/altosuilib/AltosDataChooser.java +++ b/altosuilib/AltosDataChooser.java @@ -15,12 +15,12 @@   * 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; diff --git a/altosuilib/AltosDevice.java b/altosuilib/AltosDevice.java index 64a99596..f78fc2d0 100644 --- a/altosuilib/AltosDevice.java +++ b/altosuilib/AltosDevice.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9;  import libaltosJNI.*; diff --git a/altosuilib/AltosDeviceDialog.java b/altosuilib/AltosDeviceDialog.java index a3c5d283..52083b60 100644 --- a/altosuilib/AltosDeviceDialog.java +++ b/altosuilib/AltosDeviceDialog.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altosuilib/AltosDeviceUIDialog.java b/altosuilib/AltosDeviceUIDialog.java index aa6d323f..908e74e7 100644 --- a/altosuilib/AltosDeviceUIDialog.java +++ b/altosuilib/AltosDeviceUIDialog.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altosuilib/AltosDisplayThread.java b/altosuilib/AltosDisplayThread.java index 73d85698..9aa31aa1 100644 --- a/altosuilib/AltosDisplayThread.java +++ b/altosuilib/AltosDisplayThread.java @@ -15,13 +15,13 @@   * 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 { @@ -78,7 +78,7 @@ 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 */ @@ -87,8 +87,8 @@ public class AltosDisplayThread extends Thread {  			}  			/* 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)  			{ @@ -99,7 +99,7 @@ public class AltosDisplayThread extends Thread {  					    (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; @@ -109,11 +109,11 @@ public class AltosDisplayThread extends Thread {  			 * 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"); @@ -124,10 +124,6 @@ public class AltosDisplayThread extends Thread {  						    (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(); -				}  			}  		} @@ -167,7 +163,7 @@ public class AltosDisplayThread 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) @@ -182,17 +178,17 @@ public class AltosDisplayThread extends Thread {  	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)); @@ -223,12 +219,14 @@ public class AltosDisplayThread extends Thread {  		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); diff --git a/altosuilib/AltosEepromDelete.java b/altosuilib/AltosEepromDelete.java index 7648382d..270b0494 100644 --- a/altosuilib/AltosEepromDelete.java +++ b/altosuilib/AltosEepromDelete.java @@ -15,13 +15,13 @@   * 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; diff --git a/altosuilib/AltosEepromManage.java b/altosuilib/AltosEepromManage.java index d97edd12..14cfb127 100644 --- a/altosuilib/AltosEepromManage.java +++ b/altosuilib/AltosEepromManage.java @@ -15,13 +15,13 @@   * 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 { diff --git a/altosuilib/AltosEepromMonitor.java b/altosuilib/AltosEepromMonitor.java index 28fa734d..41d447bc 100644 --- a/altosuilib/AltosEepromMonitor.java +++ b/altosuilib/AltosEepromMonitor.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altosuilib/AltosEepromMonitorUI.java b/altosuilib/AltosEepromMonitorUI.java index 5f0df7d3..0c8083cd 100644 --- a/altosuilib/AltosEepromMonitorUI.java +++ b/altosuilib/AltosEepromMonitorUI.java @@ -15,12 +15,12 @@   * 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; diff --git a/altosuilib/AltosEepromSelect.java b/altosuilib/AltosEepromSelect.java index 56b10ef0..e5c45ca1 100644 --- a/altosuilib/AltosEepromSelect.java +++ b/altosuilib/AltosEepromSelect.java @@ -15,13 +15,13 @@   * 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; diff --git a/altosuilib/AltosFlashUI.java b/altosuilib/AltosFlashUI.java index 0ab085cf..33d432c8 100644 --- a/altosuilib/AltosFlashUI.java +++ b/altosuilib/AltosFlashUI.java @@ -15,7 +15,7 @@   * 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.*; @@ -23,7 +23,7 @@ import javax.swing.*;  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 diff --git a/altosuilib/AltosFlightInfoTableModel.java b/altosuilib/AltosFlightInfoTableModel.java index e55004e4..912fc716 100644 --- a/altosuilib/AltosFlightInfoTableModel.java +++ b/altosuilib/AltosFlightInfoTableModel.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9;  import javax.swing.table.*; diff --git a/altosuilib/AltosFlightStatsTable.java b/altosuilib/AltosFlightStatsTable.java index 9c613365..c7461432 100644 --- a/altosuilib/AltosFlightStatsTable.java +++ b/altosuilib/AltosFlightStatsTable.java @@ -15,12 +15,12 @@   * 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; diff --git a/altosuilib/AltosGraph.java b/altosuilib/AltosGraph.java index be013d57..ceb730f9 100644 --- a/altosuilib/AltosGraph.java +++ b/altosuilib/AltosGraph.java @@ -15,14 +15,14 @@   * 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.*; diff --git a/altosuilib/AltosGraphDataPoint.java b/altosuilib/AltosGraphDataPoint.java index 30d436ae..6a38f446 100644 --- a/altosuilib/AltosGraphDataPoint.java +++ b/altosuilib/AltosGraphDataPoint.java @@ -15,9 +15,9 @@   * 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 { @@ -217,7 +217,7 @@ 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) { diff --git a/altosuilib/AltosGraphDataSet.java b/altosuilib/AltosGraphDataSet.java index 7902f407..d7d07c83 100644 --- a/altosuilib/AltosGraphDataSet.java +++ b/altosuilib/AltosGraphDataSet.java @@ -15,12 +15,12 @@   * 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; diff --git a/altosuilib/AltosInfoTable.java b/altosuilib/AltosInfoTable.java index d87c38e2..8e6558b1 100644 --- a/altosuilib/AltosInfoTable.java +++ b/altosuilib/AltosInfoTable.java @@ -15,13 +15,13 @@   * 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; diff --git a/altosuilib/AltosLed.java b/altosuilib/AltosLed.java index b47aa493..fbe6b4ed 100644 --- a/altosuilib/AltosLed.java +++ b/altosuilib/AltosLed.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9;  import javax.swing.*; diff --git a/altosuilib/AltosLights.java b/altosuilib/AltosLights.java index 8cbd1d10..6ab50549 100644 --- a/altosuilib/AltosLights.java +++ b/altosuilib/AltosLights.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altosuilib/AltosPositionListener.java b/altosuilib/AltosPositionListener.java index 0c900787..0c4fb373 100644 --- a/altosuilib/AltosPositionListener.java +++ b/altosuilib/AltosPositionListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altosuilib/AltosRomconfigUI.java b/altosuilib/AltosRomconfigUI.java index 257674dc..275070ee 100644 --- a/altosuilib/AltosRomconfigUI.java +++ b/altosuilib/AltosRomconfigUI.java @@ -15,12 +15,12 @@   * 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 diff --git a/altosuilib/AltosScanUI.java b/altosuilib/AltosScanUI.java index e2efd4b3..bc647e8f 100644 --- a/altosuilib/AltosScanUI.java +++ b/altosuilib/AltosScanUI.java @@ -15,7 +15,7 @@   * 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.*; @@ -25,7 +25,7 @@ import java.io.*;  import java.util.*;  import java.text.*;  import java.util.concurrent.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  class AltosScanResult {  	String		callsign; diff --git a/altosuilib/AltosSerial.java b/altosuilib/AltosSerial.java index ff8d900a..a91740c5 100644 --- a/altosuilib/AltosSerial.java +++ b/altosuilib/AltosSerial.java @@ -19,13 +19,13 @@   * 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.*;  /* diff --git a/altosuilib/AltosSerialInUseException.java b/altosuilib/AltosSerialInUseException.java index 2b198aec..d1083098 100644 --- a/altosuilib/AltosSerialInUseException.java +++ b/altosuilib/AltosSerialInUseException.java @@ -15,7 +15,7 @@   * 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; diff --git a/altosuilib/AltosUIAxis.java b/altosuilib/AltosUIAxis.java index 155e7ed6..b4024a17 100644 --- a/altosuilib/AltosUIAxis.java +++ b/altosuilib/AltosUIAxis.java @@ -15,14 +15,14 @@   * 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.*; diff --git a/altosuilib/AltosUIConfigure.java b/altosuilib/AltosUIConfigure.java index 146acda8..03967d19 100644 --- a/altosuilib/AltosUIConfigure.java +++ b/altosuilib/AltosUIConfigure.java @@ -15,14 +15,14 @@   * 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> { diff --git a/altosuilib/AltosUIDataMissing.java b/altosuilib/AltosUIDataMissing.java index 39b8f900..1a7e12bf 100644 --- a/altosuilib/AltosUIDataMissing.java +++ b/altosuilib/AltosUIDataMissing.java @@ -15,7 +15,7 @@   * 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; diff --git a/altosuilib/AltosUIDataPoint.java b/altosuilib/AltosUIDataPoint.java index 793fabfb..cf320265 100644 --- a/altosuilib/AltosUIDataPoint.java +++ b/altosuilib/AltosUIDataPoint.java @@ -15,7 +15,7 @@   * 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; diff --git a/altosuilib/AltosUIDataSet.java b/altosuilib/AltosUIDataSet.java index b7472000..29648dbf 100644 --- a/altosuilib/AltosUIDataSet.java +++ b/altosuilib/AltosUIDataSet.java @@ -15,7 +15,7 @@   * 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(); diff --git a/altosuilib/AltosUIDialog.java b/altosuilib/AltosUIDialog.java index cfbf2cd3..2d0bc3c9 100644 --- a/altosuilib/AltosUIDialog.java +++ b/altosuilib/AltosUIDialog.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altosuilib/AltosUIEnable.java b/altosuilib/AltosUIEnable.java index b4d8d81e..42a09acf 100644 --- a/altosuilib/AltosUIEnable.java +++ b/altosuilib/AltosUIEnable.java @@ -15,7 +15,7 @@   * 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.*; @@ -23,7 +23,7 @@ import javax.swing.*;  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.*; diff --git a/altosuilib/AltosUIFlightTab.java b/altosuilib/AltosUIFlightTab.java index a2a3e367..0db1e5da 100644 --- a/altosuilib/AltosUIFlightTab.java +++ b/altosuilib/AltosUIFlightTab.java @@ -15,13 +15,13 @@   * 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; diff --git a/altosuilib/AltosUIFrame.java b/altosuilib/AltosUIFrame.java index 79015103..b82f07f7 100644 --- a/altosuilib/AltosUIFrame.java +++ b/altosuilib/AltosUIFrame.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altosuilib/AltosUIFreqList.java b/altosuilib/AltosUIFreqList.java index 9479087e..e0e2ede7 100644 --- a/altosuilib/AltosUIFreqList.java +++ b/altosuilib/AltosUIFreqList.java @@ -15,10 +15,10 @@   * 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> { diff --git a/altosuilib/AltosUIGraph.java b/altosuilib/AltosUIGraph.java index a11978d0..9a669e32 100644 --- a/altosuilib/AltosUIGraph.java +++ b/altosuilib/AltosUIGraph.java @@ -15,14 +15,14 @@   * 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.*; diff --git a/altosuilib/AltosUIGrapher.java b/altosuilib/AltosUIGrapher.java index 0fe685ef..0df5c1a7 100644 --- a/altosuilib/AltosUIGrapher.java +++ b/altosuilib/AltosUIGrapher.java @@ -15,14 +15,14 @@   * 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.*; diff --git a/altosuilib/AltosUIImage.java b/altosuilib/AltosUIImage.java index 77743741..8c09b2e7 100644 --- a/altosuilib/AltosUIImage.java +++ b/altosuilib/AltosUIImage.java @@ -15,7 +15,7 @@   * 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; diff --git a/altosuilib/AltosUIIndicator.java b/altosuilib/AltosUIIndicator.java index 0a940d97..9bac992b 100644 --- a/altosuilib/AltosUIIndicator.java +++ b/altosuilib/AltosUIIndicator.java @@ -15,11 +15,11 @@   * 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; diff --git a/altosuilib/AltosUILib.java b/altosuilib/AltosUILib.java index 2fc20317..1f1ad23b 100644 --- a/altosuilib/AltosUILib.java +++ b/altosuilib/AltosUILib.java @@ -15,12 +15,12 @@   * 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 { diff --git a/altosuilib/AltosUIListener.java b/altosuilib/AltosUIListener.java index 5b49e7da..8f758300 100644 --- a/altosuilib/AltosUIListener.java +++ b/altosuilib/AltosUIListener.java @@ -15,7 +15,7 @@   * 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); diff --git a/altosuilib/AltosUIMapNew.java b/altosuilib/AltosUIMapNew.java index 016a202b..8de6bea2 100644 --- a/altosuilib/AltosUIMapNew.java +++ b/altosuilib/AltosUIMapNew.java @@ -15,7 +15,7 @@   * 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.*; @@ -27,7 +27,7 @@ import java.awt.geom.*;  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 { diff --git a/altosuilib/AltosUIMapPreloadNew.java b/altosuilib/AltosUIMapPreloadNew.java index 2d4d45b2..c1c3f8bb 100644 --- a/altosuilib/AltosUIMapPreloadNew.java +++ b/altosuilib/AltosUIMapPreloadNew.java @@ -15,7 +15,7 @@   * 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.*; @@ -26,7 +26,7 @@ import java.text.*;  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; diff --git a/altosuilib/AltosUIMarker.java b/altosuilib/AltosUIMarker.java index ec5aae78..7c5a91b0 100644 --- a/altosuilib/AltosUIMarker.java +++ b/altosuilib/AltosUIMarker.java @@ -15,14 +15,14 @@   * 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.*; diff --git a/altosuilib/AltosUIPreferences.java b/altosuilib/AltosUIPreferences.java index 5602dc17..83099fa5 100644 --- a/altosuilib/AltosUIPreferences.java +++ b/altosuilib/AltosUIPreferences.java @@ -15,13 +15,13 @@   * 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 { diff --git a/altosuilib/AltosUIPreferencesBackend.java b/altosuilib/AltosUIPreferencesBackend.java index ebdc8b77..6d7aa88b 100644 --- a/altosuilib/AltosUIPreferencesBackend.java +++ b/altosuilib/AltosUIPreferencesBackend.java @@ -15,11 +15,11 @@   * 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 { diff --git a/altosuilib/AltosUIRateList.java b/altosuilib/AltosUIRateList.java index a8898808..8407f31d 100644 --- a/altosuilib/AltosUIRateList.java +++ b/altosuilib/AltosUIRateList.java @@ -15,10 +15,10 @@   * 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> { diff --git a/altosuilib/AltosUISeries.java b/altosuilib/AltosUISeries.java index d4421ac7..e2d19e47 100644 --- a/altosuilib/AltosUISeries.java +++ b/altosuilib/AltosUISeries.java @@ -15,14 +15,14 @@   * 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.*; diff --git a/altosuilib/AltosUITelemetryList.java b/altosuilib/AltosUITelemetryList.java index edbc7fd6..fbbd7c06 100644 --- a/altosuilib/AltosUITelemetryList.java +++ b/altosuilib/AltosUITelemetryList.java @@ -15,11 +15,11 @@   * 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> { diff --git a/altosuilib/AltosUIUnitsIndicator.java b/altosuilib/AltosUIUnitsIndicator.java index b58cd1cc..61e04b34 100644 --- a/altosuilib/AltosUIUnitsIndicator.java +++ b/altosuilib/AltosUIUnitsIndicator.java @@ -15,11 +15,11 @@   * 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 { diff --git a/altosuilib/AltosUIVoltageIndicator.java b/altosuilib/AltosUIVoltageIndicator.java index 12649730..779098ce 100644 --- a/altosuilib/AltosUIVoltageIndicator.java +++ b/altosuilib/AltosUIVoltageIndicator.java @@ -15,11 +15,11 @@   * 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 { diff --git a/altosuilib/AltosUSBDevice.java b/altosuilib/AltosUSBDevice.java index 74306523..6da50deb 100644 --- a/altosuilib/AltosUSBDevice.java +++ b/altosuilib/AltosUSBDevice.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altosuilib/AltosVoice.java b/altosuilib/AltosVoice.java index 71a05a23..e68c6d8b 100644 --- a/altosuilib/AltosVoice.java +++ b/altosuilib/AltosVoice.java @@ -15,7 +15,7 @@   * 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; diff --git a/altosuilib/GrabNDrag.java b/altosuilib/GrabNDrag.java index 919289c7..d9f0c7fd 100644 --- a/altosuilib/GrabNDrag.java +++ b/altosuilib/GrabNDrag.java @@ -15,7 +15,7 @@   * 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.*; diff --git a/altosuilib/OSXAdapter.java b/altosuilib/OSXAdapter.java index 5155b0fe..69cc3a55 100755 --- a/altosuilib/OSXAdapter.java +++ b/altosuilib/OSXAdapter.java @@ -55,7 +55,7 @@ Copyright © 2003-2007 Apple, Inc., All Rights Reserved  */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9;  import java.lang.reflect.*;  import java.util.HashMap; diff --git a/ao-bringup/test-telemega b/ao-bringup/test-telemega index 2e497886..b801b20c 100755 --- a/ao-bringup/test-telemega +++ b/ao-bringup/test-telemega @@ -1,6 +1,6 @@  #!/bin/sh -VERSION=1.0 +VERSION=2.0  PRODUCT=TeleMega  BASE=`echo $PRODUCT | tr 'A-Z' 'a-z'` diff --git a/ao-bringup/test-telemega-v1.0 b/ao-bringup/test-telemega-v1.0 new file mode 100755 index 00000000..2e497886 --- /dev/null +++ b/ao-bringup/test-telemega-v1.0 @@ -0,0 +1,66 @@ +#!/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 diff --git a/ao-bringup/turnon_telemega b/ao-bringup/turnon_telemega index 7b95bf20..62f51fba 100755 --- a/ao-bringup/turnon_telemega +++ b/ao-bringup/turnon_telemega @@ -14,7 +14,7 @@ else  	exit 1  fi -VERSION=1.0 +VERSION=2.0  REPO=~/altusmetrumllc/Binaries  echo "TeleMega v$VERSION Turn-On and Calibration Program" diff --git a/ao-bringup/turnon_telemega_v1.0 b/ao-bringup/turnon_telemega_v1.0 new file mode 100755 index 00000000..7b95bf20 --- /dev/null +++ b/ao-bringup/turnon_telemega_v1.0 @@ -0,0 +1,63 @@ +#!/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 $? diff --git a/ao-tools/ao-dbg/ao-dbg-main.c b/ao-tools/ao-dbg/ao-dbg-main.c index 25eca54b..8c879035 100644 --- a/ao-tools/ao-dbg/ao-dbg-main.c +++ b/ao-tools/ao-dbg/ao-dbg-main.c @@ -66,7 +66,6 @@ main(int argc, char **argv)  {  	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) { @@ -169,22 +168,16 @@ main(int argc, char **argv)  				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); diff --git a/ao-tools/ao-telem/ao-telem.c b/ao-tools/ao-telem/ao-telem.c index da873838..05a69542 100644 --- a/ao-tools/ao-telem/ao-telem.c +++ b/ao-tools/ao-telem/ao-telem.c @@ -173,6 +173,15 @@ main (int argc, char **argv)  						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, @@ -182,7 +191,7 @@ main (int argc, char **argv)  						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, diff --git a/configure.ac b/configure.ac index bbf82377..addaad0c 100644 --- a/configure.ac +++ b/configure.ac @@ -18,8 +18,8 @@ dnl  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 @@ -31,8 +31,8 @@ AC_SUBST(ANDROID_VERSION)  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]) diff --git a/debian/control b/debian/control index 7fa2029d..426fb777 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,8 @@ Section: electronics  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), diff --git a/doc/.gitignore b/doc/.gitignore index 73fe56e6..786123a3 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -1,4 +1,6 @@  *.html  *.pdf  *.fo +*.raw  titlepage.templates.xsl +fop-cfg.xml diff --git a/doc/Makefile b/doc/Makefile index 9c6189b4..6a04a591 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,26 +2,28 @@  #	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 \ @@ -30,12 +32,17 @@ PICTURES=\  	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 \ @@ -46,6 +53,7 @@ PICTURES=\  	micropeak-download.png \  	micropeak-graph-configure.png \  	micropeak-graph.png \ +	micropeak-nofont.svg \  	micropeak-preferences.png \  	micropeak-raw-data.png \  	micropeak-save-dialog.png \ @@ -56,10 +64,105 @@ PICTURES=\  	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 \ @@ -68,56 +171,116 @@ 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) > $@ diff --git a/doc/RELNOTES b/doc/RELNOTES new file mode 100644 index 00000000..8f7d2540 --- /dev/null +++ b/doc/RELNOTES @@ -0,0 +1,34 @@ +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 diff --git a/doc/altos-docinfo.xml b/doc/altos-docinfo.xml new file mode 100644 index 00000000..b9193a8f --- /dev/null +++ b/doc/altos-docinfo.xml @@ -0,0 +1,33 @@ +<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> diff --git a/doc/altos.txt b/doc/altos.txt new file mode 100644 index 00000000..f2b1ee59 --- /dev/null +++ b/doc/altos.txt @@ -0,0 +1,1400 @@ += 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. diff --git a/doc/altos.xsl b/doc/altos.xsl deleted file mode 100644 index 6092dfcb..00000000 --- a/doc/altos.xsl +++ /dev/null @@ -1,1612 +0,0 @@ -<?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> diff --git a/doc/altosdroid.inc b/doc/altosdroid.inc new file mode 100644 index 00000000..cdf7b96d --- /dev/null +++ b/doc/altosdroid.inc @@ -0,0 +1,369 @@ +== 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. diff --git a/doc/altosui.inc b/doc/altosui.inc new file mode 100644 index 00000000..76a24d91 --- /dev/null +++ b/doc/altosui.inc @@ -0,0 +1,682 @@ +== 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[] diff --git a/doc/altusmetrum-docinfo.xml b/doc/altusmetrum-docinfo.xml new file mode 100644 index 00000000..63c1e035 --- /dev/null +++ b/doc/altusmetrum-docinfo.xml @@ -0,0 +1,184 @@ +<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> diff --git a/doc/altusmetrum-oneline.svg b/doc/altusmetrum-oneline.svg new file mode 100644 index 00000000..0ed7b6cd --- /dev/null +++ b/doc/altusmetrum-oneline.svg @@ -0,0 +1,354 @@ +<?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> diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt new file mode 100644 index 00000000..15fc28fc --- /dev/null +++ b/doc/altusmetrum.txt @@ -0,0 +1,51 @@ += 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[] diff --git a/doc/altusmetrum.xsl b/doc/altusmetrum.xsl deleted file mode 100644 index d1328abf..00000000 --- a/doc/altusmetrum.xsl +++ /dev/null @@ -1,6413 +0,0 @@ -<?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 ---> diff --git a/doc/am-fo.xsl b/doc/am-fo.xsl new file mode 100644 index 00000000..605339d4 --- /dev/null +++ b/doc/am-fo.xsl @@ -0,0 +1,231 @@ +<!-- +  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> diff --git a/doc/am-html.xsl b/doc/am-html.xsl new file mode 100644 index 00000000..cdfe27f8 --- /dev/null +++ b/doc/am-html.xsl @@ -0,0 +1,14 @@ +<!-- +  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> diff --git a/doc/am.css b/doc/am.css new file mode 100644 index 00000000..393ef81b --- /dev/null +++ b/doc/am.css @@ -0,0 +1,476 @@ +/* +  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; } diff --git a/doc/aprs-operation.inc b/doc/aprs-operation.inc new file mode 100644 index 00000000..09f929d0 --- /dev/null +++ b/doc/aprs-operation.inc @@ -0,0 +1,109 @@ +	=== 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. diff --git a/doc/common.xsl b/doc/common.xsl new file mode 100644 index 00000000..94b120af --- /dev/null +++ b/doc/common.xsl @@ -0,0 +1,124 @@ +<!-- +  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> diff --git a/doc/companion-docinfo.xml b/doc/companion-docinfo.xml new file mode 100644 index 00000000..243bded0 --- /dev/null +++ b/doc/companion-docinfo.xml @@ -0,0 +1,28 @@ +<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> diff --git a/doc/companion.txt b/doc/companion.txt new file mode 100644 index 00000000..75ffa228 --- /dev/null +++ b/doc/companion.txt @@ -0,0 +1,241 @@ += 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. diff --git a/doc/companion.xsl b/doc/companion.xsl deleted file mode 100644 index 14e2194e..00000000 --- a/doc/companion.xsl +++ /dev/null @@ -1,353 +0,0 @@ -<?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> diff --git a/doc/config-device.inc b/doc/config-device.inc new file mode 100644 index 00000000..35848882 --- /dev/null +++ b/doc/config-device.inc @@ -0,0 +1,245 @@ +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[] diff --git a/doc/config-ui.inc b/doc/config-ui.inc new file mode 100644 index 00000000..fdcfb9dc --- /dev/null +++ b/doc/config-ui.inc @@ -0,0 +1,113 @@ +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[] diff --git a/doc/dedication.inc b/doc/dedication.inc new file mode 100644 index 00000000..6fac8e45 --- /dev/null +++ b/doc/dedication.inc @@ -0,0 +1,26 @@ +[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 diff --git a/doc/easymega-outline.txt b/doc/easymega-outline.txt new file mode 100644 index 00000000..f5ca982c --- /dev/null +++ b/doc/easymega-outline.txt @@ -0,0 +1,9 @@ += 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"] diff --git a/doc/easymega-outline.xsl b/doc/easymega-outline.xsl deleted file mode 100644 index 5796f9c9..00000000 --- a/doc/easymega-outline.xsl +++ /dev/null @@ -1,23 +0,0 @@ -<?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 ---> diff --git a/doc/easymega.inc b/doc/easymega.inc new file mode 100644 index 00000000..c126004b --- /dev/null +++ b/doc/easymega.inc @@ -0,0 +1,123 @@ +== 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. diff --git a/doc/easymini-device.inc b/doc/easymini-device.inc new file mode 100644 index 00000000..fb2b6098 --- /dev/null +++ b/doc/easymini-device.inc @@ -0,0 +1,116 @@ +== 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. diff --git a/doc/easymini-docinfo.xml b/doc/easymini-docinfo.xml new file mode 100644 index 00000000..7789d2f3 --- /dev/null +++ b/doc/easymini-docinfo.xml @@ -0,0 +1,48 @@ +<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> diff --git a/doc/easymini-outline.txt b/doc/easymini-outline.txt new file mode 100644 index 00000000..e031b5ee --- /dev/null +++ b/doc/easymini-outline.txt @@ -0,0 +1,9 @@ += 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"] diff --git a/doc/easymini-outline.xsl b/doc/easymini-outline.xsl deleted file mode 100644 index 88125322..00000000 --- a/doc/easymini-outline.xsl +++ /dev/null @@ -1,23 +0,0 @@ -<?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 ---> diff --git a/doc/easymini-release-notes.inc b/doc/easymini-release-notes.inc new file mode 100644 index 00000000..352a989b --- /dev/null +++ b/doc/easymini-release-notes.inc @@ -0,0 +1,7 @@ +[appendix] +== Release Notes + +	:leveloffset: 2 +	include::release-notes-1.6.2.raw[] + +	:leveloffset: 0 diff --git a/doc/easymini.txt b/doc/easymini.txt new file mode 100644 index 00000000..1a75b929 --- /dev/null +++ b/doc/easymini.txt @@ -0,0 +1,34 @@ += 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[] diff --git a/doc/flight-data-recording.inc b/doc/flight-data-recording.inc new file mode 100644 index 00000000..32e44840 --- /dev/null +++ b/doc/flight-data-recording.inc @@ -0,0 +1,87 @@ +[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. diff --git a/doc/fonts/DejaVuSansMono-Bold.ttf b/doc/fonts/DejaVuSansMono-Bold.ttf Binary files differnew file mode 100644 index 00000000..1085a738 --- /dev/null +++ b/doc/fonts/DejaVuSansMono-Bold.ttf diff --git a/doc/fonts/DejaVuSansMono-BoldOblique.ttf b/doc/fonts/DejaVuSansMono-BoldOblique.ttf Binary files differnew file mode 100644 index 00000000..3175ebf2 --- /dev/null +++ b/doc/fonts/DejaVuSansMono-BoldOblique.ttf diff --git a/doc/fonts/DejaVuSansMono-Oblique.ttf b/doc/fonts/DejaVuSansMono-Oblique.ttf Binary files differnew file mode 100644 index 00000000..d5d6f92d --- /dev/null +++ b/doc/fonts/DejaVuSansMono-Oblique.ttf diff --git a/doc/fonts/DejaVuSansMono.ttf b/doc/fonts/DejaVuSansMono.ttf Binary files differnew file mode 100644 index 00000000..05e23457 --- /dev/null +++ b/doc/fonts/DejaVuSansMono.ttf diff --git a/doc/fonts/OpenSans-Bold.ttf b/doc/fonts/OpenSans-Bold.ttf Binary files differnew file mode 100644 index 00000000..fd79d43b --- /dev/null +++ b/doc/fonts/OpenSans-Bold.ttf diff --git a/doc/fonts/OpenSans-BoldItalic.ttf b/doc/fonts/OpenSans-BoldItalic.ttf Binary files differnew file mode 100644 index 00000000..9bc80095 --- /dev/null +++ b/doc/fonts/OpenSans-BoldItalic.ttf diff --git a/doc/fonts/OpenSans-ExtraBold.ttf b/doc/fonts/OpenSans-ExtraBold.ttf Binary files differnew file mode 100644 index 00000000..21f6f84a --- /dev/null +++ b/doc/fonts/OpenSans-ExtraBold.ttf diff --git a/doc/fonts/OpenSans-ExtraBoldItalic.ttf b/doc/fonts/OpenSans-ExtraBoldItalic.ttf Binary files differnew file mode 100644 index 00000000..31cb6883 --- /dev/null +++ b/doc/fonts/OpenSans-ExtraBoldItalic.ttf diff --git a/doc/fonts/OpenSans-Italic.ttf b/doc/fonts/OpenSans-Italic.ttf Binary files differnew file mode 100644 index 00000000..c90da48f --- /dev/null +++ b/doc/fonts/OpenSans-Italic.ttf diff --git a/doc/fonts/OpenSans-Light.ttf b/doc/fonts/OpenSans-Light.ttf Binary files differnew file mode 100644 index 00000000..0d381897 --- /dev/null +++ b/doc/fonts/OpenSans-Light.ttf diff --git a/doc/fonts/OpenSans-LightItalic.ttf b/doc/fonts/OpenSans-LightItalic.ttf Binary files differnew file mode 100644 index 00000000..68299c4b --- /dev/null +++ b/doc/fonts/OpenSans-LightItalic.ttf diff --git a/doc/fonts/OpenSans-Regular.ttf b/doc/fonts/OpenSans-Regular.ttf Binary files differnew file mode 100644 index 00000000..db433349 --- /dev/null +++ b/doc/fonts/OpenSans-Regular.ttf diff --git a/doc/fonts/OpenSans-Semibold.ttf b/doc/fonts/OpenSans-Semibold.ttf Binary files differnew file mode 100644 index 00000000..1a7679e3 --- /dev/null +++ b/doc/fonts/OpenSans-Semibold.ttf diff --git a/doc/fonts/OpenSans-SemiboldItalic.ttf b/doc/fonts/OpenSans-SemiboldItalic.ttf Binary files differnew file mode 100644 index 00000000..59b6d16b --- /dev/null +++ b/doc/fonts/OpenSans-SemiboldItalic.ttf diff --git a/doc/footer.templates.xsl b/doc/footer.templates.xsl new file mode 100644 index 00000000..3484c0eb --- /dev/null +++ b/doc/footer.templates.xsl @@ -0,0 +1,52 @@ +<?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> + diff --git a/doc/fop.xconf b/doc/fop.xconf new file mode 100644 index 00000000..9ac42820 --- /dev/null +++ b/doc/fop.xconf @@ -0,0 +1,88 @@ +<?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> + diff --git a/doc/getting-started.inc b/doc/getting-started.inc new file mode 100644 index 00000000..decaf4d4 --- /dev/null +++ b/doc/getting-started.inc @@ -0,0 +1,95 @@ +== 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[] diff --git a/doc/handling.inc b/doc/handling.inc new file mode 100644 index 00000000..7565996a --- /dev/null +++ b/doc/handling.inc @@ -0,0 +1,43 @@ +[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. + diff --git a/doc/installation.inc b/doc/installation.inc new file mode 100644 index 00000000..d390551e --- /dev/null +++ b/doc/installation.inc @@ -0,0 +1,69 @@ +== 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[] diff --git a/doc/intro.inc b/doc/intro.inc new file mode 100644 index 00000000..28daa41a --- /dev/null +++ b/doc/intro.inc @@ -0,0 +1,54 @@ +== 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. diff --git a/doc/load-maps.inc b/doc/load-maps.inc new file mode 100644 index 00000000..e7717d89 --- /dev/null +++ b/doc/load-maps.inc @@ -0,0 +1,60 @@ +=== 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. diff --git a/doc/make-am-html b/doc/make-am-html new file mode 100755 index 00000000..ad8cb0a2 --- /dev/null +++ b/doc/make-am-html @@ -0,0 +1,30 @@ +#!/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 diff --git a/doc/micropeak-docinfo.xml b/doc/micropeak-docinfo.xml new file mode 100644 index 00000000..37c6e770 --- /dev/null +++ b/doc/micropeak-docinfo.xml @@ -0,0 +1,76 @@ +<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> diff --git a/doc/micropeak-oneline-font.svg b/doc/micropeak-oneline-font.svg new file mode 100644 index 00000000..f6b23aa3 --- /dev/null +++ b/doc/micropeak-oneline-font.svg @@ -0,0 +1,199 @@ +<?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> diff --git a/doc/micropeak-oneline.svg b/doc/micropeak-oneline.svg new file mode 100644 index 00000000..4b695827 --- /dev/null +++ b/doc/micropeak-oneline.svg @@ -0,0 +1,239 @@ +<?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> diff --git a/doc/micropeak.txt b/doc/micropeak.txt new file mode 100644 index 00000000..d5036a00 --- /dev/null +++ b/doc/micropeak.txt @@ -0,0 +1,506 @@ += 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. diff --git a/doc/micropeak.xsl b/doc/micropeak.xsl deleted file mode 100644 index dafe3682..00000000 --- a/doc/micropeak.xsl +++ /dev/null @@ -1,736 +0,0 @@ -<?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 ---> diff --git a/doc/pyro-channels.inc b/doc/pyro-channels.inc new file mode 100644 index 00000000..3b918544 --- /dev/null +++ b/doc/pyro-channels.inc @@ -0,0 +1,99 @@ + +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. diff --git a/doc/release-notes-0.7.1-docinfo.xml b/doc/release-notes-0.7.1-docinfo.xml new file mode 100644 index 00000000..9657f2a6 --- /dev/null +++ b/doc/release-notes-0.7.1-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-0.7.1.inc b/doc/release-notes-0.7.1.inc new file mode 100644 index 00000000..8ce49f0a --- /dev/null +++ b/doc/release-notes-0.7.1.inc @@ -0,0 +1,53 @@ += 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. diff --git a/doc/release-notes-0.7.1.xsl b/doc/release-notes-0.7.1.xsl deleted file mode 100644 index 1f2feeb0..00000000 --- a/doc/release-notes-0.7.1.xsl +++ /dev/null @@ -1,71 +0,0 @@ -<?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> diff --git a/doc/release-notes-0.8-docinfo.xml b/doc/release-notes-0.8-docinfo.xml new file mode 100644 index 00000000..d593da31 --- /dev/null +++ b/doc/release-notes-0.8-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-0.8.inc b/doc/release-notes-0.8.inc new file mode 100644 index 00000000..38230593 --- /dev/null +++ b/doc/release-notes-0.8.inc @@ -0,0 +1,47 @@ += 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. diff --git a/doc/release-notes-0.8.xsl b/doc/release-notes-0.8.xsl deleted file mode 100644 index df7ef32d..00000000 --- a/doc/release-notes-0.8.xsl +++ /dev/null @@ -1,70 +0,0 @@ -<?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> diff --git a/doc/release-notes-0.9-docinfo.xml b/doc/release-notes-0.9-docinfo.xml new file mode 100644 index 00000000..605472f2 --- /dev/null +++ b/doc/release-notes-0.9-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-0.9.2-docinfo.xml b/doc/release-notes-0.9.2-docinfo.xml new file mode 100644 index 00000000..40e53634 --- /dev/null +++ b/doc/release-notes-0.9.2-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-0.9.2.inc b/doc/release-notes-0.9.2.inc new file mode 100644 index 00000000..b7c55bb2 --- /dev/null +++ b/doc/release-notes-0.9.2.inc @@ -0,0 +1,18 @@ += 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 diff --git a/doc/release-notes-0.9.2.xsl b/doc/release-notes-0.9.2.xsl deleted file mode 100644 index 16ff989e..00000000 --- a/doc/release-notes-0.9.2.xsl +++ /dev/null @@ -1,26 +0,0 @@ -<?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> diff --git a/doc/release-notes-0.9.inc b/doc/release-notes-0.9.inc new file mode 100644 index 00000000..0ee7ea51 --- /dev/null +++ b/doc/release-notes-0.9.inc @@ -0,0 +1,31 @@ += 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. diff --git a/doc/release-notes-0.9.xsl b/doc/release-notes-0.9.xsl deleted file mode 100644 index a5d6b3d7..00000000 --- a/doc/release-notes-0.9.xsl +++ /dev/null @@ -1,37 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.0.1-docinfo.xml b/doc/release-notes-1.0.1-docinfo.xml new file mode 100644 index 00000000..23972104 --- /dev/null +++ b/doc/release-notes-1.0.1-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.0.1.inc b/doc/release-notes-1.0.1.inc new file mode 100644 index 00000000..067727e9 --- /dev/null +++ b/doc/release-notes-1.0.1.inc @@ -0,0 +1,100 @@ += 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. diff --git a/doc/release-notes-1.0.1.xsl b/doc/release-notes-1.0.1.xsl deleted file mode 100644 index 8b66f7e0..00000000 --- a/doc/release-notes-1.0.1.xsl +++ /dev/null @@ -1,127 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.1-docinfo.xml b/doc/release-notes-1.1-docinfo.xml new file mode 100644 index 00000000..93273918 --- /dev/null +++ b/doc/release-notes-1.1-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.1.1-docinfo.xml b/doc/release-notes-1.1.1-docinfo.xml new file mode 100644 index 00000000..41ea12da --- /dev/null +++ b/doc/release-notes-1.1.1-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.1.1.inc b/doc/release-notes-1.1.1.inc new file mode 100644 index 00000000..2e61bfec --- /dev/null +++ b/doc/release-notes-1.1.1.inc @@ -0,0 +1,57 @@ += 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. diff --git a/doc/release-notes-1.1.1.xsl b/doc/release-notes-1.1.1.xsl deleted file mode 100644 index 6f3a925d..00000000 --- a/doc/release-notes-1.1.1.xsl +++ /dev/null @@ -1,71 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.1.inc b/doc/release-notes-1.1.inc new file mode 100644 index 00000000..b3ea066d --- /dev/null +++ b/doc/release-notes-1.1.inc @@ -0,0 +1,92 @@ += 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. diff --git a/doc/release-notes-1.1.xsl b/doc/release-notes-1.1.xsl deleted file mode 100644 index 0b2cce4e..00000000 --- a/doc/release-notes-1.1.xsl +++ /dev/null @@ -1,131 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.2-docinfo.xml b/doc/release-notes-1.2-docinfo.xml new file mode 100644 index 00000000..ba2c9d56 --- /dev/null +++ b/doc/release-notes-1.2-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.2.1-docinfo.xml b/doc/release-notes-1.2.1-docinfo.xml new file mode 100644 index 00000000..d0f08b9c --- /dev/null +++ b/doc/release-notes-1.2.1-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.2.1.inc b/doc/release-notes-1.2.1.inc new file mode 100644 index 00000000..18c5d7e2 --- /dev/null +++ b/doc/release-notes-1.2.1.inc @@ -0,0 +1,77 @@ += 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 diff --git a/doc/release-notes-1.2.1.xsl b/doc/release-notes-1.2.1.xsl deleted file mode 100644 index 0f056954..00000000 --- a/doc/release-notes-1.2.1.xsl +++ /dev/null @@ -1,107 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.2.inc b/doc/release-notes-1.2.inc new file mode 100644 index 00000000..42afad04 --- /dev/null +++ b/doc/release-notes-1.2.inc @@ -0,0 +1,32 @@ += 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. diff --git a/doc/release-notes-1.2.xsl b/doc/release-notes-1.2.xsl deleted file mode 100644 index f26480a1..00000000 --- a/doc/release-notes-1.2.xsl +++ /dev/null @@ -1,51 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.3-docinfo.xml b/doc/release-notes-1.3-docinfo.xml new file mode 100644 index 00000000..aa569df4 --- /dev/null +++ b/doc/release-notes-1.3-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.3.1-docinfo.xml b/doc/release-notes-1.3.1-docinfo.xml new file mode 100644 index 00000000..f67cf3b8 --- /dev/null +++ b/doc/release-notes-1.3.1-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.3.1.inc b/doc/release-notes-1.3.1.inc new file mode 100644 index 00000000..ff9c8e52 --- /dev/null +++ b/doc/release-notes-1.3.1.inc @@ -0,0 +1,55 @@ += 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. diff --git a/doc/release-notes-1.3.1.xsl b/doc/release-notes-1.3.1.xsl deleted file mode 100644 index 1ccbfa10..00000000 --- a/doc/release-notes-1.3.1.xsl +++ /dev/null @@ -1,71 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.3.2-docinfo.xml b/doc/release-notes-1.3.2-docinfo.xml new file mode 100644 index 00000000..82b7677e --- /dev/null +++ b/doc/release-notes-1.3.2-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.3.2.inc b/doc/release-notes-1.3.2.inc new file mode 100644 index 00000000..dae5dd99 --- /dev/null +++ b/doc/release-notes-1.3.2.inc @@ -0,0 +1,37 @@ += 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. diff --git a/doc/release-notes-1.3.2.xsl b/doc/release-notes-1.3.2.xsl deleted file mode 100644 index 279762c1..00000000 --- a/doc/release-notes-1.3.2.xsl +++ /dev/null @@ -1,54 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.3.inc b/doc/release-notes-1.3.inc new file mode 100644 index 00000000..ceb677a1 --- /dev/null +++ b/doc/release-notes-1.3.inc @@ -0,0 +1,57 @@ += 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 diff --git a/doc/release-notes-1.3.xsl b/doc/release-notes-1.3.xsl deleted file mode 100644 index 3bc4857f..00000000 --- a/doc/release-notes-1.3.xsl +++ /dev/null @@ -1,81 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.4-docinfo.xml b/doc/release-notes-1.4-docinfo.xml new file mode 100644 index 00000000..12a38ce5 --- /dev/null +++ b/doc/release-notes-1.4-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.4.1-docinfo.xml b/doc/release-notes-1.4.1-docinfo.xml new file mode 100644 index 00000000..6224b16e --- /dev/null +++ b/doc/release-notes-1.4.1-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.4.1.inc b/doc/release-notes-1.4.1.inc new file mode 100644 index 00000000..5e3e831e --- /dev/null +++ b/doc/release-notes-1.4.1.inc @@ -0,0 +1,34 @@ += 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. diff --git a/doc/release-notes-1.4.1.xsl b/doc/release-notes-1.4.1.xsl deleted file mode 100644 index e6c82d60..00000000 --- a/doc/release-notes-1.4.1.xsl +++ /dev/null @@ -1,54 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.4.2-docinfo.xml b/doc/release-notes-1.4.2-docinfo.xml new file mode 100644 index 00000000..8fd94324 --- /dev/null +++ b/doc/release-notes-1.4.2-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.4.2.inc b/doc/release-notes-1.4.2.inc new file mode 100644 index 00000000..ded6b408 --- /dev/null +++ b/doc/release-notes-1.4.2.inc @@ -0,0 +1,15 @@ += 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. diff --git a/doc/release-notes-1.4.inc b/doc/release-notes-1.4.inc new file mode 100644 index 00000000..f4ab9ad2 --- /dev/null +++ b/doc/release-notes-1.4.inc @@ -0,0 +1,125 @@ += 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. diff --git a/doc/release-notes-1.4.xsl b/doc/release-notes-1.4.xsl deleted file mode 100644 index 2893f1aa..00000000 --- a/doc/release-notes-1.4.xsl +++ /dev/null @@ -1,204 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.5-docinfo.xml b/doc/release-notes-1.5-docinfo.xml new file mode 100644 index 00000000..0c0cace7 --- /dev/null +++ b/doc/release-notes-1.5-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.5.inc b/doc/release-notes-1.5.inc new file mode 100644 index 00000000..8d72c0e0 --- /dev/null +++ b/doc/release-notes-1.5.inc @@ -0,0 +1,69 @@ += 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. diff --git a/doc/release-notes-1.5.xsl b/doc/release-notes-1.5.xsl deleted file mode 100644 index 50d83f77..00000000 --- a/doc/release-notes-1.5.xsl +++ /dev/null @@ -1,121 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.6-docinfo.xml b/doc/release-notes-1.6-docinfo.xml new file mode 100644 index 00000000..5ae58bb5 --- /dev/null +++ b/doc/release-notes-1.6-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.6.1-docinfo.xml b/doc/release-notes-1.6.1-docinfo.xml new file mode 100644 index 00000000..dc0a2d67 --- /dev/null +++ b/doc/release-notes-1.6.1-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.6.1.inc b/doc/release-notes-1.6.1.inc new file mode 100644 index 00000000..1e03ed4f --- /dev/null +++ b/doc/release-notes-1.6.1.inc @@ -0,0 +1,101 @@ += 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. diff --git a/doc/release-notes-1.6.1.xsl b/doc/release-notes-1.6.1.xsl deleted file mode 100644 index 058d43fe..00000000 --- a/doc/release-notes-1.6.1.xsl +++ /dev/null @@ -1,189 +0,0 @@ -<?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> diff --git a/doc/release-notes-1.6.2-docinfo.xml b/doc/release-notes-1.6.2-docinfo.xml new file mode 100644 index 00000000..78206e2a --- /dev/null +++ b/doc/release-notes-1.6.2-docinfo.xml @@ -0,0 +1,29 @@ +<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> diff --git a/doc/release-notes-1.6.2.inc b/doc/release-notes-1.6.2.inc new file mode 100644 index 00000000..990eb48f --- /dev/null +++ b/doc/release-notes-1.6.2.inc @@ -0,0 +1,46 @@ += 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 diff --git a/doc/release-notes-1.6.inc b/doc/release-notes-1.6.inc new file mode 100644 index 00000000..0908dfaf --- /dev/null +++ b/doc/release-notes-1.6.inc @@ -0,0 +1,85 @@ += 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. diff --git a/doc/release-notes-1.6.xsl b/doc/release-notes-1.6.xsl deleted file mode 100644 index 604fe096..00000000 --- a/doc/release-notes-1.6.xsl +++ /dev/null @@ -1,142 +0,0 @@ -<?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> diff --git a/doc/release-notes-docinfo.xml b/doc/release-notes-docinfo.xml new file mode 100644 index 00000000..4f842cde --- /dev/null +++ b/doc/release-notes-docinfo.xml @@ -0,0 +1,28 @@ +<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> diff --git a/doc/release-notes.inc b/doc/release-notes.inc new file mode 100644 index 00000000..a6240d43 --- /dev/null +++ b/doc/release-notes.inc @@ -0,0 +1,79 @@ +[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 diff --git a/doc/specs.inc b/doc/specs.inc new file mode 100644 index 00000000..a6c7b69a --- /dev/null +++ b/doc/specs.inc @@ -0,0 +1,155 @@ +[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[] + +	|==================================== diff --git a/doc/system-operation.inc b/doc/system-operation.inc new file mode 100644 index 00000000..e68b2acb --- /dev/null +++ b/doc/system-operation.inc @@ -0,0 +1,307 @@ +[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. diff --git a/doc/telegps-application.inc b/doc/telegps-application.inc new file mode 100644 index 00000000..3e6b385e --- /dev/null +++ b/doc/telegps-application.inc @@ -0,0 +1,351 @@ +== 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>>. diff --git a/doc/telegps-dedication.inc b/doc/telegps-dedication.inc new file mode 100644 index 00000000..719c309c --- /dev/null +++ b/doc/telegps-dedication.inc @@ -0,0 +1,19 @@ +[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 diff --git a/doc/telegps-docinfo.xml b/doc/telegps-docinfo.xml new file mode 100644 index 00000000..4ba3f73c --- /dev/null +++ b/doc/telegps-docinfo.xml @@ -0,0 +1,82 @@ +<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> diff --git a/doc/telegps-oneline-font.svg b/doc/telegps-oneline-font.svg new file mode 100644 index 00000000..a2cf540b --- /dev/null +++ b/doc/telegps-oneline-font.svg @@ -0,0 +1,304 @@ +<?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> diff --git a/doc/telegps-oneline.svg b/doc/telegps-oneline.svg new file mode 100644 index 00000000..21497899 --- /dev/null +++ b/doc/telegps-oneline.svg @@ -0,0 +1,332 @@ +<?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> diff --git a/doc/telegps-quick-start.inc b/doc/telegps-quick-start.inc new file mode 100644 index 00000000..6492743d --- /dev/null +++ b/doc/telegps-quick-start.inc @@ -0,0 +1,23 @@ +== 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. diff --git a/doc/telegps-release-notes.inc b/doc/telegps-release-notes.inc new file mode 100644 index 00000000..dcdabc05 --- /dev/null +++ b/doc/telegps-release-notes.inc @@ -0,0 +1,29 @@ +[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[] diff --git a/doc/telegps-specs.inc b/doc/telegps-specs.inc new file mode 100644 index 00000000..6ff8c76f --- /dev/null +++ b/doc/telegps-specs.inc @@ -0,0 +1,29 @@ +[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. diff --git a/doc/telegps-system-operation.inc b/doc/telegps-system-operation.inc new file mode 100644 index 00000000..c9fce7f0 --- /dev/null +++ b/doc/telegps-system-operation.inc @@ -0,0 +1,30 @@ +[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>>. diff --git a/doc/telegps-updating-firmware.inc b/doc/telegps-updating-firmware.inc new file mode 100644 index 00000000..568c4343 --- /dev/null +++ b/doc/telegps-updating-firmware.inc @@ -0,0 +1,43 @@ +[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. diff --git a/doc/telegps-using.inc b/doc/telegps-using.inc new file mode 100644 index 00000000..1dd889cd --- /dev/null +++ b/doc/telegps-using.inc @@ -0,0 +1,81 @@ +== 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. diff --git a/doc/telegps.txt b/doc/telegps.txt new file mode 100644 index 00000000..47eafe37 --- /dev/null +++ b/doc/telegps.txt @@ -0,0 +1,25 @@ += 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[] diff --git a/doc/telegps.xsl b/doc/telegps.xsl deleted file mode 100644 index 8de5c56d..00000000 --- a/doc/telegps.xsl +++ /dev/null @@ -1,1338 +0,0 @@ -<?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 ---> diff --git a/doc/telemega-outline.txt b/doc/telemega-outline.txt new file mode 100644 index 00000000..1af91894 --- /dev/null +++ b/doc/telemega-outline.txt @@ -0,0 +1,9 @@ += 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"] diff --git a/doc/telemega-outline.xsl b/doc/telemega-outline.xsl deleted file mode 100644 index 5d3411e9..00000000 --- a/doc/telemega-outline.xsl +++ /dev/null @@ -1,23 +0,0 @@ -<?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 ---> diff --git a/doc/telemega.inc b/doc/telemega.inc new file mode 100644 index 00000000..55f77bc4 --- /dev/null +++ b/doc/telemega.inc @@ -0,0 +1,135 @@ +== 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. diff --git a/doc/telemetrum-outline.txt b/doc/telemetrum-outline.txt new file mode 100644 index 00000000..ab6871f9 --- /dev/null +++ b/doc/telemetrum-outline.txt @@ -0,0 +1,9 @@ += 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"] diff --git a/doc/telemetrum-outline.xsl b/doc/telemetrum-outline.xsl deleted file mode 100644 index 4a0ade47..00000000 --- a/doc/telemetrum-outline.xsl +++ /dev/null @@ -1,23 +0,0 @@ -<?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 ---> diff --git a/doc/telemetrum-v2.0-th.jpg b/doc/telemetrum-v2.0-th.jpg Binary files differnew file mode 100644 index 00000000..ceec699d --- /dev/null +++ b/doc/telemetrum-v2.0-th.jpg diff --git a/doc/telemetrum.inc b/doc/telemetrum.inc new file mode 100644 index 00000000..7c9dadb5 --- /dev/null +++ b/doc/telemetrum.inc @@ -0,0 +1,85 @@ +== 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. + diff --git a/doc/telemetry-docinfo.xml b/doc/telemetry-docinfo.xml new file mode 100644 index 00000000..19f90ca4 --- /dev/null +++ b/doc/telemetry-docinfo.xml @@ -0,0 +1,28 @@ +<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> diff --git a/doc/telemetry.txt b/doc/telemetry.txt new file mode 100644 index 00000000..36d2edba --- /dev/null +++ b/doc/telemetry.txt @@ -0,0 +1,571 @@ += 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. diff --git a/doc/telemetry.xsl b/doc/telemetry.xsl deleted file mode 100644 index 2e0b3ea1..00000000 --- a/doc/telemetry.xsl +++ /dev/null @@ -1,1230 +0,0 @@ -<?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> diff --git a/doc/telemini-outline.txt b/doc/telemini-outline.txt new file mode 100644 index 00000000..1992adf0 --- /dev/null +++ b/doc/telemini-outline.txt @@ -0,0 +1,9 @@ += 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"] diff --git a/doc/telemini-v1.0.inc b/doc/telemini-v1.0.inc new file mode 100644 index 00000000..e0d674f6 --- /dev/null +++ b/doc/telemini-v1.0.inc @@ -0,0 +1,93 @@ +== 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. diff --git a/doc/telemini-v2-top.jpg b/doc/telemini-v2-top.jpg Binary files differdeleted file mode 100644 index bc8ae45b..00000000 --- a/doc/telemini-v2-top.jpg +++ /dev/null diff --git a/doc/telemini.pdf b/doc/telemini.pdf Binary files differdeleted file mode 100644 index 9d7f0237..00000000 --- a/doc/telemini.pdf +++ /dev/null diff --git a/doc/titlepage.templates.xml b/doc/titlepage.templates.tmpl index 59fa5ba1..f437fb76 100644 --- a/doc/titlepage.templates.xml +++ b/doc/titlepage.templates.tmpl @@ -36,6 +36,8 @@  	     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" @@ -44,6 +46,8 @@      <subtitle/> +    <date/> +      <corpauthor space-before="0.5em"                  font-size="&hsize2;"/>      <authorgroup space-before="0.5em" @@ -55,17 +59,17 @@           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"/> +    <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.5em"/> -    <revision space-before="0.5em"/> -    <revhistory space-before="0.5em"/> -    <abstract space-before="0.5em" +    <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" @@ -101,7 +105,7 @@      <subtitle  	      font-family="{$title.fontset}"  	      text-align="center"/> -    <corpauthor/> +    <corpauthor space-before="0.25in"/>      <authorgroup/>      <author/>      <othercredit/> @@ -130,35 +134,37 @@  <!-- ==================================================================== --> -  <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 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 @@ -166,7 +172,6 @@  	     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 @@ -174,11 +179,13 @@        <editor t:predicate="[position() = 1]"/>        -->        <othercredit/> -      <releaseinfo space-before="0.5em"/> +      <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> diff --git a/doc/updating-firmware.inc b/doc/updating-firmware.inc new file mode 100644 index 00000000..11ea1283 --- /dev/null +++ b/doc/updating-firmware.inc @@ -0,0 +1,368 @@ +[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[] diff --git a/doc/usage.inc b/doc/usage.inc new file mode 100644 index 00000000..8349f86c --- /dev/null +++ b/doc/usage.inc @@ -0,0 +1,312 @@ +== 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[] diff --git a/doc/using-am-products.inc b/doc/using-am-products.inc new file mode 100644 index 00000000..1969529f --- /dev/null +++ b/doc/using-am-products.inc @@ -0,0 +1,171 @@ +== 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! diff --git a/doc/xorg-fo.xsl b/doc/xorg-fo.xsl deleted file mode 100644 index 4b8c619f..00000000 --- a/doc/xorg-fo.xsl +++ /dev/null @@ -1,121 +0,0 @@ -<?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> diff --git a/micropeak/MicroData.java b/micropeak/MicroData.java index 62f03c9d..085b0131 100644 --- a/micropeak/MicroData.java +++ b/micropeak/MicroData.java @@ -20,8 +20,8 @@ package org.altusmetrum.micropeak;  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; diff --git a/micropeak/MicroDataPoint.java b/micropeak/MicroDataPoint.java index 1c36fefe..0157f05d 100644 --- a/micropeak/MicroDataPoint.java +++ b/micropeak/MicroDataPoint.java @@ -17,7 +17,7 @@  package org.altusmetrum.micropeak; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*;  public class MicroDataPoint implements AltosUIDataPoint {  	public double		time; diff --git a/micropeak/MicroDeviceDialog.java b/micropeak/MicroDeviceDialog.java index a6d0f321..6e45359b 100644 --- a/micropeak/MicroDeviceDialog.java +++ b/micropeak/MicroDeviceDialog.java @@ -21,7 +21,7 @@ import javax.swing.*;  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 { diff --git a/micropeak/MicroDownload.java b/micropeak/MicroDownload.java index 7314cc7f..53d70b1b 100644 --- a/micropeak/MicroDownload.java +++ b/micropeak/MicroDownload.java @@ -23,8 +23,8 @@ import javax.swing.*;  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; diff --git a/micropeak/MicroExport.java b/micropeak/MicroExport.java index d3cfc3b8..c5b5d3d6 100644 --- a/micropeak/MicroExport.java +++ b/micropeak/MicroExport.java @@ -23,8 +23,8 @@ import java.util.ArrayList;  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 { diff --git a/micropeak/MicroFile.java b/micropeak/MicroFile.java index d48598cb..5712d6b6 100644 --- a/micropeak/MicroFile.java +++ b/micropeak/MicroFile.java @@ -19,8 +19,8 @@ package org.altusmetrum.micropeak;  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 { diff --git a/micropeak/MicroFileChooser.java b/micropeak/MicroFileChooser.java index d72d956a..01ce284b 100644 --- a/micropeak/MicroFileChooser.java +++ b/micropeak/MicroFileChooser.java @@ -20,8 +20,8 @@ package org.altusmetrum.micropeak;  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; diff --git a/micropeak/MicroFrame.java b/micropeak/MicroFrame.java index 9b0f1e7c..21f839b6 100644 --- a/micropeak/MicroFrame.java +++ b/micropeak/MicroFrame.java @@ -21,7 +21,7 @@ import java.awt.*;  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 = { diff --git a/micropeak/MicroGraph.java b/micropeak/MicroGraph.java index c7a2d345..c4dcb29c 100644 --- a/micropeak/MicroGraph.java +++ b/micropeak/MicroGraph.java @@ -22,8 +22,8 @@ import java.util.ArrayList;  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.*; diff --git a/micropeak/MicroPeak.java b/micropeak/MicroPeak.java index 2df81621..1b7327e4 100644 --- a/micropeak/MicroPeak.java +++ b/micropeak/MicroPeak.java @@ -23,8 +23,8 @@ import javax.swing.*;  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 { diff --git a/micropeak/MicroRaw.java b/micropeak/MicroRaw.java index 6aae0bde..c3504834 100644 --- a/micropeak/MicroRaw.java +++ b/micropeak/MicroRaw.java @@ -20,8 +20,8 @@ package org.altusmetrum.micropeak;  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 { diff --git a/micropeak/MicroSave.java b/micropeak/MicroSave.java index d8fe59c2..e964ee9e 100644 --- a/micropeak/MicroSave.java +++ b/micropeak/MicroSave.java @@ -24,8 +24,8 @@ import javax.swing.filechooser.FileNameExtensionFilter;  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 { diff --git a/micropeak/MicroSerial.java b/micropeak/MicroSerial.java index 8d20718f..f5a98929 100644 --- a/micropeak/MicroSerial.java +++ b/micropeak/MicroSerial.java @@ -20,7 +20,7 @@ package org.altusmetrum.micropeak;  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; diff --git a/micropeak/MicroSerialLog.java b/micropeak/MicroSerialLog.java index c7a0525d..e808dee2 100644 --- a/micropeak/MicroSerialLog.java +++ b/micropeak/MicroSerialLog.java @@ -20,7 +20,7 @@ package org.altusmetrum.micropeak;  import java.util.*;  import java.io.*;  import libaltosJNI.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*;  public interface MicroSerialLog { diff --git a/micropeak/MicroStats.java b/micropeak/MicroStats.java index 8d83fe3e..9e8f1938 100644 --- a/micropeak/MicroStats.java +++ b/micropeak/MicroStats.java @@ -18,8 +18,8 @@  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; diff --git a/micropeak/MicroStatsTable.java b/micropeak/MicroStatsTable.java index 35d10eee..ad7b206c 100644 --- a/micropeak/MicroStatsTable.java +++ b/micropeak/MicroStatsTable.java @@ -19,8 +19,8 @@ package org.altusmetrum.micropeak;  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; diff --git a/micropeak/MicroUSB.java b/micropeak/MicroUSB.java index 3a7891cb..f6568d36 100644 --- a/micropeak/MicroUSB.java +++ b/micropeak/MicroUSB.java @@ -19,8 +19,8 @@ package org.altusmetrum.micropeak;  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 { diff --git a/pdclib b/pdclib -Subproject 8b1c9061fa3a8f1b30ee13b373afe5cc1ad9d38 +Subproject bd33f6640cf5882f8630766a9acdd1bc420a9dd diff --git a/src/Makefile b/src/Makefile index dc74bf8c..ebe1df9c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -29,6 +29,7 @@ ARMM3DIRS=\  	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 \ diff --git a/src/drivers/ao_companion.c b/src/drivers/ao_companion.c index 7e02939b..5f07e8b0 100644 --- a/src/drivers/ao_companion.c +++ b/src/drivers/ao_companion.c @@ -23,6 +23,10 @@  #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,	\ diff --git a/src/drivers/ao_lco.c b/src/drivers/ao_lco.c index b8698a80..6c192537 100644 --- a/src/drivers/ao_lco.c +++ b/src/drivers/ao_lco.c @@ -36,28 +36,70 @@ static uint8_t	ao_lco_debug;  #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 @@ -68,18 +110,23 @@ ao_lco_set_voltage(uint16_t decivolts)  	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);  	}  } @@ -91,42 +138,205 @@ ao_lco_set_display(void)  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 (;;) { @@ -148,7 +358,7 @@ ao_lco_input(void)  							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(); @@ -160,18 +370,26 @@ ao_lco_input(void)  					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();  					}  				} @@ -183,13 +401,53 @@ ao_lco_input(void)  			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;  			} @@ -225,37 +483,38 @@ static AO_LED_TYPE	continuity_led[AO_LED_CONTINUITY_NUM] = {  #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 @@ -281,7 +540,6 @@ ao_lco_box_set_present(uint8_t box)  static void  ao_lco_search(void)  { -	uint16_t	tick_offset;  	int8_t		r;  	int8_t		try;  	uint8_t		box; @@ -293,9 +551,9 @@ ao_lco_search(void)  		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); @@ -309,8 +567,8 @@ ao_lco_search(void)  		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();  } @@ -319,37 +577,53 @@ static void  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;  		}  	}  } @@ -374,34 +648,33 @@ static void  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); diff --git a/src/drivers/ao_lco_cmd.c b/src/drivers/ao_lco_cmd.c index acbf589a..6a365687 100644 --- a/src/drivers/ao_lco_cmd.c +++ b/src/drivers/ao_lco_cmd.c @@ -62,7 +62,7 @@ lco_arm(void)  static void  lco_ignite(void)  { -	ao_lco_ignite(lco_box, lco_channels, tick_offset); +	ao_lco_ignite();  }  static void diff --git a/src/drivers/ao_lco_func.c b/src/drivers/ao_lco_func.c index 32c00068..08d45467 100644 --- a/src/drivers/ao_lco_func.c +++ b/src/drivers/ao_lco_func.c @@ -44,7 +44,7 @@ ao_lco_query(uint16_t box, struct ao_pad_query *query, uint16_t *tick_offset)  	}  #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; @@ -70,14 +70,13 @@ 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)  {  	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);  } - diff --git a/src/drivers/ao_lco_func.h b/src/drivers/ao_lco_func.h index dccf602a..42754352 100644 --- a/src/drivers/ao_lco_func.h +++ b/src/drivers/ao_lco_func.h @@ -27,6 +27,6 @@ void  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_ */ diff --git a/src/drivers/ao_pad.c b/src/drivers/ao_pad.c index ffe46c68..419ea8d3 100644 --- a/src/drivers/ao_pad.c +++ b/src/drivers/ao_pad.c @@ -288,8 +288,7 @@ ao_pad(void)  			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) { @@ -320,13 +319,6 @@ ao_pad(void)  					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(); diff --git a/src/drivers/ao_pwm.h b/src/drivers/ao_pwm.h new file mode 100644 index 00000000..2dd2ffd5 --- /dev/null +++ b/src/drivers/ao_pwm.h @@ -0,0 +1,29 @@ +/* + * 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_ */ diff --git a/src/drivers/ao_seven_segment.c b/src/drivers/ao_seven_segment.c index 961fbb84..f1339ee5 100644 --- a/src/drivers/ao_seven_segment.c +++ b/src/drivers/ao_seven_segment.c @@ -168,10 +168,20 @@ static const uint8_t ao_segments[] = {  	(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) @@ -183,10 +193,7 @@ ao_seven_segment_set(uint8_t digit, uint8_t value)  		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 diff --git a/src/drivers/ao_seven_segment.h b/src/drivers/ao_seven_segment.h index 5b29deaf..f997f3b5 100644 --- a/src/drivers/ao_seven_segment.h +++ b/src/drivers/ao_seven_segment.h @@ -23,6 +23,9 @@  #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);  void diff --git a/src/easymega-v1.0/ao_pins.h b/src/easymega-v1.0/ao_pins.h index d6490ba5..a5e55638 100644 --- a/src/easymega-v1.0/ao_pins.h +++ b/src/easymega-v1.0/ao_pins.h @@ -78,6 +78,7 @@  #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 */ diff --git a/src/kernel/ao_telemetry.c b/src/kernel/ao_telemetry.c index 854ac898..16363f75 100644 --- a/src/kernel/ao_telemetry.c +++ b/src/kernel/ao_telemetry.c @@ -75,6 +75,13 @@ static __pdata uint16_t ao_aprs_time;  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 @@ -117,7 +124,7 @@ ao_send_sensor(void)  	telemetry.sensor.accel_minus_g = 0;  #endif -	ao_radio_send(&telemetry, sizeof (telemetry)); +	ao_telemetry_send();  }  #endif @@ -156,7 +163,7 @@ ao_send_mega_sensor(void)  	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; @@ -190,8 +197,8 @@ ao_send_mega_data(void)  		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 */ @@ -221,7 +228,7 @@ ao_send_metrum_sensor(void)  	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; @@ -248,8 +255,8 @@ ao_send_metrum_data(void)  		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 */ @@ -279,7 +286,7 @@ ao_send_mini(void)  	telemetry.mini.ground_pres = ao_ground_pres; -	ao_radio_send(&telemetry, sizeof (telemetry)); +	ao_telemetry_send();  }  #endif /* AO_SEND_MINI */ @@ -316,8 +323,8 @@ ao_send_configuration(void)  		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();  	}  } @@ -339,8 +346,8 @@ ao_send_location(void)  		       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();  	}  } @@ -356,8 +363,8 @@ ao_send_satellite(void)  		       &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 @@ -380,8 +387,8 @@ ao_send_companion(void)  		       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 diff --git a/src/stm/ao_pwm_stm.c b/src/stm/ao_pwm_stm.c new file mode 100644 index 00000000..ce1fa6f3 --- /dev/null +++ b/src/stm/ao_pwm_stm.c @@ -0,0 +1,192 @@ +/* + * 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]); +} diff --git a/src/stm/stm32l.h b/src/stm/stm32l.h index 799cccbd..01afedc6 100644 --- a/src/stm/stm32l.h +++ b/src/stm/stm32l.h @@ -1775,7 +1775,7 @@ extern struct stm_tim234 stm_tim2, stm_tim3, stm_tim4;  #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 @@ -1815,7 +1815,7 @@ extern struct stm_tim234 stm_tim2, stm_tim3, stm_tim4;  #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 diff --git a/src/teleballoon-v2.0/ao_pins.h b/src/teleballoon-v2.0/ao_pins.h index a369070f..b62b5580 100644 --- a/src/teleballoon-v2.0/ao_pins.h +++ b/src/teleballoon-v2.0/ao_pins.h @@ -75,6 +75,7 @@  #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 */ diff --git a/src/telemega-v0.1/ao_pins.h b/src/telemega-v0.1/ao_pins.h index 2616e906..7ccc6085 100644 --- a/src/telemega-v0.1/ao_pins.h +++ b/src/telemega-v0.1/ao_pins.h @@ -79,6 +79,7 @@  #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 */ diff --git a/src/telemega-v1.0/ao_pins.h b/src/telemega-v1.0/ao_pins.h index 77b753d1..664546c2 100644 --- a/src/telemega-v1.0/ao_pins.h +++ b/src/telemega-v1.0/ao_pins.h @@ -79,6 +79,7 @@  #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 */ diff --git a/src/telemega-v2.0/.gitignore b/src/telemega-v2.0/.gitignore new file mode 100644 index 00000000..e67759a2 --- /dev/null +++ b/src/telemega-v2.0/.gitignore @@ -0,0 +1,2 @@ +ao_product.h +telemega-*.elf diff --git a/src/telemega-v2.0/Makefile b/src/telemega-v2.0/Makefile new file mode 100644 index 00000000..6a1c05b0 --- /dev/null +++ b/src/telemega-v2.0/Makefile @@ -0,0 +1,156 @@ +# +# 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: diff --git a/src/telemega-v2.0/ao_pins.h b/src/telemega-v2.0/ao_pins.h new file mode 100644 index 00000000..9095a350 --- /dev/null +++ b/src/telemega-v2.0/ao_pins.h @@ -0,0 +1,407 @@ +/* + * 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_ */ diff --git a/src/telemega-v2.0/ao_telemega.c b/src/telemega-v2.0/ao_telemega.c new file mode 100644 index 00000000..86427107 --- /dev/null +++ b/src/telemega-v2.0/ao_telemega.c @@ -0,0 +1,105 @@ +/* + * 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; +} diff --git a/src/telemega-v2.0/flash-loader/Makefile b/src/telemega-v2.0/flash-loader/Makefile new file mode 100644 index 00000000..d667c18e --- /dev/null +++ b/src/telemega-v2.0/flash-loader/Makefile @@ -0,0 +1,8 @@ +# +# AltOS flash loader build +# +# + +TOPDIR=../.. +HARDWARE=telemega-v2.0 +include $(TOPDIR)/stm/Makefile-flash.defs diff --git a/src/telemega-v2.0/flash-loader/ao_pins.h b/src/telemega-v2.0/flash-loader/ao_pins.h new file mode 100644 index 00000000..304bb7c3 --- /dev/null +++ b/src/telemega-v2.0/flash-loader/ao_pins.h @@ -0,0 +1,34 @@ +/* + * 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_ */ diff --git a/src/telemetrum-v2.0/ao_pins.h b/src/telemetrum-v2.0/ao_pins.h index a9a4b243..fbb38df2 100644 --- a/src/telemetrum-v2.0/ao_pins.h +++ b/src/telemetrum-v2.0/ao_pins.h @@ -75,6 +75,7 @@  #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 */ diff --git a/telegps/TeleGPS.java b/telegps/TeleGPS.java index 0208e81d..0250a38e 100644 --- a/telegps/TeleGPS.java +++ b/telegps/TeleGPS.java @@ -24,8 +24,8 @@ import java.io.*;  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 diff --git a/telegps/TeleGPSConfig.java b/telegps/TeleGPSConfig.java index e2cf1258..165981f9 100644 --- a/telegps/TeleGPSConfig.java +++ b/telegps/TeleGPSConfig.java @@ -22,8 +22,8 @@ import javax.swing.*;  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 { diff --git a/telegps/TeleGPSConfigUI.java b/telegps/TeleGPSConfigUI.java index 8d4916aa..5a3a05eb 100644 --- a/telegps/TeleGPSConfigUI.java +++ b/telegps/TeleGPSConfigUI.java @@ -22,8 +22,8 @@ import java.awt.*;  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 diff --git a/telegps/TeleGPSDisplayThread.java b/telegps/TeleGPSDisplayThread.java index fa394b17..4d8fdcc9 100644 --- a/telegps/TeleGPSDisplayThread.java +++ b/telegps/TeleGPSDisplayThread.java @@ -21,8 +21,8 @@ import java.awt.*;  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 { @@ -129,7 +129,7 @@ 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) diff --git a/telegps/TeleGPSGraphUI.java b/telegps/TeleGPSGraphUI.java index 8fe479cc..e3902d2f 100644 --- a/telegps/TeleGPSGraphUI.java +++ b/telegps/TeleGPSGraphUI.java @@ -26,8 +26,8 @@ import javax.swing.*;  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; diff --git a/telegps/TeleGPSInfo.java b/telegps/TeleGPSInfo.java index 6baccce9..ae197abe 100644 --- a/telegps/TeleGPSInfo.java +++ b/telegps/TeleGPSInfo.java @@ -21,8 +21,8 @@ import java.util.*;  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 { diff --git a/telegps/TeleGPSPreferences.java b/telegps/TeleGPSPreferences.java index d0b843e1..eab9350a 100644 --- a/telegps/TeleGPSPreferences.java +++ b/telegps/TeleGPSPreferences.java @@ -22,7 +22,7 @@ import java.awt.event.*;  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 diff --git a/telegps/TeleGPSState.java b/telegps/TeleGPSState.java index dac7da52..516eb797 100644 --- a/telegps/TeleGPSState.java +++ b/telegps/TeleGPSState.java @@ -21,8 +21,8 @@ import java.util.*;  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 { diff --git a/telegps/TeleGPSStatus.java b/telegps/TeleGPSStatus.java index 896df9d4..3a6b2515 100644 --- a/telegps/TeleGPSStatus.java +++ b/telegps/TeleGPSStatus.java @@ -19,8 +19,8 @@ package org.altusmetrum.telegps;  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; diff --git a/telegps/TeleGPSStatusUpdate.java b/telegps/TeleGPSStatusUpdate.java index eef0a034..655f42f5 100644 --- a/telegps/TeleGPSStatusUpdate.java +++ b/telegps/TeleGPSStatusUpdate.java @@ -18,7 +18,7 @@  package org.altusmetrum.telegps;  import java.awt.event.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*;  public class TeleGPSStatusUpdate implements ActionListener {  | 
