Merge branch 'branch-1.6' into debian
authorBdale Garbee <bdale@gag.com>
Mon, 11 Jan 2016 02:09:09 +0000 (19:09 -0700)
committerBdale Garbee <bdale@gag.com>
Mon, 11 Jan 2016 02:09:09 +0000 (19:09 -0700)
455 files changed:
ChangeLog
Makefile.am
Releasing
altosdroid/res/layout/map_preload.xml
altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java
altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java
altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java
altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java
altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java
altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java
altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java
altoslib/AltosAccel.java
altoslib/AltosCRCException.java
altoslib/AltosCSV.java
altoslib/AltosCompanion.java
altoslib/AltosConfigData.java
altoslib/AltosConfigDataException.java
altoslib/AltosConfigValues.java
altoslib/AltosConvert.java
altoslib/AltosDebug.java
altoslib/AltosDistance.java
altoslib/AltosEeprom.java
altoslib/AltosEepromChunk.java
altoslib/AltosEepromDownload.java
altoslib/AltosEepromFile.java
altoslib/AltosEepromGPS.java
altoslib/AltosEepromHeader.java
altoslib/AltosEepromIterable.java
altoslib/AltosEepromList.java
altoslib/AltosEepromLog.java
altoslib/AltosEepromMega.java
altoslib/AltosEepromMetrum2.java
altoslib/AltosEepromMini.java
altoslib/AltosEepromMonitor.java
altoslib/AltosEepromTM.java
altoslib/AltosEepromTm.java
altoslib/AltosFile.java
altoslib/AltosFlash.java
altoslib/AltosFlashListener.java
altoslib/AltosFlightDisplay.java
altoslib/AltosFlightReader.java
altoslib/AltosFlightStats.java
altoslib/AltosFontListener.java
altoslib/AltosFrequency.java
altoslib/AltosGPS.java
altoslib/AltosGPSSat.java
altoslib/AltosGreatCircle.java
altoslib/AltosHeight.java
altoslib/AltosHexfile.java
altoslib/AltosHexsym.java
altoslib/AltosIMU.java
altoslib/AltosIdle.java
altoslib/AltosIdleFetch.java
altoslib/AltosIdleMonitor.java
altoslib/AltosIdleMonitorListener.java
altoslib/AltosIgnite.java
altoslib/AltosImage.java
altoslib/AltosKML.java
altoslib/AltosLatLon.java
altoslib/AltosLatitude.java
altoslib/AltosLaunchSite.java
altoslib/AltosLaunchSiteListener.java
altoslib/AltosLaunchSites.java
altoslib/AltosLib.java
altoslib/AltosLine.java
altoslib/AltosLink.java
altoslib/AltosListenerState.java
altoslib/AltosLocation.java
altoslib/AltosLog.java
altoslib/AltosLongitude.java
altoslib/AltosMag.java
altoslib/AltosMap.java
altoslib/AltosMapCache.java
altoslib/AltosMapCacheListener.java
altoslib/AltosMapInterface.java
altoslib/AltosMapLine.java
altoslib/AltosMapLoader.java
altoslib/AltosMapLoaderListener.java
altoslib/AltosMapMark.java
altoslib/AltosMapPath.java
altoslib/AltosMapPathPoint.java
altoslib/AltosMapRectangle.java
altoslib/AltosMapStore.java
altoslib/AltosMapStoreListener.java
altoslib/AltosMapTile.java
altoslib/AltosMapTileListener.java
altoslib/AltosMapTransform.java
altoslib/AltosMapZoomListener.java
altoslib/AltosMma655x.java
altoslib/AltosMs5607.java
altoslib/AltosNoSymbol.java
altoslib/AltosOrient.java
altoslib/AltosParse.java
altoslib/AltosPointDouble.java
altoslib/AltosPointInt.java
altoslib/AltosPreferences.java
altoslib/AltosPreferencesBackend.java
altoslib/AltosProgrammer.java
altoslib/AltosPyro.java
altoslib/AltosQuaternion.java
altoslib/AltosRectangle.java
altoslib/AltosReplayReader.java
altoslib/AltosRomconfig.java
altoslib/AltosRotation.java
altoslib/AltosSavedState.java
altoslib/AltosSelfFlash.java
altoslib/AltosSensorEMini.java
altoslib/AltosSensorMM.java
altoslib/AltosSensorMega.java
altoslib/AltosSensorMetrum.java
altoslib/AltosSensorTGPS.java
altoslib/AltosSensorTM.java
altoslib/AltosSensorTMini.java
altoslib/AltosSpeed.java
altoslib/AltosState.java
altoslib/AltosStateIterable.java
altoslib/AltosStateUpdate.java
altoslib/AltosTelemetry.java
altoslib/AltosTelemetryCompanion.java [new file with mode: 0644]
altoslib/AltosTelemetryConfiguration.java
altoslib/AltosTelemetryFile.java
altoslib/AltosTelemetryIterable.java
altoslib/AltosTelemetryLegacy.java
altoslib/AltosTelemetryLocation.java
altoslib/AltosTelemetryMap.java
altoslib/AltosTelemetryMegaData.java
altoslib/AltosTelemetryMegaSensor.java
altoslib/AltosTelemetryMetrumData.java
altoslib/AltosTelemetryMetrumSensor.java
altoslib/AltosTelemetryMini.java
altoslib/AltosTelemetryRaw.java
altoslib/AltosTelemetryReader.java
altoslib/AltosTelemetrySatellite.java
altoslib/AltosTelemetrySensor.java
altoslib/AltosTelemetryStandard.java
altoslib/AltosTemperature.java
altoslib/AltosUnits.java
altoslib/AltosUnitsListener.java
altoslib/AltosVersion.java.in
altoslib/AltosVoltage.java
altoslib/AltosWriter.java
altoslib/Makefile.am
altosui/Altos.java
altosui/AltosAscent.java
altosui/AltosCompanionInfo.java
altosui/AltosConfig.java
altosui/AltosConfigPyroUI.java
altosui/AltosConfigTD.java
altosui/AltosConfigTDUI.java
altosui/AltosConfigUI.java
altosui/AltosConfigureUI.java
altosui/AltosDescent.java
altosui/AltosFlightStatus.java
altosui/AltosFlightStatusTableModel.java
altosui/AltosFlightStatusUpdate.java
altosui/AltosFlightUI.java
altosui/AltosGraphUI.java
altosui/AltosIdleMonitorUI.java
altosui/AltosIgniteUI.java
altosui/AltosIgnitor.java
altosui/AltosLanded.java
altosui/AltosLaunch.java
altosui/AltosLaunchUI.java
altosui/AltosPad.java
altosui/AltosUI.java
altosui/Makefile.am
altosui/altos-windows.nsi.in
altosuilib/AltosBTDevice.java
altosuilib/AltosBTDeviceIterator.java
altosuilib/AltosBTKnown.java
altosuilib/AltosBTManage.java
altosuilib/AltosCSVUI.java
altosuilib/AltosConfigFreqUI.java
altosuilib/AltosDataChooser.java
altosuilib/AltosDevice.java
altosuilib/AltosDeviceDialog.java
altosuilib/AltosDeviceUIDialog.java
altosuilib/AltosDisplayThread.java
altosuilib/AltosEepromDelete.java
altosuilib/AltosEepromManage.java
altosuilib/AltosEepromMonitor.java
altosuilib/AltosEepromMonitorUI.java
altosuilib/AltosEepromSelect.java
altosuilib/AltosFlashUI.java
altosuilib/AltosFlightInfoTableModel.java
altosuilib/AltosFlightStatsTable.java
altosuilib/AltosGraph.java
altosuilib/AltosGraphDataPoint.java
altosuilib/AltosGraphDataSet.java
altosuilib/AltosInfoTable.java
altosuilib/AltosLed.java
altosuilib/AltosLights.java
altosuilib/AltosPositionListener.java
altosuilib/AltosRomconfigUI.java
altosuilib/AltosScanUI.java
altosuilib/AltosSerial.java
altosuilib/AltosSerialInUseException.java
altosuilib/AltosUIAxis.java
altosuilib/AltosUIConfigure.java
altosuilib/AltosUIDataMissing.java
altosuilib/AltosUIDataPoint.java
altosuilib/AltosUIDataSet.java
altosuilib/AltosUIDialog.java
altosuilib/AltosUIEnable.java
altosuilib/AltosUIFlightTab.java
altosuilib/AltosUIFrame.java
altosuilib/AltosUIFreqList.java
altosuilib/AltosUIGraph.java
altosuilib/AltosUIGrapher.java
altosuilib/AltosUIImage.java
altosuilib/AltosUIIndicator.java
altosuilib/AltosUILib.java
altosuilib/AltosUIListener.java
altosuilib/AltosUIMapNew.java
altosuilib/AltosUIMapPreloadNew.java
altosuilib/AltosUIMarker.java
altosuilib/AltosUIPreferences.java
altosuilib/AltosUIPreferencesBackend.java
altosuilib/AltosUIRateList.java
altosuilib/AltosUISeries.java
altosuilib/AltosUITelemetryList.java
altosuilib/AltosUIUnitsIndicator.java
altosuilib/AltosUIVoltageIndicator.java
altosuilib/AltosUSBDevice.java
altosuilib/AltosVoice.java
altosuilib/GrabNDrag.java
altosuilib/OSXAdapter.java
ao-bringup/test-telemega
ao-bringup/test-telemega-v1.0 [new file with mode: 0755]
ao-bringup/turnon_telemega
ao-bringup/turnon_telemega_v1.0 [new file with mode: 0755]
ao-tools/ao-dbg/ao-dbg-main.c
ao-tools/ao-telem/ao-telem.c
configure.ac
debian/control
doc/.gitignore
doc/Makefile
doc/RELNOTES [new file with mode: 0644]
doc/altos-docinfo.xml [new file with mode: 0644]
doc/altos.txt [new file with mode: 0644]
doc/altos.xsl [deleted file]
doc/altosdroid.inc [new file with mode: 0644]
doc/altosui.inc [new file with mode: 0644]
doc/altusmetrum-docinfo.xml [new file with mode: 0644]
doc/altusmetrum-oneline.svg [new file with mode: 0644]
doc/altusmetrum.txt [new file with mode: 0644]
doc/altusmetrum.xsl [deleted file]
doc/am-fo.xsl [new file with mode: 0644]
doc/am-html.xsl [new file with mode: 0644]
doc/am.css [new file with mode: 0644]
doc/aprs-operation.inc [new file with mode: 0644]
doc/common.xsl [new file with mode: 0644]
doc/companion-docinfo.xml [new file with mode: 0644]
doc/companion.txt [new file with mode: 0644]
doc/companion.xsl [deleted file]
doc/config-device.inc [new file with mode: 0644]
doc/config-ui.inc [new file with mode: 0644]
doc/dedication.inc [new file with mode: 0644]
doc/easymega-outline.txt [new file with mode: 0644]
doc/easymega-outline.xsl [deleted file]
doc/easymega.inc [new file with mode: 0644]
doc/easymini-device.inc [new file with mode: 0644]
doc/easymini-docinfo.xml [new file with mode: 0644]
doc/easymini-outline.txt [new file with mode: 0644]
doc/easymini-outline.xsl [deleted file]
doc/easymini-release-notes.inc [new file with mode: 0644]
doc/easymini.txt [new file with mode: 0644]
doc/flight-data-recording.inc [new file with mode: 0644]
doc/fonts/DejaVuSansMono-Bold.ttf [new file with mode: 0644]
doc/fonts/DejaVuSansMono-BoldOblique.ttf [new file with mode: 0644]
doc/fonts/DejaVuSansMono-Oblique.ttf [new file with mode: 0644]
doc/fonts/DejaVuSansMono.ttf [new file with mode: 0644]
doc/fonts/OpenSans-Bold.ttf [new file with mode: 0644]
doc/fonts/OpenSans-BoldItalic.ttf [new file with mode: 0644]
doc/fonts/OpenSans-ExtraBold.ttf [new file with mode: 0644]
doc/fonts/OpenSans-ExtraBoldItalic.ttf [new file with mode: 0644]
doc/fonts/OpenSans-Italic.ttf [new file with mode: 0644]
doc/fonts/OpenSans-Light.ttf [new file with mode: 0644]
doc/fonts/OpenSans-LightItalic.ttf [new file with mode: 0644]
doc/fonts/OpenSans-Regular.ttf [new file with mode: 0644]
doc/fonts/OpenSans-Semibold.ttf [new file with mode: 0644]
doc/fonts/OpenSans-SemiboldItalic.ttf [new file with mode: 0644]
doc/footer.templates.xsl [new file with mode: 0644]
doc/fop.xconf [new file with mode: 0644]
doc/getting-started.inc [new file with mode: 0644]
doc/handling.inc [new file with mode: 0644]
doc/installation.inc [new file with mode: 0644]
doc/intro.inc [new file with mode: 0644]
doc/load-maps.inc [new file with mode: 0644]
doc/make-am-html [new file with mode: 0755]
doc/micropeak-docinfo.xml [new file with mode: 0644]
doc/micropeak-oneline-font.svg [new file with mode: 0644]
doc/micropeak-oneline.svg [new file with mode: 0644]
doc/micropeak.txt [new file with mode: 0644]
doc/micropeak.xsl [deleted file]
doc/pyro-channels.inc [new file with mode: 0644]
doc/release-notes-0.7.1-docinfo.xml [new file with mode: 0644]
doc/release-notes-0.7.1.inc [new file with mode: 0644]
doc/release-notes-0.7.1.xsl [deleted file]
doc/release-notes-0.8-docinfo.xml [new file with mode: 0644]
doc/release-notes-0.8.inc [new file with mode: 0644]
doc/release-notes-0.8.xsl [deleted file]
doc/release-notes-0.9-docinfo.xml [new file with mode: 0644]
doc/release-notes-0.9.2-docinfo.xml [new file with mode: 0644]
doc/release-notes-0.9.2.inc [new file with mode: 0644]
doc/release-notes-0.9.2.xsl [deleted file]
doc/release-notes-0.9.inc [new file with mode: 0644]
doc/release-notes-0.9.xsl [deleted file]
doc/release-notes-1.0.1-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.0.1.inc [new file with mode: 0644]
doc/release-notes-1.0.1.xsl [deleted file]
doc/release-notes-1.1-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.1.1-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.1.1.inc [new file with mode: 0644]
doc/release-notes-1.1.1.xsl [deleted file]
doc/release-notes-1.1.inc [new file with mode: 0644]
doc/release-notes-1.1.xsl [deleted file]
doc/release-notes-1.2-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.2.1-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.2.1.inc [new file with mode: 0644]
doc/release-notes-1.2.1.xsl [deleted file]
doc/release-notes-1.2.inc [new file with mode: 0644]
doc/release-notes-1.2.xsl [deleted file]
doc/release-notes-1.3-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.3.1-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.3.1.inc [new file with mode: 0644]
doc/release-notes-1.3.1.xsl [deleted file]
doc/release-notes-1.3.2-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.3.2.inc [new file with mode: 0644]
doc/release-notes-1.3.2.xsl [deleted file]
doc/release-notes-1.3.inc [new file with mode: 0644]
doc/release-notes-1.3.xsl [deleted file]
doc/release-notes-1.4-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.4.1-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.4.1.inc [new file with mode: 0644]
doc/release-notes-1.4.1.xsl [deleted file]
doc/release-notes-1.4.2-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.4.2.inc [new file with mode: 0644]
doc/release-notes-1.4.inc [new file with mode: 0644]
doc/release-notes-1.4.xsl [deleted file]
doc/release-notes-1.5-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.5.inc [new file with mode: 0644]
doc/release-notes-1.5.xsl [deleted file]
doc/release-notes-1.6-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.6.1-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.6.1.inc [new file with mode: 0644]
doc/release-notes-1.6.1.xsl [deleted file]
doc/release-notes-1.6.2-docinfo.xml [new file with mode: 0644]
doc/release-notes-1.6.2.inc [new file with mode: 0644]
doc/release-notes-1.6.inc [new file with mode: 0644]
doc/release-notes-1.6.xsl [deleted file]
doc/release-notes-docinfo.xml [new file with mode: 0644]
doc/release-notes.inc [new file with mode: 0644]
doc/specs.inc [new file with mode: 0644]
doc/system-operation.inc [new file with mode: 0644]
doc/telegps-application.inc [new file with mode: 0644]
doc/telegps-dedication.inc [new file with mode: 0644]
doc/telegps-docinfo.xml [new file with mode: 0644]
doc/telegps-oneline-font.svg [new file with mode: 0644]
doc/telegps-oneline.svg [new file with mode: 0644]
doc/telegps-quick-start.inc [new file with mode: 0644]
doc/telegps-release-notes.inc [new file with mode: 0644]
doc/telegps-specs.inc [new file with mode: 0644]
doc/telegps-system-operation.inc [new file with mode: 0644]
doc/telegps-updating-firmware.inc [new file with mode: 0644]
doc/telegps-using.inc [new file with mode: 0644]
doc/telegps.txt [new file with mode: 0644]
doc/telegps.xsl [deleted file]
doc/telemega-outline.txt [new file with mode: 0644]
doc/telemega-outline.xsl [deleted file]
doc/telemega.inc [new file with mode: 0644]
doc/telemetrum-outline.txt [new file with mode: 0644]
doc/telemetrum-outline.xsl [deleted file]
doc/telemetrum-v2.0-th.jpg [new file with mode: 0644]
doc/telemetrum.inc [new file with mode: 0644]
doc/telemetry-docinfo.xml [new file with mode: 0644]
doc/telemetry.txt [new file with mode: 0644]
doc/telemetry.xsl [deleted file]
doc/telemini-outline.txt [new file with mode: 0644]
doc/telemini-v1.0.inc [new file with mode: 0644]
doc/telemini-v2-top.jpg [deleted file]
doc/telemini.pdf [deleted file]
doc/titlepage.templates.tmpl [new file with mode: 0644]
doc/titlepage.templates.xml [deleted file]
doc/updating-firmware.inc [new file with mode: 0644]
doc/usage.inc [new file with mode: 0644]
doc/using-am-products.inc [new file with mode: 0644]
doc/xorg-fo.xsl [deleted file]
micropeak/MicroData.java
micropeak/MicroDataPoint.java
micropeak/MicroDeviceDialog.java
micropeak/MicroDownload.java
micropeak/MicroExport.java
micropeak/MicroFile.java
micropeak/MicroFileChooser.java
micropeak/MicroFrame.java
micropeak/MicroGraph.java
micropeak/MicroPeak.java
micropeak/MicroRaw.java
micropeak/MicroSave.java
micropeak/MicroSerial.java
micropeak/MicroSerialLog.java
micropeak/MicroStats.java
micropeak/MicroStatsTable.java
micropeak/MicroUSB.java
pdclib
src/Makefile
src/drivers/ao_companion.c
src/drivers/ao_lco.c
src/drivers/ao_lco_cmd.c
src/drivers/ao_lco_func.c
src/drivers/ao_lco_func.h
src/drivers/ao_pad.c
src/drivers/ao_pwm.h [new file with mode: 0644]
src/drivers/ao_seven_segment.c
src/drivers/ao_seven_segment.h
src/easymega-v1.0/ao_pins.h
src/kernel/ao_telemetry.c
src/stm/ao_pwm_stm.c [new file with mode: 0644]
src/stm/stm32l.h
src/teleballoon-v2.0/ao_pins.h
src/telemega-v0.1/ao_pins.h
src/telemega-v1.0/ao_pins.h
src/telemega-v2.0/.gitignore [new file with mode: 0644]
src/telemega-v2.0/Makefile [new file with mode: 0644]
src/telemega-v2.0/ao_pins.h [new file with mode: 0644]
src/telemega-v2.0/ao_telemega.c [new file with mode: 0644]
src/telemega-v2.0/flash-loader/Makefile [new file with mode: 0644]
src/telemega-v2.0/flash-loader/ao_pins.h [new file with mode: 0644]
src/telemetrum-v2.0/ao_pins.h
telegps/TeleGPS.java
telegps/TeleGPSConfig.java
telegps/TeleGPSConfigUI.java
telegps/TeleGPSDisplayThread.java
telegps/TeleGPSGraphUI.java
telegps/TeleGPSInfo.java
telegps/TeleGPSPreferences.java
telegps/TeleGPSState.java
telegps/TeleGPSStatus.java
telegps/TeleGPSStatusUpdate.java

index 3a3c6b5ed41bdfa7b015e50a8101318b7015adaf..7f0d12b16610a21189c5d991c4845c3fc6c17ff5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
index 1af40358ae7e04ad170aa97cc2e3ea4759cedcb3..e4b9664b4c39c7b520de6bf68e595b8bcb6a17d8 100644 (file)
@@ -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:
index 611fd88353523858f9b26c41601d0858ba70cb1a..a570645a860ab67252902115ca349ce33c9f3a03 100644 (file)
--- a/Releasing
+++ b/Releasing
@@ -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
index dc613bf2d45f290505792ffbb6656124f3be8f4a..e8b0f26c2596b891f6982aa105d7817795ce0c4e 100644 (file)
@@ -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"
index 976e64bb0e195c14ff271f84513198637ac0fb18..baf38fb71aa854a24a24a30abac96c3eddd61182 100644 (file)
@@ -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 {
 
index db63d81017bd068f45e88d45b959f8501bff9030..df348c9d9aa65da09ced454a72f0671891ebc463 100644 (file)
@@ -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.*;
index 3a07212a226312995d2d939a4f5ca039b1428a86..b26a9bc8d5f56e9d455f459fa74c0a857564ce9b 100644 (file)
@@ -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());
index 7cbba794fa65722b863e0bd3e5280c0dab7143fb..0e3511d3778c562264d4f53c656f0f226c642cb0 100644 (file)
@@ -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 {
 
index 5f6ff1987163d90230a62f15c0e48020ec5fe9c3..59f08c341e4f80f3ac7042c3b3c003f2edd4a0a9 100644 (file)
@@ -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);
index a4e27006ee37ab0d2d19e745877f305760ec524b..02defbcb6aac4492d3d53ea423adc4604333eb7a 100644 (file)
@@ -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 {
 
index 2ff711f57fee683abfe82a011b9bdc5c5307c2e5..14e6ce73359ebbd099343ecf00d5bfaea339d991 100644 (file)
@@ -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";
index 9d612a1ed897ba33ae3036694a9318c867080737..792d06215bcb9ee08b38b1ed25393686558e206c 100644 (file)
@@ -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;
index eb0599010729058ae7ac22c97ea55f57ec3d7766..2875211050ebc21a436186ca5005b44e0c63cb53 100644 (file)
@@ -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.*;
index 4ac95c0ba47e69bab36bb0eca1b05eab65e83550..1032709168fb8689706efa6b5ba870dccb89c107 100644 (file)
@@ -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.*;
index b7eb76a579d5bea42eaff76e554450cf80a8bb5a..12055dc51f74c507e82d4e39b409266dfeaafb7c 100644 (file)
@@ -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 {
 
index 325b89d2f553a0186a053b84cfc3c6108339fd12..bdc80003fef282890c0cc22d2748737a1528b9f3 100644 (file)
@@ -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;
index 8846e56cf20a03325c69336028104e6feb389975..e1677ce6a760ad6922f2361802defa9425fc2b3d 100644 (file)
@@ -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;
index d74620897662eaf90c3f633b3a77b4de731ff99f..e6ce38093a78d657ff74d576e7dfc2cb3f21c188 100644 (file)
@@ -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
index a503f1bc4c2bfe0ab9a8f0984e553b0fe77b169d..095d6b3349223e7a4e3aaf09125d95d6816198ca 100644 (file)
@@ -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;
index 54ccd18f7e95e5ab5f8bd8e1fb5b4d61e616c424..3c236d58e84f642168fac6f4330300177a6464cf 100644 (file)
@@ -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.*;
index 4d04316f6f626c7eb6b09f4d64a7f3bd8fbbc048..f5fbaf61ba710205897692a611942093956fa7e6 100644 (file)
@@ -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");
index 19bb79d35b06419b7583868cf185bf5bc2d3ce16..ee82d391e9e730e1c5052a7fbb4e6690f17bfd4a 100644 (file)
@@ -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;
index 79020c16f4859083bbe6c1564d2caee87e7b4cf7..6f595817f556dc0c68b8f4135b5c5b4798486fa3 100644 (file)
@@ -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;
index 3199f25238477c9261361a957615b767cd741d2b..473a4bfb3dd5b07f06dfbf9209f6c705c77e665e 100644 (file)
@@ -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 {
index 4a056d9550812f27c885cbfce3d1e059361bb344..92a7ecfa3863b2497986fe621da7f26e92a7bea3 100644 (file)
@@ -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 {
 
index f9191a32ebdcd9010d0eea39e354fdeadb7d56a8..c81dfcd2845453f6e0ab2514e41bec3e95638300 100644 (file)
@@ -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 {
index e4e7df903a27aa5cb8d89b249d0abc538d61f349..e12b637564d884d28d7f4b5613c3a92cb710c7d8 100644 (file)
@@ -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.*;
 
index eaff0808fb57493c314a2461480c4ce618630f54..d233751252abf4a4f53d86f296a17db7fee82f2c 100644 (file)
@@ -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;
index edb23e69f93183eb80f31f7785cb31741d655ff0..8a389812643af28fd207d5573782967842a5b2a0 100644 (file)
@@ -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;
index 86b23eb60fd11bab25ce9995dba6d59b1958c37d..87e701cfa6703375bab0f209ec433322c0cc2385 100644 (file)
@@ -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.*;
 
index 8e0529344d50cafaf5077e9e6bb3a62dd953b80d..7a518ab4e1babff32b65137ff6e98399b6e2634a 100644 (file)
@@ -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.*;
index da11336d8bb050cb4e188c7e1e11b68e47d69b14..d1d0d8d0ba42ed40e0712d8b35e23ec0f83ca071 100644 (file)
@@ -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 {
 
index f8a2fb14353fbe1ff08f819b4146916623b68224..3306aa4bfe2c0844758d9d3e21e5e036d21f884a 100644 (file)
@@ -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 */
index fd2f5750ef6ed4aafd79970438408cff6ddfc760..59092a6fcfa262442cf4f903e7b7307eaa3c59ef 100644 (file)
@@ -18,7 +18,7 @@
 /*
  * Sensor data conversion functions
  */
-package org.altusmetrum.altoslib_8;
+package org.altusmetrum.altoslib_9;
 
 public class AltosConvert {
        /*
index 16dcf6f5fac321c33ea4183b5ad23f179524920f..35f51dd4f941722e35078f37c17f56ae6c475a37 100644 (file)
@@ -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.*;
 
index a05fb7e2e5380ca6b37a2d877ef1bfadec1d8bf4..fe18250e6d72d19893ca0ac13ca271bcd95c72d1 100644 (file)
@@ -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 {
 
index 194b10e801d3f9c96c7ef168ed7dfaad3c46e791..7379b5106b31ab44f2063214bd1e3687e806495c 100644 (file)
@@ -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.*;
index 9174c6a9c75193b1b15b03e751804f9b888b6078..b996eb008508fa2d60e16a97255f8f9282d8883a 100644 (file)
@@ -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.*;
index baaeb9933c05b9a75bb2d6cc073dd05b1cde6ec5..67f7fc57fc841b105056b4c1403f2f219b24b0fc 100644 (file)
@@ -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);
                                }
index 33d4f63be4521042d06de1eb9dc02b19ccbfed40..d88aeab9e77a33fd6e567b69a913cc527efd0c9a 100644 (file)
@@ -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;
                        }
index aeb61661b9c9d7e0ca60d92c1a8c5ff482b6fc3f..07ef2920a7d49490a399cba5307372c453644b8f 100644 (file)
@@ -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.*;
index 95ecc32c73264a9f5924e3fe8cf5857ef3ae63f7..e7ed93b09162f766a9842511e56ce4a2702a7013 100644 (file)
@@ -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.*;
index c3cd5d86c87903c00ea9737b5dfd0765eb57576c..f607fbd2733866ea8e64ae4936c4ef7d30c823f5 100644 (file)
@@ -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.*;
index 6dc6a3d655f6b1d7014050c4dfd050c53873736c..12d10b6e002bf01ce79c18c1c978758c0d4e1d10 100644 (file)
@@ -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.*;
index 538c102bdea1ca0d96c0f4264a60aac23cfd7935..d1a1ab6caaed0372372808d4ec3d683f299773d8 100644 (file)
@@ -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.*;
index d5f0e0e0f0e422fdf84bc0b28fa6e23bbee72aa2..db8ab3a86ca1ea2d85c29c4deab6a4e2dcaffe43 100644 (file)
@@ -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.*;
index 1b4cb04a3dfff898ed17fc99b52b21af36538d08..df0075b990e895a203fd7a0ab258e85d8138d799 100644 (file)
@@ -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.*;
index 8d0343b80738f442565a7f04ee0eada667291606..228145eb4a0bd74079b686d0b25cf71d8ea106e3 100644 (file)
@@ -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.*;
index 1c1d1010dd6bc10d8d548ef028f3ad5a4dbc992c..800dc0b937b1fae01b116a8f33e6ec286485ddff 100644 (file)
@@ -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 {
 
index 44b98e49b8959d1eec14ca7e7a20cf0d7c2b4d42..316058e2141b1adc4079057fd17865fbe479a42c 100644 (file)
@@ -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.*;
index 0a37a2aa68a78a45fdbcc054a0f7483415937b37..090b65e3a5ce2ccc93ee2b1536df6f3fc7d0a0cc 100644 (file)
@@ -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.*;
index cab38d6dd20d8d020439e28ec2f52f9f2ab5cce3..b8d62179b6f27dfd08b3020482917c64a5182729 100644 (file)
@@ -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.*;
index e4b980b07cc1dcbdc97a906ec639e80fb13a5b77..627b758b3800559c51750355106f82fc8467810e 100644 (file)
@@ -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.*;
 
index 6a7351f367a2c32efbd257f91a836017e1041167..e977c579bed8e04ecd7e691b691b40574ccf4cf7 100644 (file)
@@ -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);
index 33d71fc339884e1f51b1a7d03ce932396ba6072a..912f470f07c98db37565316d0b0ad1c5b76ca85d 100644 (file)
@@ -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();
index fca0f20b04fe5cce36e93ad086ff04747ac94e5d..84b2392befa33113124d56fba76605c0783d0fa0 100644 (file)
@@ -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.*;
index b837ba841bca3f2035dbb2362ae9117f949872cc..39e8cdae106ea3ea165fdc6c32e802172c2eaa23 100644 (file)
@@ -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)
index 7804935000b9fc9a49477ecffafbd57fb54d4988..ae23e13cf8bfc8a0688cfe27b85f84204c20f0bd 100644 (file)
@@ -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);
index 6d2bb8d0a5836dd0e3424ba8643f4eece6eccb4d..7c6ffe61d5120ac05041316d13978604922817e8 100644 (file)
@@ -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;
index a2584e7789330703ea8e8562aa9bb6450b94831a..a4cd20618f7c93345b488d5f703f2bc57ba07729 100644 (file)
@@ -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.*;
index 44782003a68aab9ffae87c62aa4a472584f583d1..3f9e479e36614bee3900b2119fa9ed1c7ff46907 100644 (file)
@@ -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;
index e13eca487cbd93ac1e53efc8492dd0256a8d89fa..9ced17e7c82dd8b8dad66f7a467001ccff1cc111 100644 (file)
@@ -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.*;
index bc20ef24a20ae13d3481d0cbd24d75524ce18b41..5cc3c20c7039e98536303a9061948271e79eff89 100644 (file)
@@ -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 {
 
index ece822d83d6608f40aaadfb3cf14c4ca07f86380..fb036d0c1944b4445a9732a42d1ddddfdcedbe87 100644 (file)
@@ -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;
index e1561c7dcd64f58ac2d1a031c02e5f3ecc3f7caf..0149fde1f6052fdc78f44d2f1bcfb9b52c84cf70 100644 (file)
@@ -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;
index 7a4a705d9df238271b34614fd190b9dbcdc6ff87..285de8cc9302e931c761648387112d792a5d2bea 100644 (file)
@@ -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.*;
index 0e2576cda3df01666f36660cf46a50c0fb2d95da..2e5981dbaa73a8ecc3e98cc1231a07bb1ff90344 100644 (file)
@@ -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.*;
index 6c0d130ba6571a876eec58cf95413f5572528ddb..48db6ab444983a752b5d93eab32ee1c247739f27 100644 (file)
@@ -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.*;
index 1b62f385fac0714b2667cde1a8bd032e721e0c40..d5c1a4283d41b33f0735cb2e4e7f6f946ff655d2 100644 (file)
@@ -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.*;
index 1d06c4d9e2015c2dffefe110e773f2d3d26da776..5b751e52e3b1f35c532fae855abccb4cd0b63d6b 100644 (file)
@@ -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);
index 39f792db582ffe206dbe07a6cedb28f64f090069..d5348628c73ce500565997a56189830ed2f82ab1 100644 (file)
@@ -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.*;
index fc0192a358a4fd6ef0e9d34f62a44556cc41b0b5..7a0fe9dd781c8a11326fdb8885d770fc9f33c44c 100644 (file)
@@ -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.*;
 
index 814339580cca39a4975cbaba3c4d46393da8e58e..d302535fabb1bd4646983cae63cdbe7922536f41 100644 (file)
@@ -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);
index e438a7872df25cf949f9296efb8e84373cc2d79f..8cd851e58d18ec6f18aa5020c31e0e3f4511a5cc 100644 (file)
@@ -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;
index 7091ce9ce2bdbf655836772ed41deeea646bc08a..51d77785a3a7e35077ce4c0a3e5d2eef75628b5d 100644 (file)
@@ -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"; }
index 0fa9bbd439c0d1fcd98e23c862b8e800d2373787..7958d186c6afb9fe942d324685d2a408ba0e390d 100644 (file)
@@ -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.*;
index f46586607b1f6e35ed97c7019cd8acd0d0db944d..4270dc4ac60766390d1566c5be61fad4fa112a05 100644 (file)
@@ -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.*;
index fa4026ba0f71dbcff27d80984f17b4f3cb417b48..4e843c10dd26b14c74e4d42c763f1f05afa536aa 100644 (file)
@@ -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.*;
index e82b1c73bf990f52883fe98cdbb6a48a78b89b12..575cfc1a13721b4af9070e96767bd52ddfe4c131 100644 (file)
@@ -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.*;
index b18aa9650b4c43412708e98ca26db1b5262d5c2a..cf3a1984ba836c2983c3e7e1669dee6cee4f7f41 100644 (file)
@@ -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;
index f8bf4702cca713efdb2096eb4759f0c87c7861df..109674175cab607949142b3c3a9642a7e9ef17d2 100644 (file)
@@ -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.*;
index 9d7922d59c206ae1dd5c126f59cd90ebd6fe2c85..7df5c9bfa2724a38024d94efcd69f94f58f8a2c6 100644 (file)
@@ -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.*;
 
index 231cd94b3488a2b5edab0daa52457b94b95ad3ab..436e4b0277f1a6960ec9dbf2542abea873bba644 100644 (file)
@@ -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 {
 
index b89bac38536f0359379d1c1f2b506581df694621..58306d5570742da65abbf69fd962df6b993f6279 100644 (file)
@@ -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.*;
index e3e532826604690f9cec9bfd311bbf985d56d250..bc0886027c18afaaf5e702599e2dd5bd69c5ea81 100644 (file)
@@ -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"; }
index 351125bf407d6919d116e30d5e3d2a4e7159ce24..3643ca9e652228be76b13bcac7baeb31e340f725 100644 (file)
@@ -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.*;
index 8a3266c9908bccfa930fd3f65f003f2cc9ce071b..6c08f2d73ddcae1d0cc31caa89da8e93528cc424 100644 (file)
@@ -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);
index f0ad433c391d1639c8fecd13c81daed7ffc93f6f..744790c6964c236928081a36cc00f5c20849579f 100644 (file)
@@ -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.*;
index dec181bc1758662bb0ac8be4dfa44e5b080580a0..c040963021042a8920f7c48a80fd07c5406e05e9 100644 (file)
@@ -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);
index 45398ecd5046b5e849dc02452bfb4bf8bff20ed1..0a59a808710342d1bbbb25bc01bc9812f719370c 100644 (file)
@@ -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.*;
index 09ecb0c96275c1b691a65222f88d3ca36f4933c4..061f226e141737aa6569b3ad7d2f9851343e9c9d 100644 (file)
@@ -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;
index 8573489a3873c38b815959d148092f2d4a254511..9ed93a42c1d05320aa112738e1075fd2ffd1b9cc 100644 (file)
@@ -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.*;
index 0b41d9f4c9baa14045d3b6f1e72788a5013b75a8..798270ccfe8828e8d2e85c9303091338a06f9b25 100644 (file)
@@ -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);
index cc28f438b7e850c502dad5f0b15117291d78bc9a..e87c168d6e114be8c6d293c612ea1282319f7ea7 100644 (file)
@@ -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;
index 6967f4797607c24bae0d46d13c1f7c7ae7639c10..64be49be54fe3ce1f2bb18890b3f8409d520daa8 100644 (file)
@@ -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;
index 0af989978a0061e7d4356c91fa082e6f2d290d37..d500a7dbd3627c3251f1c94cd4caf08748245d8e 100644 (file)
@@ -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;
index 9fdab1a0f0835724cc69e821fa64665c396a949b..9c116b824aec133ca8e748f812e23021f6f619dc 100644 (file)
@@ -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;
index b24fabc8f29030c5a3e10f4065d621e12122b3f2..c06384339eaf55f23580809d9528389597f86619 100644 (file)
@@ -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.*;
index cef4f926ebfec0a56cf3d3c9418d1208a9f886fd..8912caf7392982d433b88606ad10e89c8c2cf1c0 100644 (file)
@@ -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);
index a6ba5da53043b056f16caaeb08714fbec79e5777..23ab64e438ca68147e21d80caf8fb86c7738385c 100644 (file)
@@ -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.*;
index c02483bb349b160b6f9b11d6122dc4508639a685..83c1eaeded0220c5383e1a8414e22e9a948cf0bf 100644 (file)
@@ -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);
index b8f2910760baa6f22d09840ad80739d52e562cd6..ae78befaa2a3f9d7b1290e351c769fca8a8f7eb2 100644 (file)
@@ -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;
index aa067303d71efd0f3a78f7c40a13a24b442b1539..5067aaecf0391972c824e7bd55a95166a17c6bda 100644 (file)
@@ -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);
index 8b1ac088d7dcf5db97efe3ccd899087964290622..17aaa3f8c11aecf0cef0e2e8288dd7f415aeba82 100644 (file)
@@ -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.*;
 
index e7ca1ba34fb1dd9289efe3a0c31801783504ce0f..aa16e231539e45fd183ccf99555a985df24fd8f2 100644 (file)
@@ -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.*;
index 6ef2a1425133563009715c8eac4d673de8787ad2..51b48666094204e1eb7d39f3e528053f7ddc5c43 100644 (file)
@@ -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) {
index 1c2e2aab2258eb8bc6394aa50d231afa93713aaf..a2d501b25680aaaff45355bdbf4fe5ba508b2e5d 100644 (file)
@@ -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 {
 
index 8f624b96b5ac3faca117cac564dd93828636f245..18ef807b9c963d88f4842d52e02090913e309d97 100644 (file)
@@ -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.*;
index ecfcbea7491a2bd15b5e768e0bac99179a377380..a358ea66db118e4ab7b230585c94f7b28386add0 100644 (file)
@@ -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;
index e690aa430caf5235963118dec4b1c7ff8754da7f..5f9591cc624f147dcf19af3d04f0855d6183414a 100644 (file)
@@ -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;
index a1e76834541f0e02f600c0c5cf1bffee5b0ad07a..91cfc6b6fa76d5a8d0f5c891d7118e1166759a68 100644 (file)
@@ -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.*;
index 3154a519205510e4b1a312f96bc0041af3e97900..f43c2ec9d68c269f9a6840d5bf29d6e3c7455100 100644 (file)
@@ -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;
 
index 74ab42b54e03912bce2fc701346bccb51fbfacdb..7f9b277d0857b1836b6e89d3e2eb0fbc7299ea98 100644 (file)
@@ -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.*;
 
index 9b7e79f33048ea07c7ce4ce96c7b9a948c427c9e..851e35fb3ba2c84307e31072a81943512cc1b186 100644 (file)
@@ -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.*;
index f78b50653b4e474849418db7cbfb7575517f3fb5..e96aa7db0fca1c7d90cf462f6ed39a7b3f044018 100644 (file)
@@ -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 */
index 1b1cc9f48f22baa8cfa523aee54c86124669cf56..6933198a3dce73804e70904c4c0140d3b216d95d 100644 (file)
@@ -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;
index 9419ec93060856e23d49dd1147b90af485b9d755..5dcb870299fce47a5f4e6008d228b58f7b30fd3c 100644 (file)
@@ -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());
        }
index 28134aebb4c02af0588d5d780e4a6967d676bc10..9c6bb6682c8712ad18d2d444c60d753a9fd237ef 100644 (file)
@@ -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.*;
 
index 9771c1660f7716718a5f4756ae16f39b50a92e86..e3c4dd56b539fb2ed6ec9b56b81765e2265882ea 100644 (file)
@@ -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();
        }
 
index e2ca9f73f274ad80a476a0dea3ef13a3de7733f3..a5a69c9523151984aa77e40ef0933426220239b8 100644 (file)
@@ -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.*;
 
index e2988b566e8f534cbf71aed7d5330a8071847bc6..3aa727b3db25db874943db4306b470e3e6c18544 100644 (file)
@@ -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.*;
 
index e8b7b0445d81519567ba7c7edf34b08fef37c288..825cbd5d4ff8e39213860f0f655d7ddca852e6a6 100644 (file)
@@ -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;
 
index 9be29ae012ba998b657c7559e280865c6efd71ad..c0a92a18e91bce7ab660236c7b4240063c01fd69 100644 (file)
@@ -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;
 
index 1f71302e441a3e5cd6e09889ecdfca27bd1d9c70..f38d7b4461961cd032a4c1858fa54639927598ab 100644 (file)
@@ -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;
 
index c00e00d5738f001e2c67cb4231d55fa535edcf71..fbc10fdd2a980a194291ccf067e2e527ed8cb156 100644 (file)
@@ -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;
 
index 64cce64092dda752fbd2eec83af1982707b1f947..a2d22e9a1163c569320120a2db4aaaeb59b92e27 100644 (file)
@@ -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;
 
index 4957b94d9433e4a382cb197b0812e10c28aa2a78..e044956871a9d1601703887407d22a935a19a632 100644 (file)
@@ -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;
 
index 9b2db2ffda37aa27375560bad83bee4274e00233..74ecacd69a0c4b7c002772ceee42503c16a67ae0 100644 (file)
@@ -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;
 
index b9fca82b5cb02c648613a6d023f3522f3a33642c..45bd4c6a489e56643889dd71af6c95dc02adf5b5 100644 (file)
@@ -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 {
 
index 4edae54adaef19185e2735abe0013a68d9e29fc7..523f5a70bfe4ff908c19484b20c673c9f280e077 100644 (file)
@@ -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;
        }
index 5533468bd4db9ad2252418504944d2d8af229604..13b8f4cab0c0d232889d843c38f8de6baaa742b9 100644 (file)
@@ -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.*;
index ed2e1826399d2d67c6b931f5a8968d37a0b4f747..682128468f7351b26469e7556b06da26c87041d1 100644 (file)
@@ -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;
index 4c973cd95466519482d88a0d503bc7643589b9f5..0ba9849a6c4c59fd24b0b1cdb3e2207dda82d716 100644 (file)
@@ -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 (file)
index 0000000..c47f948
--- /dev/null
@@ -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);
+       }
+}
index c4cd36b254981c0f7e457c4135a236bfcedf713b..20381a53f7cd17125675b47bc3ebd566bc45d4b5 100644 (file)
@@ -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 {
index d2275f542df83171af40de4ec22d4c77774c90b8..a762f615263fe85cd99db5579360ea3958969034 100644 (file)
@@ -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
+}
index e18f7edaca45402bcc93b69b4d25007a1521616a..b29881e8ab4ebaea0e9f8336021ec213cc3f1660 100644 (file)
@@ -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.*;
index f8e72c863e0ce22b6e9651c0c9e138c221fef5c2..b3071a4bb24e71c00cd96779c8cefded0115047d 100644 (file)
@@ -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.*;
 
index 9341d0032dae2c8f4bea7661f575598637127dc9..6fbed4bc78e5659e33758ae25e02880dea2975bf 100644 (file)
@@ -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 {
index d32422547b7e55c7139eec3968c0d358e12e419f..5aa0c41d45bdf989933a50f9cc83c389649167f5 100644 (file)
@@ -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;
 
index 2af8d931d857f873b39fde3c972d4a880acbdc98..496570517f6ed40430d06c10364dfc319445ed7d 100644 (file)
@@ -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;
index 77a76cd7c9b2bdf12e916ae35df3d6d5f914e4ed..2f6256fcc10ec013fb7475370776502c6c26c2e1 100644 (file)
@@ -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;
index 17a3410a422896dcb47d71386f992af9957b6c96..4fbb9b86f3ee7fe427d93347d5236058198e070f 100644 (file)
@@ -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 {
index 71fbd54497bb25e522d06fd1f1b2ec1029ea21ab..3769c129146cf34cfe1cff7b54d1131b5fdc2d34 100644 (file)
@@ -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 {
index c9fda5b800407267dd7daf2fa7ca3c3993d54f97..173fac42353d9f447b37b8ed0e1e269bcd8bea18 100644 (file)
@@ -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 {
index 843ca4ebcc2e4fbc097262f9c4bd7e5482b48907..7fa12f5e0929ebe0ad7389e0053de915449f9768 100644 (file)
@@ -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) {
index cbbdceffec31f2895ea09a48fa3fd0ea28678dde..2d76f281b657a1841e4de9adcd33f310b26bba67 100644 (file)
@@ -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.*;
index 2f4e335414c392fe5765b369ffe5c71c01b0f1dd..a3a8abfaeecebe0a8b476c5b4af0164397380f63 100644 (file)
@@ -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;
index 27cf22f0844010093820cd396772a9c5d5c85c50..578ac2dae8498fe53ede7f4e2a798e1ed3b21446 100644 (file)
@@ -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 {
index 2756182616f7cec6a2d79ac0d9025854feb3ffa2..5a147b2b1da71a5142962232d3ad7463fe4ae1e0 100644 (file)
@@ -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;
index b4d465a0411026e86468834fd78555368f622df4..19e3393dd78e42fae6a2d381f278627c05079da5 100644 (file)
@@ -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 {
 
index 6b4fff0c2b0a80bd928f1c66562b7236516f014f..c211eb6d2648b5f3bb23cd91bb8cf22ff4b2f2fe 100644 (file)
@@ -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.*;
 
index 0e31492e1891d5b9606f7953c921fb6cafcd4487..f71c42709e7f528c83b904a1573c63eb9f73abe8 100644 (file)
@@ -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);
index 89ed400fc90c5d10575e47e77f5313c0978c8856..8c53ef0d267b16c7c218c9c21bb85bbeccb5134d 100644 (file)
@@ -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@";
index fb6f41ee622d37ea71cc870e04d9820796563eab..34f4620ed2323335abd7cbbd7586097ebf48b34a 100644 (file)
@@ -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 {
 
index 1dcd3391fe9b373e28503895fd35636bcd49e014..b5cc34f081099ee74ab02503363a6b1ba376c707 100644 (file)
@@ -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 {
 
index a6b178fa167fcbee9efcd110222432c5c7abf8ab..d1f8f2652e6329f0cce1db9c44ed8e6c913569d6 100644 (file)
@@ -96,6 +96,7 @@ altoslib_JAVA = \
        AltosStateUpdate.java \
        AltosTelemetry.java \
        AltosTelemetryConfiguration.java \
+       AltosTelemetryCompanion.java \
        AltosTelemetryFile.java \
        AltosTelemetryIterable.java \
        AltosTelemetryLegacy.java \
index 4b3d17fe727d8bcb903c490c026acc09bc9ec235..aae2a79317756e3ac5ff8c55f90199a004862f26 100644 (file)
@@ -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 {
 
index 453246bcc5c2ad16d918d4138dd12483820a2ced..2fed6e7ced6a8dfded5c797a1cc557d0cec71b20 100644 (file)
@@ -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;
index 28f26a62c9e4442a8adabfe658fe85aa21a1a861..f5080f565f733c7d365e4c728f30b3a45c79cf49 100644 (file)
@@ -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;
index 39ed5ca4ca05ea5ea66d63ea1cbd81eda212f43f..50be7f8edf688fe37a4001ce883b92127ed4eb98 100644 (file)
@@ -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 {
 
index 50a25f00615b3f86b68e917f95ef7849e97805b0..4ad624051a286a3b68789cdbe160bb7b74d7dcfa 100644 (file)
@@ -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
index 112ebbc6164ded3f0c68861bfbd5d04ebdc4494c..3958a013b948d6a39399996373f7b9f7ceeb436a 100644 (file)
@@ -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 {
 
index 857ab64d734eda21b98cffec34d8fc14549dd83f..94416465258676b4ea32e15c0b47553ba4f201b4 100644 (file)
@@ -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
index 76837b31159d2e0fd31ec12ea59acb581f2de29e..a421621299ce364bc11b4ae9f2f1c12df3befe84 100644 (file)
@@ -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
index fa815762db78008e1adc8428669aba387289184c..3d8bb754b0ca3726e969dcafcc9f178b68b64e29 100644 (file)
@@ -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
index f5b928169c29e4e4aeee595e7c21aa8c54316217..9257f069cf09fa5a4e0f7e2f85e460362a2b0e31 100644 (file)
@@ -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 {
 
index 815a6fa425d1c459bd0867253f74e21195b47810..cffed41d57d2f81d99afb48bf183fffc29e4f63c 100644 (file)
@@ -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();
                        }
                }
 
index b5587a8451534c7dd0853108c45b12674093c552..f8a643fe2fb6ba515e7d223b137f108f4bc0cfc2 100644 (file)
@@ -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 = {
index 9768c6d117497622cb92d2d554df244a86781559..9fa813d2912f039739d059c3d783b9fd30033db3 100644 (file)
@@ -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 {
 
index db33e0d949127b27ec2b39ee4272a463f93b683e..d7646a77fd337442a1c522b7f288f6a0519948fc 100644 (file)
@@ -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);
index 6e45a092a678b1fc751181ce223135fc0782637c..8e12f229a8cefd710372a80230817af4cc069f12 100644 (file)
@@ -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;
index d54b05c54f35719743166cfe268f53e95466688a..565ab1b1207c3340472fc6753e383fbb1f28b5ff 100644 (file)
@@ -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;
index 14a2b606cb2651a4db4036645ef857c587f3b569..01d58b5eda1e17c6425fc581d7449ac5701ab989 100644 (file)
@@ -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
index 682afc5e0f0fb6d1c363fc442e07c9cda0d58fa7..e0f9e92119f806364fe89e04598a5274f5eab227 100644 (file)
@@ -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 {
 
index c2997b29684dfcdfe12ccdacd9293df8da54d248..423e0e231f7068a67372576b5a47558ff75f84f3 100644 (file)
@@ -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 {
 
index 6dc1ca023772e318713ef68c434ddc65b28ed2b8..da0dfd928097fea2067604fee2c72853c6838d84 100644 (file)
@@ -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;
index 132001bffeb306cedcb233d35b7f06f605298829..e6bc7929dca3a36a8e17ba64db09e9d7ff01cd8a 100644 (file)
@@ -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) {
index 2f87b6818db55e5c86a7efd8ebb65508bd5d2dde..f984e90897fb9e20cbd7ceb48ca8da43e2eb8f17 100644 (file)
@@ -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)
                {
index f6caa4ef55b66ba727f4a33382deed06d1918dfc..de6aa34c7025f58ed30fbbaed678e75fd26e9a6c 100644 (file)
@@ -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(),
index e6de1d97345ddb66b7945f88b140b3fc20c72c42..dce8420ed6923c6ba20320f935d4f00b92b95e31 100644 (file)
@@ -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)
 
index 2f22a4a372c24f58d702a04d0e5c16adbddefebe..c88b9e349fd1da5392a5c0eca876ceb4a914e6ee 100644 (file)
@@ -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"
index 0d7d07c04a570284a8ed89cfb46ecd3cf6896369..01421071283f20c2e2fa8dcb55e2b360d96b3251 100644 (file)
  * 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 {
 
index ca6c436e7db5a449ba80a5cb2e8c8525f56ba109..b8c4c6cf25e3579f47c66dcb396dc77c7e7cf5f5 100644 (file)
  * 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;
index 0d10fafd991cdf856a461c1884395c199a7b2dc9..e444d310fb610a6c739b9638ad5a55279f6b8643 100644 (file)
  * 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>();
index 8a912c946068905bd2a049a05d2a420f8fd50129..65744141283e0a16a8fd10d4d47875ba0a0005bb 100644 (file)
@@ -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;
index 281a9081091aaeefe2880f077e95fa25a8d6a66d..d5796cb177fdb84999414581d271612cfef7a764 100644 (file)
  * 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
index 04d93f6e59a8a5ea89e63e78b54c5e51914913d2..ccfdc1a387b1726fbc8e6f89fc370921932372fc 100644 (file)
  * 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;
index d30aec3ffce9c5ee217c0a9616ee01b7a5afeb39..f7bc516b82ababd61a72f2f802f49bd1699bb605 100644 (file)
  * 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;
index 64a99596a6a205d7b3844fc01f6be43aa49bc024..f78fc2d0c672e9b4be64f2f174f09c8b36753f8f 100644 (file)
@@ -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.*;
 
index a3c5d2835745c583ec6e7ffd93fb254cb008b483..52083b601877492a62bdfa663089a1c3c99607e4 100644 (file)
@@ -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.*;
index aa6d323f345a650127453e7007cd1c8a6b65ab6b..908e74e734d7b826bdfe5c524f463cbb88fec1b4 100644 (file)
@@ -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.*;
index 73d85698ca98f589373d894a2f7f305f9b1305d7..9aa31aa1d007e9b39bbc40399f92db7ae0bf1f77 100644 (file)
  * 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);
index 7648382d84fb08e04f978ec35ca95544077a24bd..270b049493946aa40a090d10e6cd70a5c58ad04f 100644 (file)
  * 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;
index d97edd12ec9059041d98a0a631ac682a2b7ba1c9..14cfb127115e518774b134a8af31e942ca97bc17 100644 (file)
  * 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 {
 
index 28fa734df33a060a5cb55e60b8d5601968cf19a6..41d447bca5dce1cc43d5e63932b4b9837f0ed89c 100644 (file)
@@ -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.*;
index 5f0df7d3ec1b4e3eab77c5ab8886b78bc717819b..0c8083cdae86b4d638397c8b5477148925e34117 100644 (file)
  * 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;
index 56b10ef0b09a7c8efd41ce375dfae80c2be9cd20..e5c45ca173c1e9cc443febd5eba1bccafc2b02c7 100644 (file)
  * 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;
index 0ab085cf1279d776b7eb16277ef070eca7d8c5ea..33d432c8930dcc4105343f97c1f846e5b4b660a4 100644 (file)
@@ -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
index e55004e41593dde7624ff26763a00c813da2b3ff..912fc716ad52abc0cbf367c5067e138782bc1ff9 100644 (file)
@@ -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.*;
 
index 9c613365af69105c1866558095a592b84451ebad..c74614329f3c05bef78f949dcdb8ae42643f4ced 100644 (file)
  * 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;
index be013d579168d0ec6e9ffa36d9249af14aa9eb78..ceb730f9cff062f86301835ecbf39655285f965d 100644 (file)
  * 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.*;
index 30d436ae2dd1b6fb6674321cff2d6b39467ba221..6a38f4467dd721305b8911cb784f74f9b4152b38 100644 (file)
@@ -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) {
index 7902f40718448378e86b1dba96a832748eaf6010..d7d07c83328e99012db921eabdfef8e4f9bf009d 100644 (file)
  * 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;
index d87c38e22c2ffeb6bcb149afb70120523d3ba892..8e6558b19b5cdead5bfa771c672846dd44a8a15f 100644 (file)
  * 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;
index b47aa49388c5b8dbd386c99c5a69245cf0d501b6..fbe6b4ed08f0737f3d0b6bc8671fc418ed93d234 100644 (file)
@@ -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.*;
 
index 8cbd1d10f81b4bad2abfea4526ba4ad2073b072f..6ab5054905cdde4b33dd49160dabd702c2ef4680 100644 (file)
@@ -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.*;
index 0c900787304ad50e05fdb406b3b566fc9f216744..0c4fb3735fd4709421231a89aba84943145930ff 100644 (file)
@@ -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);
index 257674dcf10288ea15b30236cc6b1ab14509f33d..275070ee5ed740dfbe4ab4f142312b65872c6a8a 100644 (file)
  * 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
index e2efd4b348049a0367b603b2b296f776d52c18e5..bc647e8f4b6f06bcfe0417e22fbfa1248068a48e 100644 (file)
@@ -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;
index ff8d900abf35a2499c1eb4c957bb7adeb9760865..a91740c55ec86c81c45a0211229a5bc626392d2b 100644 (file)
  * 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.*;
 
 /*
index 2b198aec0c52a43f30ef05e4a23b9aac13c5aef4..d1083098189fe54754142e25e868162e2b4196d8 100644 (file)
@@ -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;
index 155e7ed6d4b44d349f3166f00707582e6129f9f7..b4024a178a9271899b2310dd9f254c1227308440 100644 (file)
  * 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.*;
index 146acda8ad139d9452d376e1f7b5270f0404ebe9..03967d19a912a8c6213a894ad3f627b940599b49 100644 (file)
  * 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> {
 
index 39b8f900933d32ddc8dafc6c392bcf69125a1fdd..1a7e12bf7602264d5379ddcb936192a18e3ed2c1 100644 (file)
@@ -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;
index 793fabfb3feff73888e94a93680bb3ca2d99500d..cf320265150b5eebeb999a83ad7a9001f86abc5e 100644 (file)
@@ -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;
index b74720009c01031a383f9eade3ae37272aba46a2..29648dbf0f9a213965a4a41b1c6c36d8130f3e97 100644 (file)
@@ -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();
index cfbf2cd3d80910e5c2b7cf3f058b06e3ed07fe12..2d0bc3c9da5c68205c541a4f589e8c93e7be9012 100644 (file)
@@ -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.*;
index b4d8d81e0631f8248785ef62f42e862e79a55b1a..42a09acf10b00cceda7d9e8f540c88b6ed0e30da 100644 (file)
@@ -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.*;
index a2a3e367d5fe8b61cb7820c736564fbb664c232c..0db1e5da5ad4a3ca89f9ad78c13781020fb8cd89 100644 (file)
  * 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;
index 7901510344086007001d7350bf66b19c37df0dde..b82f07f7cf1c935e32ca6db4f56a9573eb7aa52a 100644 (file)
@@ -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.*;
index 9479087e8be371d59196c633135da9cde7410c8d..e0e2ede70dce01141f10f094cd6a6c6a0511d0d0 100644 (file)
  * 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> {
 
index a11978d07e2b2e98d22376fa982c1328d258d883..9a669e323f9e545b0a06c226423fb2bbf8ff5d68 100644 (file)
  * 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.*;
index 0fe685ef89a7d940e8f15252ab9d5805ba0b78a4..0df5c1a7f68d03b5d02596f672c86ddb8e24ef07 100644 (file)
  * 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.*;
index 77743741896a2a538bb236905bfde4e3339d557a..8c09b2e7e3854b513a60f4c2fc3e7814fc580c2f 100644 (file)
@@ -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;
index 0a940d9787415a29a5367511d6857ba468e873f0..9bac992bc062238378c18140bfb565faa0312eab 100644 (file)
  * 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;
index 2fc203177eb7fcd7a0c79fe68cb5fde1deaeab90..1f1ad23b4e748e2750b14901f3d94d39d33c6315 100644 (file)
  * 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 {
 
index 5b49e7da9ddcfe95a87a46eb07787dd0115e0647..8f758300b1bc9a57c0c810fed7a8848c3fadc1c1 100644 (file)
@@ -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);
index 016a202be003fc8ee9b67c6c587a46053f3daba1..8de6bea2487fd19074fddfe21ff7f07e4113eda5 100644 (file)
@@ -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 {
 
index 2d4d45b2edd921bf80e49c46fe06a99c65b42759..c1c3f8bb59d3076719e3e03fb9f435921e1c8683 100644 (file)
@@ -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;
index ec5aae7813740aeb2e0a650d54c085549b623b86..7c5a91b0daa9a7b9c558aedbcfe10b80ac837094 100644 (file)
  * 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.*;
index 5602dc17b457b85d9f5f8dae02345694b2ffc3af..83099fa5fe5d907eea09938c5fed65636591b2ce 100644 (file)
  * 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 {
 
index ebdc8b7785c95d306c764fa03b8223c275f3e92e..6d7aa88bd75a09c6258ba90554daf50ff97abd73 100644 (file)
  * 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 {
index a88988083fa15f5a06e82bb8e7d21d690a38610a..8407f31d9b55cd97bf39f3285c7af571e0d413de 100644 (file)
  * 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> {
 
index d4421ac7e7e15e5b1a14e8dfef3bf37e755f8c15..e2d19e47d0072d139fdc2d0fc1021df5f0e62708 100644 (file)
  * 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.*;
index edbc7fd69a8660b4ed65c096c8488942730b31f3..fbbd7c06a3ba8c0018439c1f6524dceaa882c6f2 100644 (file)
  * 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> {
index b58cd1cc7c8488e7c19f0bd0a3591be62e582e03..61e04b3464cf5918af13aa484fe7b2b9da59c08e 100644 (file)
  * 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 {
 
index 12649730f54f0bd0ca1f6cce896b7e35ef7ceb86..779098ce9cf1456a119140a94191f9f003affe99 100644 (file)
  * 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 {
 
index 74306523c35b20575fd25d98332ded22fee97523..6da50deb2df782fddeb91edd2c3ad6e6f5abaf7c 100644 (file)
@@ -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.*;
index 71a05a23b8e7a38cb5afaa60c1ecc8029b3f9711..e68c6d8bed1daab01fd8cf45406eeab9aed77a47 100644 (file)
@@ -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;
index 919289c7b511193ed89d8d532cb277049bd8aeff..d9f0c7fd321767c3cda17d174d07c193e80d333b 100644 (file)
@@ -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.*;
index 5155b0fec59e11ba2296c17540cd5e575cf3eb4c..69cc3a5535ab7e5598bebdfa953d2deae12ebb70 100755 (executable)
@@ -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;
index 2e497886cf5a4a5a664f4f306ee3fea914167d53..b801b20c1fcb72762bce2d62e5f2a387fc03225f 100755 (executable)
@@ -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 (executable)
index 0000000..2e49788
--- /dev/null
@@ -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
index 7b95bf20fb9eb4ea756564b439061a8f4517b6fb..62f51fba1f8ce7346af03838b65842fafc7ff43a 100755 (executable)
@@ -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 (executable)
index 0000000..7b95bf2
--- /dev/null
@@ -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 $?
index 25eca54b149cb7dae8ec654721ddd4ca043cbfd9..8c87903510b5a325297afca854a1944a4cccbdaf 100644 (file)
@@ -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);
index da873838a7f79ad4b06e45be9815510234e8ea1f..05a69542d53b7c97a436df77d85dd4f59811ef12 100644 (file)
@@ -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,
index bbf82377e9a1843db3bfaccf35ddd1883e5da910..addaad0c61c2e2bb75338f0bd5fd29943baa4b61 100644 (file)
@@ -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])
index 7fa2029d62a3c4d088af8551622b4a45fc71c411..426fb777f0a55affc0c33fcc0082983ab66a159b 100644 (file)
@@ -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),
index 73fe56e6e18bb0b0f65cddf49324a9bd2014db02..786123a3d43c0afd5db2710b8574a8e3ddef9953 100644 (file)
@@ -1,4 +1,6 @@
 *.html
 *.pdf
 *.fo
+*.raw
 titlepage.templates.xsl
+fop-cfg.xml
index 9c6189b4f9386a8c138e0d2033da7b8a8fbf715c..6a04a591dd57e458d2e62a7e6838df52b13c26ac 100644 (file)
@@ -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 (file)
index 0000000..8f7d254
--- /dev/null
@@ -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 (file)
index 0000000..b9193a8
--- /dev/null
@@ -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 (file)
index 0000000..f2b1ee5
--- /dev/null
@@ -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(&amp;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 &amp; RFIF_IM_DONE) {
+               \       ao_radio_done = 1;
+               \       ao_wakeup(&amp;ao_radio_done);
+               \       RFIF &amp;= ~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(&amp;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(&amp;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 (file)
index 6092dfc..0000000
+++ /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(&amp;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 &amp; RFIF_IM_DONE) {
-                 ao_radio_done = 1;
-                 ao_wakeup(&amp;ao_radio_done);
-                 RFIF &amp;= ~RFIF_IM_DONE;
-         }
-       </programlisting>
-       Note that this need not 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(&amp;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(&amp;ao_stdin_ready) when it receives
-       input to tell getchar that more data is available, at
-       which point 'pollchar' will be called again.
-      </para>
-      <para>
-       'putchar' queues a character for output, flushing if the output buffer is
-       full. It may block in this case.
-      </para>
-      <para>
-       'flush' forces the output buffer to be flushed. It may
-       block until the buffer is delivered, but it is not
-       required to do so.
-      </para>
-    </section>
-  </chapter>
-  <chapter>
-    <title>Command line interface</title>
-    <para>
-      AltOS includes a simple command line parser which is hooked up
-      to the stdio interfaces permitting remote control of the device
-      over USB, 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 (file)
index 0000000..cdf7b96
--- /dev/null
@@ -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 (file)
index 0000000..76a24d9
--- /dev/null
@@ -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 (file)
index 0000000..63c1e03
--- /dev/null
@@ -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 (file)
index 0000000..0ed7b6c
--- /dev/null
@@ -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 (file)
index 0000000..15fc28f
--- /dev/null
@@ -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 (file)
index d1328ab..0000000
+++ /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 &gt; 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 &lt; 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
-           &lt;product&gt;-v&lt;product-version&gt;-&lt;software-version&gt;.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 (file)
index 0000000..605339d
--- /dev/null
@@ -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 (file)
index 0000000..cdfe27f
--- /dev/null
@@ -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 (file)
index 0000000..393ef81
--- /dev/null
@@ -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 (file)
index 0000000..09f929d
--- /dev/null
@@ -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 (file)
index 0000000..94b120a
--- /dev/null
@@ -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 (file)
index 0000000..243bded
--- /dev/null
@@ -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 (file)
index 0000000..75ffa22
--- /dev/null
@@ -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 (file)
index 14e2194..0000000
+++ /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 (file)
index 0000000..3584888
--- /dev/null
@@ -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 (file)
index 0000000..fdcfb9d
--- /dev/null
@@ -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 (file)
index 0000000..6fac8e4
--- /dev/null
@@ -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 (file)
index 0000000..f5ca982
--- /dev/null
@@ -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 (file)
index 5796f9c..0000000
+++ /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 (file)
index 0000000..c126004
--- /dev/null
@@ -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 (file)
index 0000000..fb2b609
--- /dev/null
@@ -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 (file)
index 0000000..7789d2f
--- /dev/null
@@ -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 (file)
index 0000000..e031b5e
--- /dev/null
@@ -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 (file)
index 8812532..0000000
+++ /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 (file)
index 0000000..352a989
--- /dev/null
@@ -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 (file)
index 0000000..1a75b92
--- /dev/null
@@ -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 (file)
index 0000000..32e4484
--- /dev/null
@@ -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
new file mode 100644 (file)
index 0000000..1085a73
Binary files /dev/null and b/doc/fonts/DejaVuSansMono-Bold.ttf differ
diff --git a/doc/fonts/DejaVuSansMono-BoldOblique.ttf b/doc/fonts/DejaVuSansMono-BoldOblique.ttf
new file mode 100644 (file)
index 0000000..3175ebf
Binary files /dev/null and b/doc/fonts/DejaVuSansMono-BoldOblique.ttf differ
diff --git a/doc/fonts/DejaVuSansMono-Oblique.ttf b/doc/fonts/DejaVuSansMono-Oblique.ttf
new file mode 100644 (file)
index 0000000..d5d6f92
Binary files /dev/null and b/doc/fonts/DejaVuSansMono-Oblique.ttf differ
diff --git a/doc/fonts/DejaVuSansMono.ttf b/doc/fonts/DejaVuSansMono.ttf
new file mode 100644 (file)
index 0000000..05e2345
Binary files /dev/null and b/doc/fonts/DejaVuSansMono.ttf differ
diff --git a/doc/fonts/OpenSans-Bold.ttf b/doc/fonts/OpenSans-Bold.ttf
new file mode 100644 (file)
index 0000000..fd79d43
Binary files /dev/null and b/doc/fonts/OpenSans-Bold.ttf differ
diff --git a/doc/fonts/OpenSans-BoldItalic.ttf b/doc/fonts/OpenSans-BoldItalic.ttf
new file mode 100644 (file)
index 0000000..9bc8009
Binary files /dev/null and b/doc/fonts/OpenSans-BoldItalic.ttf differ
diff --git a/doc/fonts/OpenSans-ExtraBold.ttf b/doc/fonts/OpenSans-ExtraBold.ttf
new file mode 100644 (file)
index 0000000..21f6f84
Binary files /dev/null and b/doc/fonts/OpenSans-ExtraBold.ttf differ
diff --git a/doc/fonts/OpenSans-ExtraBoldItalic.ttf b/doc/fonts/OpenSans-ExtraBoldItalic.ttf
new file mode 100644 (file)
index 0000000..31cb688
Binary files /dev/null and b/doc/fonts/OpenSans-ExtraBoldItalic.ttf differ
diff --git a/doc/fonts/OpenSans-Italic.ttf b/doc/fonts/OpenSans-Italic.ttf
new file mode 100644 (file)
index 0000000..c90da48
Binary files /dev/null and b/doc/fonts/OpenSans-Italic.ttf differ
diff --git a/doc/fonts/OpenSans-Light.ttf b/doc/fonts/OpenSans-Light.ttf
new file mode 100644 (file)
index 0000000..0d38189
Binary files /dev/null and b/doc/fonts/OpenSans-Light.ttf differ
diff --git a/doc/fonts/OpenSans-LightItalic.ttf b/doc/fonts/OpenSans-LightItalic.ttf
new file mode 100644 (file)
index 0000000..68299c4
Binary files /dev/null and b/doc/fonts/OpenSans-LightItalic.ttf differ
diff --git a/doc/fonts/OpenSans-Regular.ttf b/doc/fonts/OpenSans-Regular.ttf
new file mode 100644 (file)
index 0000000..db43334
Binary files /dev/null and b/doc/fonts/OpenSans-Regular.ttf differ
diff --git a/doc/fonts/OpenSans-Semibold.ttf b/doc/fonts/OpenSans-Semibold.ttf
new file mode 100644 (file)
index 0000000..1a7679e
Binary files /dev/null and b/doc/fonts/OpenSans-Semibold.ttf differ
diff --git a/doc/fonts/OpenSans-SemiboldItalic.ttf b/doc/fonts/OpenSans-SemiboldItalic.ttf
new file mode 100644 (file)
index 0000000..59b6d16
Binary files /dev/null and b/doc/fonts/OpenSans-SemiboldItalic.ttf differ
diff --git a/doc/footer.templates.xsl b/doc/footer.templates.xsl
new file mode 100644 (file)
index 0000000..3484c0e
--- /dev/null
@@ -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 (file)
index 0000000..9ac4282
--- /dev/null
@@ -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 (file)
index 0000000..decaf4d
--- /dev/null
@@ -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 (file)
index 0000000..7565996
--- /dev/null
@@ -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 (file)
index 0000000..d390551
--- /dev/null
@@ -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 (file)
index 0000000..28daa41
--- /dev/null
@@ -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 (file)
index 0000000..e7717d8
--- /dev/null
@@ -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 (executable)
index 0000000..ad8cb0a
--- /dev/null
@@ -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 (file)
index 0000000..37c6e77
--- /dev/null
@@ -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 (file)
index 0000000..f6b23aa
--- /dev/null
@@ -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 (file)
index 0000000..4b69582
--- /dev/null
@@ -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 (file)
index 0000000..d5036a0
--- /dev/null
@@ -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 (file)
index dafe368..0000000
+++ /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 &amp; 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 (file)
index 0000000..3b91854
--- /dev/null
@@ -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 (file)
index 0000000..9657f2a
--- /dev/null
@@ -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 (file)
index 0000000..8ce49f0
--- /dev/null
@@ -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 (file)
index 1f2feeb..0000000
+++ /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 (file)
index 0000000..d593da3
--- /dev/null
@@ -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 (file)
index 0000000..3823059
--- /dev/null
@@ -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 (file)
index df7ef32..0000000
+++ /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 (file)
index 0000000..605472f
--- /dev/null
@@ -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 (file)
index 0000000..40e5363
--- /dev/null
@@ -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 (file)
index 0000000..b7c55bb
--- /dev/null
@@ -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 (file)
index 16ff989..0000000
+++ /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 (file)
index 0000000..0ee7ea5
--- /dev/null
@@ -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 (file)
index a5d6b3d..0000000
+++ /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 (file)
index 0000000..2397210
--- /dev/null
@@ -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 (file)
index 0000000..067727e
--- /dev/null
@@ -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 (file)
index 8b66f7e..0000000
+++ /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 (file)
index 0000000..9327391
--- /dev/null
@@ -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 (file)
index 0000000..41ea12d
--- /dev/null
@@ -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 (file)
index 0000000..2e61bfe
--- /dev/null
@@ -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 (file)
index 6f3a925..0000000
+++ /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 (file)
index 0000000..b3ea066
--- /dev/null
@@ -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 (file)
index 0b2cce4..0000000
+++ /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 (file)
index 0000000..ba2c9d5
--- /dev/null
@@ -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 (file)
index 0000000..d0f08b9
--- /dev/null
@@ -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 (file)
index 0000000..18c5d7e
--- /dev/null
@@ -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 (file)
index 0f05695..0000000
+++ /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 (file)
index 0000000..42afad0
--- /dev/null
@@ -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 (file)
index f26480a..0000000
+++ /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 (file)
index 0000000..aa569df
--- /dev/null
@@ -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 (file)
index 0000000..f67cf3b
--- /dev/null
@@ -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 (file)
index 0000000..ff9c8e5
--- /dev/null
@@ -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 (file)
index 1ccbfa1..0000000
+++ /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 (file)
index 0000000..82b7677
--- /dev/null
@@ -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 (file)
index 0000000..dae5dd9
--- /dev/null
@@ -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 (file)
index 279762c..0000000
+++ /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 (file)
index 0000000..ceb677a
--- /dev/null
@@ -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 (file)
index 3bc4857..0000000
+++ /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 (file)
index 0000000..12a38ce
--- /dev/null
@@ -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 (file)
index 0000000..6224b16
--- /dev/null
@@ -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 (file)
index 0000000..5e3e831
--- /dev/null
@@ -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 (file)
index e6c82d6..0000000
+++ /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 (file)
index 0000000..8fd9432
--- /dev/null
@@ -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 (file)
index 0000000..ded6b40
--- /dev/null
@@ -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 (file)
index 0000000..f4ab9ad
--- /dev/null
@@ -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 (file)
index 2893f1a..0000000
+++ /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 (file)
index 0000000..0c0cace
--- /dev/null
@@ -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 (file)
index 0000000..8d72c0e
--- /dev/null
@@ -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 (file)
index 50d83f7..0000000
+++ /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 (file)
index 0000000..5ae58bb
--- /dev/null
@@ -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 (file)
index 0000000..dc0a2d6
--- /dev/null
@@ -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 (file)
index 0000000..1e03ed4
--- /dev/null
@@ -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 (file)
index 058d43f..0000000
+++ /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 (file)
index 0000000..78206e2
--- /dev/null
@@ -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 (file)
index 0000000..990eb48
--- /dev/null
@@ -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 (file)
index 0000000..0908dfa
--- /dev/null
@@ -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 (file)
index 604fe09..0000000
+++ /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 (file)
index 0000000..4f842cd
--- /dev/null
@@ -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 (file)
index 0000000..a6240d4
--- /dev/null
@@ -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 (file)
index 0000000..a6c7b69
--- /dev/null
@@ -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 (file)
index 0000000..e68b2ac
--- /dev/null
@@ -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 (file)
index 0000000..3e6b385
--- /dev/null
@@ -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 (file)
index 0000000..719c309
--- /dev/null
@@ -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 (file)
index 0000000..4ba3f73
--- /dev/null
@@ -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 (file)
index 0000000..a2cf540
--- /dev/null
@@ -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 (file)
index 0000000..2149789
--- /dev/null
@@ -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 (file)
index 0000000..6492743
--- /dev/null
@@ -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 (file)
index 0000000..dcdabc0
--- /dev/null
@@ -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 (file)
index 0000000..6ff8c76
--- /dev/null
@@ -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 (file)
index 0000000..c9fce7f
--- /dev/null
@@ -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 (file)
index 0000000..568c434
--- /dev/null
@@ -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 (file)
index 0000000..1dd889c
--- /dev/null
@@ -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 (file)
index 0000000..47eafe3
--- /dev/null
@@ -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 (file)
index 8de5c56..0000000
+++ /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 &amp; 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
-           &lt;product&gt;-v&lt;product-version&gt;-&lt;software-version&gt;.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 (file)
index 0000000..1af9189
--- /dev/null
@@ -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 (file)
index 5d3411e..0000000
+++ /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 (file)
index 0000000..55f77bc
--- /dev/null
@@ -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 (file)
index 0000000..ab6871f
--- /dev/null
@@ -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 (file)
index 4a0ade4..0000000
+++ /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
new file mode 100644 (file)
index 0000000..ceec699
Binary files /dev/null and b/doc/telemetrum-v2.0-th.jpg differ
diff --git a/doc/telemetrum.inc b/doc/telemetrum.inc
new file mode 100644 (file)
index 0000000..7c9dadb
--- /dev/null
@@ -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 (file)
index 0000000..19f90ca
--- /dev/null
@@ -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 (file)
index 0000000..36d2edb
--- /dev/null
@@ -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 (file)
index 2e0b3ea..0000000
+++ /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 (file)
index 0000000..1992adf
--- /dev/null
@@ -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 (file)
index 0000000..e0d674f
--- /dev/null
@@ -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
deleted file mode 100644 (file)
index bc8ae45..0000000
Binary files a/doc/telemini-v2-top.jpg and /dev/null differ
diff --git a/doc/telemini.pdf b/doc/telemini.pdf
deleted file mode 100644 (file)
index 9d7f023..0000000
Binary files a/doc/telemini.pdf and /dev/null differ
diff --git a/doc/titlepage.templates.tmpl b/doc/titlepage.templates.tmpl
new file mode 100644 (file)
index 0000000..f437fb7
--- /dev/null
@@ -0,0 +1,1587 @@
+<!DOCTYPE t:templates [
+<!ENTITY hsize0 "10pt">
+<!ENTITY hsize1 "12pt">
+<!ENTITY hsize2 "14.4pt">
+<!ENTITY hsize3 "17.28pt">
+<!ENTITY hsize4 "20.736pt">
+<!ENTITY hsize5 "24.8832pt">
+<!ENTITY hsize0space "7.5pt"> <!-- 0.75 * hsize0 -->
+<!ENTITY hsize1space "9pt"> <!-- 0.75 * hsize1 -->
+<!ENTITY hsize2space "10.8pt"> <!-- 0.75 * hsize2 -->
+<!ENTITY hsize3space "12.96pt"> <!-- 0.75 * hsize3 -->
+<!ENTITY hsize4space "15.552pt"> <!-- 0.75 * hsize4 -->
+<!ENTITY hsize5space "18.6624pt"> <!-- 0.75 * hsize5 -->
+]>
+<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
+            xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
+             xmlns:fo="http://www.w3.org/1999/XSL/Format"
+             xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<!-- ********************************************************************
+     $Id: titlepage.templates.xml 9722 2013-02-01 19:44:13Z bobstayton $
+     ********************************************************************
+
+     This file is part of the DocBook XSL Stylesheet distribution.
+     See ../README or http://docbook.sf.net/ for copyright
+     copyright and other information.
+
+     ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="article" t:wrapper="fo:block"
+             font-family="{$title.fontset}">
+
+  <t:titlepage-content t:side="recto"
+            start-indent="0pt"
+             text-align="center">
+
+    <mediaobject space-before="1em"/>
+
+    <title t:named-template="component.title"
+          param:node="ancestor-or-self::article[1]"
+          keep-with-next.within-column="always"
+          font-size="&hsize5;"
+          font-weight="bold"/>
+
+    <subtitle/>
+
+    <date/>
+
+    <corpauthor space-before="0.5em"
+                font-size="&hsize2;"/>
+    <authorgroup space-before="0.5em"
+                 font-size="&hsize2;"/>
+    <author space-before="0.5em"
+            font-size="&hsize2;"/>
+
+    <!-- If you add editor, include this t:predicate attribute
+         because only the first editor generates the list of editors.
+    <editor t:predicate="[position() = 1]"/>
+    -->
+    <othercredit space-before="0.15in"/>
+    <releaseinfo space-before="0.15in"/>
+    <copyright space-before="0.15in"/>
+    <legalnotice text-align="start"
+                 margin-left="0.5in"
+                 margin-right="0.5in"
+                 font-family="{$body.fontset}"/>
+    <pubdate space-before="0.15in"/>
+    <revision space-before="0.15in"/>
+    <revhistory space-before="0.15in"/>
+    <abstract space-before="0.15in"
+             text-align="start"
+             margin-left="0.5in"
+              margin-right="0.5in"
+              font-family="{$body.fontset}"/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="set" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+      <title
+            t:named-template="division.title"
+            param:node="ancestor-or-self::set[1]"
+            text-align="center"
+            font-size="&hsize5;"
+            space-before="&hsize5space;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    <subtitle
+             font-family="{$title.fontset}"
+             text-align="center"/>
+    <corpauthor space-before="0.25in"/>
+    <authorgroup/>
+    <author/>
+    <othercredit/>
+    <releaseinfo/>
+    <copyright/>
+    <legalnotice/>
+    <pubdate/>
+    <revision/>
+    <revhistory/>
+    <abstract/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="book" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+       t:named-template="division.title"
+       param:node="ancestor-or-self::book[1]"
+       text-align="center"
+       font-size="&hsize5;"
+       space-before="&hsize5space;"
+       font-weight="bold"
+       font-family="{$title.fontset}"/>
+    <subtitle
+       text-align="center"
+       font-size="&hsize4;"
+       space-before="&hsize4space;"
+       font-family="{$title.fontset}"/>
+<!--
+    <corpauthor font-size="&hsize3;"
+               keep-with-next.within-column="always"
+               space-before="2in"/>
+    -->
+    <authorgroup space-before="2in"/>
+    <author font-size="&hsize3;"
+           space-before="&hsize2space;"
+           keep-with-next.within-column="always"/>
+    <!-- If you add editor, include this t:predicate attribute
+         because only the first editor generates the list of editors.
+        <editor t:predicate="[position() = 1]"/>
+        -->
+    <mediaobject space-before="1.5in"/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+      <title
+            t:named-template="book.verso.title"
+            font-size="&hsize2;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+      <authorgroup t:named-template="verso.authorgroup"/>
+      <author/>
+      <!-- If you add editor, include this t:predicate attribute
+           because only the first editor generates the list of editors.
+      <editor t:predicate="[position() = 1]"/>
+      -->
+      <othercredit/>
+      <releaseinfo space-before="0.15in"/>
+      <pubdate space-before="1em"/>
+      <copyright/>
+      <abstract/>
+      <legalnotice font-size="8pt"/>
+      <corpauthor text-align="center" space-before="0.5in"/>
+      <revhistory space-before="0.5in"/>
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+      <fo:block break-after="page"/>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+      <fo:block break-after="page"/>
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="part" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+      <title
+            t:named-template="division.title"
+            param:node="ancestor-or-self::part[1]"
+            text-align="center"
+            font-size="&hsize5;"
+            space-before="&hsize5space;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    <subtitle
+             text-align="center"
+             font-size="&hsize4;"
+             space-before="&hsize4space;"
+             font-weight='bold'
+             font-style='italic'
+             font-family="{$title.fontset}"/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="partintro" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          text-align="center"
+          font-size="&hsize5;"
+          font-weight="bold"
+          space-before="1em"
+          font-family="{$title.fontset}"/>
+    <subtitle
+             text-align="center"
+             font-size="&hsize2;"
+             font-weight="bold"
+             font-style="italic"
+             font-family="{$title.fontset}"/>
+    <corpauthor/>
+    <authorgroup/>
+    <author/>
+    <othercredit/>
+    <releaseinfo/>
+    <copyright/>
+    <legalnotice/>
+    <pubdate/>
+    <revision/>
+    <revhistory/>
+    <abstract/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="reference" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+      <title
+            t:named-template="division.title"
+            param:node="ancestor-or-self::reference[1]"
+            text-align="center"
+            font-size="&hsize5;"
+            space-before="&hsize5space;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    <subtitle
+             font-family="{$title.fontset}"
+             text-align="center"/>
+    <corpauthor/>
+    <authorgroup/>
+    <author/>
+    <othercredit/>
+    <releaseinfo/>
+    <copyright/>
+    <legalnotice/>
+    <pubdate/>
+    <revision/>
+    <revhistory/>
+    <abstract/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsynopsisdiv" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          font-family="{$title.fontset}"/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsection" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          font-family="{$title.fontset}"/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsect1" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          font-family="{$title.fontset}"/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsect2" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          font-family="{$title.fontset}"/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsect3" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          font-family="{$title.fontset}"/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="dedication" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="component.title"
+            param:node="ancestor-or-self::dedication[1]"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize5;"
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<!-- Same formatting as dedication -->
+ <t:titlepage t:element="acknowledgements" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="component.title"
+            param:node="ancestor-or-self::acknowledgements[1]"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize5;"
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="preface" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="component.title"
+            param:node="ancestor-or-self::preface[1]"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize5;"
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <corpauthor/>
+      <authorgroup/>
+      <author/>
+      <othercredit/>
+      <releaseinfo/>
+      <copyright/>
+      <legalnotice/>
+      <pubdate/>
+      <revision/>
+      <revhistory/>
+      <abstract/>
+      <itermset/>
+    </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="chapter" t:wrapper="fo:block"
+               font-family="{$title.fontset}">
+    <t:titlepage-content t:side="recto" margin-left="{$title.margin.left}">
+      <title t:named-template="component.title"
+            param:node="ancestor-or-self::chapter[1]"
+            font-size="&hsize5;"
+            font-weight="bold"/>
+
+      <subtitle space-before="0.5em"
+               font-style="italic"
+               font-size="&hsize2;"
+               font-weight="bold"/>
+
+      <corpauthor  space-before="0.5em"
+                  space-after="0.5em"
+                   font-size="&hsize2;"/>
+
+      <authorgroup space-before="0.5em"
+                  space-after="0.5em"
+                   font-size="&hsize2;"/>
+
+      <author      space-before="0.5em"
+                  space-after="0.5em"
+                   font-size="&hsize2;"/>
+
+      <othercredit/>
+      <releaseinfo/>
+      <copyright/>
+      <legalnotice/>
+      <pubdate/>
+      <revision/>
+      <revhistory/>
+      <abstract/>
+      <itermset/>
+    </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="appendix" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:named-template="component.title"
+            param:node="ancestor-or-self::appendix[1]"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize5;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <corpauthor/>
+      <authorgroup/>
+      <author/>
+      <othercredit/>
+      <releaseinfo/>
+      <copyright/>
+      <legalnotice/>
+      <pubdate/>
+      <revision/>
+      <revhistory/>
+      <abstract/>
+      <itermset/>
+    </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="section" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          margin-left="{$title.margin.left}"
+          font-family="{$title.fontset}"/>
+    <subtitle
+             font-family="{$title.fontset}"/>
+    <corpauthor/>
+    <authorgroup/>
+    <author/>
+    <othercredit/>
+    <releaseinfo/>
+    <copyright/>
+    <legalnotice/>
+    <pubdate/>
+    <revision/>
+    <revhistory/>
+    <abstract/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect1" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          margin-left="{$title.margin.left}"
+          font-family="{$title.fontset}"/>
+    <subtitle
+             font-family="{$title.fontset}"/>
+    <corpauthor/>
+    <authorgroup/>
+    <author/>
+    <othercredit/>
+    <releaseinfo/>
+    <copyright/>
+    <legalnotice/>
+    <pubdate/>
+    <revision/>
+    <revhistory/>
+    <abstract/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect2" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          margin-left="{$title.margin.left}"
+          font-family="{$title.fontset}"/>
+    <subtitle
+             font-family="{$title.fontset}"/>
+    <corpauthor/>
+    <authorgroup/>
+    <author/>
+    <othercredit/>
+    <releaseinfo/>
+    <copyright/>
+    <legalnotice/>
+    <pubdate/>
+    <revision/>
+    <revhistory/>
+    <abstract/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect3" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          margin-left="{$title.margin.left}"
+          font-family="{$title.fontset}"/>
+    <subtitle
+             font-family="{$title.fontset}"/>
+    <corpauthor/>
+    <authorgroup/>
+    <author/>
+    <othercredit/>
+    <releaseinfo/>
+    <copyright/>
+    <legalnotice/>
+    <pubdate/>
+    <revision/>
+    <revhistory/>
+    <abstract/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect4" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          margin-left="{$title.margin.left}"
+          font-family="{$title.fontset}"/>
+    <subtitle
+             font-family="{$title.fontset}"/>
+    <corpauthor/>
+    <authorgroup/>
+    <author/>
+    <othercredit/>
+    <releaseinfo/>
+    <copyright/>
+    <legalnotice/>
+    <pubdate/>
+    <revision/>
+    <revhistory/>
+    <abstract/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect5" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          margin-left="{$title.margin.left}"
+          font-family="{$title.fontset}"/>
+    <subtitle
+             font-family="{$title.fontset}"/>
+    <corpauthor/>
+    <authorgroup/>
+    <author/>
+    <othercredit/>
+    <releaseinfo/>
+    <copyright/>
+    <legalnotice/>
+    <pubdate/>
+    <revision/>
+    <revhistory/>
+    <abstract/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="simplesect" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          margin-left="{$title.margin.left}"
+          font-family="{$title.fontset}"/>
+    <subtitle
+             font-family="{$title.fontset}"/>
+    <corpauthor/>
+    <authorgroup/>
+    <author/>
+    <othercredit/>
+    <releaseinfo/>
+    <copyright/>
+    <legalnotice/>
+    <pubdate/>
+    <revision/>
+    <revhistory/>
+    <abstract/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="topic" t:wrapper="fo:block">
+  <t:titlepage-content t:side="recto">
+    <title
+          font-weight="bold"
+           font-size="&hsize3;"
+           space-before="1em"
+           space-after="1em"
+          font-family="{$title.fontset}"/>
+    <subtitle
+             font-family="{$title.fontset}"/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="bibliography" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="component.title"
+            param:node="ancestor-or-self::bibliography[1]"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize5;"
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="bibliodiv" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title t:named-template="component.title"
+            param:node="ancestor-or-self::bibliodiv[1]"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize4;"
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="glossary" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="component.title"
+            param:node="ancestor-or-self::glossary[1]"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize5;"
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="glossdiv" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title t:named-template="component.title"
+            param:node="ancestor-or-self::glossdiv[1]"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize4;"
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="index" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="component.title"
+            param:node="ancestor-or-self::index[1]"
+             param:pagewide="1"
+            margin-left="0pt"
+            font-size="&hsize5;"
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <!-- The indexdiv.title template is used so that manual and -->
+  <!-- automatically generated indexdiv titles get the same -->
+  <!-- formatting. -->
+
+  <t:titlepage t:element="indexdiv" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title t:force="1"
+            t:named-template="indexdiv.title"
+            param:title="title"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="setindex" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="component.title"
+            param:node="ancestor-or-self::setindex[1]"
+             param:pagewide="1"
+            margin-left="0pt"
+            font-size="&hsize5;"
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="colophon" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="component.title"
+            param:node="ancestor-or-self::colophon[1]"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize5;"
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="sidebar" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title 
+            font-family="{$title.fontset}"
+            font-weight="bold"/>
+      <subtitle
+               font-family="{$title.fontset}"/>
+      <itermset/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+<!-- ==================================================================== -->
+<t:titlepage t:element="qandaset" t:wrapper="fo:block"
+             font-family="{$title.fontset}">
+
+  <t:titlepage-content t:side="recto"
+            start-indent="0pt"
+             text-align="center">
+
+    <title t:named-template="component.title"
+          param:node="ancestor-or-self::qandaset[1]"
+          keep-with-next.within-column="always"
+          font-size="&hsize5;"
+          font-weight="bold"/>
+
+    <subtitle/>
+
+    <corpauthor space-before="0.5em"
+                font-size="&hsize2;"/>
+    <authorgroup space-before="0.5em"
+                 font-size="&hsize2;"/>
+    <author space-before="0.5em"
+            font-size="&hsize2;"/>
+
+    <othercredit space-before="0.5em"/>
+    <releaseinfo space-before="0.5em"/>
+    <copyright space-before="0.5em"/>
+    <legalnotice text-align="start"
+                 margin-left="0.5in"
+                 margin-right="0.5in"
+                 font-family="{$body.fontset}"/>
+    <pubdate space-before="0.5em"/>
+    <revision space-before="0.5em"/>
+    <revhistory space-before="0.5em"/>
+    <abstract space-before="0.5em"
+             text-align="start"
+             margin-left="0.5in"
+              margin-right="0.5in"
+              font-family="{$body.fontset}"/>
+    <itermset/>
+  </t:titlepage-content>
+
+  <t:titlepage-content t:side="verso">
+  </t:titlepage-content>
+
+  <t:titlepage-separator>
+  </t:titlepage-separator>
+
+  <t:titlepage-before t:side="recto">
+  </t:titlepage-before>
+
+  <t:titlepage-before t:side="verso">
+  </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+  <t:titlepage t:element="table.of.contents" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'TableofContents'"
+             space-before.minimum="1em"
+             space-before.optimum="1.5em"
+             space-before.maximum="2em"
+            space-after="0.5em"
+            start-indent="0pt"
+            font-size="&hsize3;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="list.of.tables" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofTables'"
+             space-before.minimum="1em"
+             space-before.optimum="1.5em"
+             space-before.maximum="2em"
+            space-after="0.5em"
+            start-indent="0pt"
+            font-size="&hsize3;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="list.of.figures" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofFigures'"
+             space-before.minimum="1em"
+             space-before.optimum="1.5em"
+             space-before.maximum="2em"
+            space-after="0.5em"
+            start-indent="0pt"
+            font-size="&hsize3;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="list.of.examples" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofExamples'"
+             space-before.minimum="1em"
+             space-before.optimum="1.5em"
+             space-before.maximum="2em"
+            space-after="0.5em"
+            start-indent="0pt"
+            font-size="&hsize3;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="list.of.equations" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofEquations'"
+             space-before.minimum="1em"
+             space-before.optimum="1.5em"
+             space-before.maximum="2em"
+            space-after="0.5em"
+            start-indent="0pt"
+            font-size="&hsize3;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="list.of.procedures" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofProcedures'"
+             space-before.minimum="1em"
+             space-before.optimum="1.5em"
+             space-before.maximum="2em"
+            space-after="0.5em"
+            start-indent="0pt"
+            font-size="&hsize3;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="list.of.unknowns" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofUnknown'"
+             space-before.minimum="1em"
+             space-before.optimum="1.5em"
+             space-before.maximum="2em"
+            space-after="0.5em"
+            start-indent="0pt"
+            font-size="&hsize3;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="component.list.of.tables" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofTables'"
+             space-before.minimum="1em"
+             space-before.optimum="1em"
+             space-before.maximum="1em"
+            space-after="0.5em"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize1;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="component.list.of.figures" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofFigures'"
+             space-before.minimum="1em"
+             space-before.optimum="1em"
+             space-before.maximum="1em"
+            space-after="0.5em"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize1;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="component.list.of.examples" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofExamples'"
+             space-before.minimum="1em"
+             space-before.optimum="1em"
+             space-before.maximum="1em"
+            space-after="0.5em"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize1;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="component.list.of.equations" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofEquations'"
+             space-before.minimum="1em"
+             space-before.optimum="1em"
+             space-before.maximum="1em"
+            space-after="0.5em"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize1;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="component.list.of.procedures" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofProcedures'"
+             space-before.minimum="1em"
+             space-before.optimum="1em"
+             space-before.maximum="1em"
+            space-after="0.5em"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize1;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+  <t:titlepage t:element="component.list.of.unknowns" t:wrapper="fo:block">
+    <t:titlepage-content t:side="recto">
+      <title
+            t:force="1"
+            t:named-template="gentext"
+            param:key="'ListofUnknown'"
+             space-before.minimum="1em"
+             space-before.optimum="1em"
+             space-before.maximum="1em"
+            space-after="0.5em"
+            margin-left="{$title.margin.left}"
+            font-size="&hsize1;"
+            font-weight="bold"
+            font-family="{$title.fontset}"/>
+    </t:titlepage-content>
+
+    <t:titlepage-content t:side="verso">
+    </t:titlepage-content>
+
+    <t:titlepage-separator>
+    </t:titlepage-separator>
+
+    <t:titlepage-before t:side="recto">
+    </t:titlepage-before>
+
+    <t:titlepage-before t:side="verso">
+    </t:titlepage-before>
+  </t:titlepage>
+
+<!-- ==================================================================== -->
+
+</t:templates>
diff --git a/doc/titlepage.templates.xml b/doc/titlepage.templates.xml
deleted file mode 100644 (file)
index 59fa5ba..0000000
+++ /dev/null
@@ -1,1580 +0,0 @@
-<!DOCTYPE t:templates [
-<!ENTITY hsize0 "10pt">
-<!ENTITY hsize1 "12pt">
-<!ENTITY hsize2 "14.4pt">
-<!ENTITY hsize3 "17.28pt">
-<!ENTITY hsize4 "20.736pt">
-<!ENTITY hsize5 "24.8832pt">
-<!ENTITY hsize0space "7.5pt"> <!-- 0.75 * hsize0 -->
-<!ENTITY hsize1space "9pt"> <!-- 0.75 * hsize1 -->
-<!ENTITY hsize2space "10.8pt"> <!-- 0.75 * hsize2 -->
-<!ENTITY hsize3space "12.96pt"> <!-- 0.75 * hsize3 -->
-<!ENTITY hsize4space "15.552pt"> <!-- 0.75 * hsize4 -->
-<!ENTITY hsize5space "18.6624pt"> <!-- 0.75 * hsize5 -->
-]>
-<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
-            xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
-             xmlns:fo="http://www.w3.org/1999/XSL/Format"
-             xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-<!-- ********************************************************************
-     $Id: titlepage.templates.xml 9722 2013-02-01 19:44:13Z bobstayton $
-     ********************************************************************
-
-     This file is part of the DocBook XSL Stylesheet distribution.
-     See ../README or http://docbook.sf.net/ for copyright
-     copyright and other information.
-
-     ******************************************************************** -->
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="article" t:wrapper="fo:block"
-             font-family="{$title.fontset}">
-
-  <t:titlepage-content t:side="recto"
-            start-indent="0pt"
-             text-align="center">
-
-    <title t:named-template="component.title"
-          param:node="ancestor-or-self::article[1]"
-          keep-with-next.within-column="always"
-          font-size="&hsize5;"
-          font-weight="bold"/>
-
-    <subtitle/>
-
-    <corpauthor space-before="0.5em"
-                font-size="&hsize2;"/>
-    <authorgroup space-before="0.5em"
-                 font-size="&hsize2;"/>
-    <author space-before="0.5em"
-            font-size="&hsize2;"/>
-
-    <!-- If you add editor, include this t:predicate attribute
-         because only the first editor generates the list of editors.
-    <editor t:predicate="[position() = 1]"/>
-    -->
-    <othercredit space-before="0.5em"/>
-    <releaseinfo space-before="0.5em"/>
-    <copyright space-before="0.5em"/>
-    <legalnotice text-align="start"
-                 margin-left="0.5in"
-                 margin-right="0.5in"
-                 font-family="{$body.fontset}"/>
-    <pubdate space-before="0.5em"/>
-    <revision space-before="0.5em"/>
-    <revhistory space-before="0.5em"/>
-    <abstract space-before="0.5em"
-             text-align="start"
-             margin-left="0.5in"
-              margin-right="0.5in"
-              font-family="{$body.fontset}"/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="set" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-      <title
-            t:named-template="division.title"
-            param:node="ancestor-or-self::set[1]"
-            text-align="center"
-            font-size="&hsize5;"
-            space-before="&hsize5space;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    <subtitle
-             font-family="{$title.fontset}"
-             text-align="center"/>
-    <corpauthor/>
-    <authorgroup/>
-    <author/>
-    <othercredit/>
-    <releaseinfo/>
-    <copyright/>
-    <legalnotice/>
-    <pubdate/>
-    <revision/>
-    <revhistory/>
-    <abstract/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="book" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:named-template="division.title"
-            param:node="ancestor-or-self::book[1]"
-            text-align="center"
-            font-size="&hsize5;"
-            space-before="&hsize5space;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-      <subtitle
-               text-align="center"
-               font-size="&hsize4;"
-               space-before="&hsize4space;"
-               font-family="{$title.fontset}"/>
-      <corpauthor font-size="&hsize3;"
-                 keep-with-next.within-column="always"
-                 space-before="2in"/>
-      <authorgroup space-before="2in"/>
-      <author font-size="&hsize3;"
-             space-before="&hsize2space;"
-             keep-with-next.within-column="always"/>
-      <!-- If you add editor, include this t:predicate attribute
-           because only the first editor generates the list of editors.
-      <editor t:predicate="[position() = 1]"/>
-      -->
-      <mediaobject space-before="1.5in"/>
-      <itermset/>
-    </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-      <title
-            t:named-template="book.verso.title"
-            font-size="&hsize2;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-      <corpauthor/>
-      <authorgroup t:named-template="verso.authorgroup"/>
-      <author/>
-      <!-- If you add editor, include this t:predicate attribute
-           because only the first editor generates the list of editors.
-      <editor t:predicate="[position() = 1]"/>
-      -->
-      <othercredit/>
-      <releaseinfo space-before="0.5em"/>
-      <pubdate space-before="1em"/>
-      <copyright/>
-      <abstract/>
-      <legalnotice font-size="8pt"/>
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-      <fo:block break-after="page"/>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-      <fo:block break-after="page"/>
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="part" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-      <title
-            t:named-template="division.title"
-            param:node="ancestor-or-self::part[1]"
-            text-align="center"
-            font-size="&hsize5;"
-            space-before="&hsize5space;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    <subtitle
-             text-align="center"
-             font-size="&hsize4;"
-             space-before="&hsize4space;"
-             font-weight='bold'
-             font-style='italic'
-             font-family="{$title.fontset}"/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="partintro" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          text-align="center"
-          font-size="&hsize5;"
-          font-weight="bold"
-          space-before="1em"
-          font-family="{$title.fontset}"/>
-    <subtitle
-             text-align="center"
-             font-size="&hsize2;"
-             font-weight="bold"
-             font-style="italic"
-             font-family="{$title.fontset}"/>
-    <corpauthor/>
-    <authorgroup/>
-    <author/>
-    <othercredit/>
-    <releaseinfo/>
-    <copyright/>
-    <legalnotice/>
-    <pubdate/>
-    <revision/>
-    <revhistory/>
-    <abstract/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="reference" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-      <title
-            t:named-template="division.title"
-            param:node="ancestor-or-self::reference[1]"
-            text-align="center"
-            font-size="&hsize5;"
-            space-before="&hsize5space;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    <subtitle
-             font-family="{$title.fontset}"
-             text-align="center"/>
-    <corpauthor/>
-    <authorgroup/>
-    <author/>
-    <othercredit/>
-    <releaseinfo/>
-    <copyright/>
-    <legalnotice/>
-    <pubdate/>
-    <revision/>
-    <revhistory/>
-    <abstract/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="refsynopsisdiv" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          font-family="{$title.fontset}"/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="refsection" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          font-family="{$title.fontset}"/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="refsect1" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          font-family="{$title.fontset}"/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="refsect2" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          font-family="{$title.fontset}"/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="refsect3" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          font-family="{$title.fontset}"/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="dedication" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="component.title"
-            param:node="ancestor-or-self::dedication[1]"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize5;"
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<!-- Same formatting as dedication -->
- <t:titlepage t:element="acknowledgements" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="component.title"
-            param:node="ancestor-or-self::acknowledgements[1]"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize5;"
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="preface" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="component.title"
-            param:node="ancestor-or-self::preface[1]"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize5;"
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <corpauthor/>
-      <authorgroup/>
-      <author/>
-      <othercredit/>
-      <releaseinfo/>
-      <copyright/>
-      <legalnotice/>
-      <pubdate/>
-      <revision/>
-      <revhistory/>
-      <abstract/>
-      <itermset/>
-    </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="chapter" t:wrapper="fo:block"
-               font-family="{$title.fontset}">
-    <t:titlepage-content t:side="recto" margin-left="{$title.margin.left}">
-      <title t:named-template="component.title"
-            param:node="ancestor-or-self::chapter[1]"
-            font-size="&hsize5;"
-            font-weight="bold"/>
-
-      <subtitle space-before="0.5em"
-               font-style="italic"
-               font-size="&hsize2;"
-               font-weight="bold"/>
-
-      <corpauthor  space-before="0.5em"
-                  space-after="0.5em"
-                   font-size="&hsize2;"/>
-
-      <authorgroup space-before="0.5em"
-                  space-after="0.5em"
-                   font-size="&hsize2;"/>
-
-      <author      space-before="0.5em"
-                  space-after="0.5em"
-                   font-size="&hsize2;"/>
-
-      <othercredit/>
-      <releaseinfo/>
-      <copyright/>
-      <legalnotice/>
-      <pubdate/>
-      <revision/>
-      <revhistory/>
-      <abstract/>
-      <itermset/>
-    </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="appendix" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:named-template="component.title"
-            param:node="ancestor-or-self::appendix[1]"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize5;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <corpauthor/>
-      <authorgroup/>
-      <author/>
-      <othercredit/>
-      <releaseinfo/>
-      <copyright/>
-      <legalnotice/>
-      <pubdate/>
-      <revision/>
-      <revhistory/>
-      <abstract/>
-      <itermset/>
-    </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-<t:titlepage t:element="section" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          margin-left="{$title.margin.left}"
-          font-family="{$title.fontset}"/>
-    <subtitle
-             font-family="{$title.fontset}"/>
-    <corpauthor/>
-    <authorgroup/>
-    <author/>
-    <othercredit/>
-    <releaseinfo/>
-    <copyright/>
-    <legalnotice/>
-    <pubdate/>
-    <revision/>
-    <revhistory/>
-    <abstract/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="sect1" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          margin-left="{$title.margin.left}"
-          font-family="{$title.fontset}"/>
-    <subtitle
-             font-family="{$title.fontset}"/>
-    <corpauthor/>
-    <authorgroup/>
-    <author/>
-    <othercredit/>
-    <releaseinfo/>
-    <copyright/>
-    <legalnotice/>
-    <pubdate/>
-    <revision/>
-    <revhistory/>
-    <abstract/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="sect2" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          margin-left="{$title.margin.left}"
-          font-family="{$title.fontset}"/>
-    <subtitle
-             font-family="{$title.fontset}"/>
-    <corpauthor/>
-    <authorgroup/>
-    <author/>
-    <othercredit/>
-    <releaseinfo/>
-    <copyright/>
-    <legalnotice/>
-    <pubdate/>
-    <revision/>
-    <revhistory/>
-    <abstract/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="sect3" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          margin-left="{$title.margin.left}"
-          font-family="{$title.fontset}"/>
-    <subtitle
-             font-family="{$title.fontset}"/>
-    <corpauthor/>
-    <authorgroup/>
-    <author/>
-    <othercredit/>
-    <releaseinfo/>
-    <copyright/>
-    <legalnotice/>
-    <pubdate/>
-    <revision/>
-    <revhistory/>
-    <abstract/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="sect4" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          margin-left="{$title.margin.left}"
-          font-family="{$title.fontset}"/>
-    <subtitle
-             font-family="{$title.fontset}"/>
-    <corpauthor/>
-    <authorgroup/>
-    <author/>
-    <othercredit/>
-    <releaseinfo/>
-    <copyright/>
-    <legalnotice/>
-    <pubdate/>
-    <revision/>
-    <revhistory/>
-    <abstract/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="sect5" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          margin-left="{$title.margin.left}"
-          font-family="{$title.fontset}"/>
-    <subtitle
-             font-family="{$title.fontset}"/>
-    <corpauthor/>
-    <authorgroup/>
-    <author/>
-    <othercredit/>
-    <releaseinfo/>
-    <copyright/>
-    <legalnotice/>
-    <pubdate/>
-    <revision/>
-    <revhistory/>
-    <abstract/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="simplesect" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          margin-left="{$title.margin.left}"
-          font-family="{$title.fontset}"/>
-    <subtitle
-             font-family="{$title.fontset}"/>
-    <corpauthor/>
-    <authorgroup/>
-    <author/>
-    <othercredit/>
-    <releaseinfo/>
-    <copyright/>
-    <legalnotice/>
-    <pubdate/>
-    <revision/>
-    <revhistory/>
-    <abstract/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<t:titlepage t:element="topic" t:wrapper="fo:block">
-  <t:titlepage-content t:side="recto">
-    <title
-          font-weight="bold"
-           font-size="&hsize3;"
-           space-before="1em"
-           space-after="1em"
-          font-family="{$title.fontset}"/>
-    <subtitle
-             font-family="{$title.fontset}"/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="bibliography" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="component.title"
-            param:node="ancestor-or-self::bibliography[1]"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize5;"
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="bibliodiv" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title t:named-template="component.title"
-            param:node="ancestor-or-self::bibliodiv[1]"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize4;"
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="glossary" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="component.title"
-            param:node="ancestor-or-self::glossary[1]"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize5;"
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="glossdiv" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title t:named-template="component.title"
-            param:node="ancestor-or-self::glossdiv[1]"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize4;"
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="index" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="component.title"
-            param:node="ancestor-or-self::index[1]"
-             param:pagewide="1"
-            margin-left="0pt"
-            font-size="&hsize5;"
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <!-- The indexdiv.title template is used so that manual and -->
-  <!-- automatically generated indexdiv titles get the same -->
-  <!-- formatting. -->
-
-  <t:titlepage t:element="indexdiv" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title t:force="1"
-            t:named-template="indexdiv.title"
-            param:title="title"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="setindex" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="component.title"
-            param:node="ancestor-or-self::setindex[1]"
-             param:pagewide="1"
-            margin-left="0pt"
-            font-size="&hsize5;"
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="colophon" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="component.title"
-            param:node="ancestor-or-self::colophon[1]"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize5;"
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="sidebar" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title 
-            font-family="{$title.fontset}"
-            font-weight="bold"/>
-      <subtitle
-               font-family="{$title.fontset}"/>
-      <itermset/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-<!-- ==================================================================== -->
-<t:titlepage t:element="qandaset" t:wrapper="fo:block"
-             font-family="{$title.fontset}">
-
-  <t:titlepage-content t:side="recto"
-            start-indent="0pt"
-             text-align="center">
-
-    <title t:named-template="component.title"
-          param:node="ancestor-or-self::qandaset[1]"
-          keep-with-next.within-column="always"
-          font-size="&hsize5;"
-          font-weight="bold"/>
-
-    <subtitle/>
-
-    <corpauthor space-before="0.5em"
-                font-size="&hsize2;"/>
-    <authorgroup space-before="0.5em"
-                 font-size="&hsize2;"/>
-    <author space-before="0.5em"
-            font-size="&hsize2;"/>
-
-    <othercredit space-before="0.5em"/>
-    <releaseinfo space-before="0.5em"/>
-    <copyright space-before="0.5em"/>
-    <legalnotice text-align="start"
-                 margin-left="0.5in"
-                 margin-right="0.5in"
-                 font-family="{$body.fontset}"/>
-    <pubdate space-before="0.5em"/>
-    <revision space-before="0.5em"/>
-    <revhistory space-before="0.5em"/>
-    <abstract space-before="0.5em"
-             text-align="start"
-             margin-left="0.5in"
-              margin-right="0.5in"
-              font-family="{$body.fontset}"/>
-    <itermset/>
-  </t:titlepage-content>
-
-  <t:titlepage-content t:side="verso">
-  </t:titlepage-content>
-
-  <t:titlepage-separator>
-  </t:titlepage-separator>
-
-  <t:titlepage-before t:side="recto">
-  </t:titlepage-before>
-
-  <t:titlepage-before t:side="verso">
-  </t:titlepage-before>
-</t:titlepage>
-
-<!-- ==================================================================== -->
-
-  <t:titlepage t:element="table.of.contents" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'TableofContents'"
-             space-before.minimum="1em"
-             space-before.optimum="1.5em"
-             space-before.maximum="2em"
-            space-after="0.5em"
-            start-indent="0pt"
-            font-size="&hsize3;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="list.of.tables" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofTables'"
-             space-before.minimum="1em"
-             space-before.optimum="1.5em"
-             space-before.maximum="2em"
-            space-after="0.5em"
-            start-indent="0pt"
-            font-size="&hsize3;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="list.of.figures" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofFigures'"
-             space-before.minimum="1em"
-             space-before.optimum="1.5em"
-             space-before.maximum="2em"
-            space-after="0.5em"
-            start-indent="0pt"
-            font-size="&hsize3;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="list.of.examples" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofExamples'"
-             space-before.minimum="1em"
-             space-before.optimum="1.5em"
-             space-before.maximum="2em"
-            space-after="0.5em"
-            start-indent="0pt"
-            font-size="&hsize3;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="list.of.equations" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofEquations'"
-             space-before.minimum="1em"
-             space-before.optimum="1.5em"
-             space-before.maximum="2em"
-            space-after="0.5em"
-            start-indent="0pt"
-            font-size="&hsize3;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="list.of.procedures" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofProcedures'"
-             space-before.minimum="1em"
-             space-before.optimum="1.5em"
-             space-before.maximum="2em"
-            space-after="0.5em"
-            start-indent="0pt"
-            font-size="&hsize3;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="list.of.unknowns" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofUnknown'"
-             space-before.minimum="1em"
-             space-before.optimum="1.5em"
-             space-before.maximum="2em"
-            space-after="0.5em"
-            start-indent="0pt"
-            font-size="&hsize3;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="component.list.of.tables" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofTables'"
-             space-before.minimum="1em"
-             space-before.optimum="1em"
-             space-before.maximum="1em"
-            space-after="0.5em"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize1;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="component.list.of.figures" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofFigures'"
-             space-before.minimum="1em"
-             space-before.optimum="1em"
-             space-before.maximum="1em"
-            space-after="0.5em"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize1;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="component.list.of.examples" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofExamples'"
-             space-before.minimum="1em"
-             space-before.optimum="1em"
-             space-before.maximum="1em"
-            space-after="0.5em"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize1;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="component.list.of.equations" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofEquations'"
-             space-before.minimum="1em"
-             space-before.optimum="1em"
-             space-before.maximum="1em"
-            space-after="0.5em"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize1;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="component.list.of.procedures" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofProcedures'"
-             space-before.minimum="1em"
-             space-before.optimum="1em"
-             space-before.maximum="1em"
-            space-after="0.5em"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize1;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-  <t:titlepage t:element="component.list.of.unknowns" t:wrapper="fo:block">
-    <t:titlepage-content t:side="recto">
-      <title
-            t:force="1"
-            t:named-template="gentext"
-            param:key="'ListofUnknown'"
-             space-before.minimum="1em"
-             space-before.optimum="1em"
-             space-before.maximum="1em"
-            space-after="0.5em"
-            margin-left="{$title.margin.left}"
-            font-size="&hsize1;"
-            font-weight="bold"
-            font-family="{$title.fontset}"/>
-    </t:titlepage-content>
-
-    <t:titlepage-content t:side="verso">
-    </t:titlepage-content>
-
-    <t:titlepage-separator>
-    </t:titlepage-separator>
-
-    <t:titlepage-before t:side="recto">
-    </t:titlepage-before>
-
-    <t:titlepage-before t:side="verso">
-    </t:titlepage-before>
-  </t:titlepage>
-
-<!-- ==================================================================== -->
-
-</t:templates>
diff --git a/doc/updating-firmware.inc b/doc/updating-firmware.inc
new file mode 100644 (file)
index 0000000..11ea128
--- /dev/null
@@ -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 (file)
index 0000000..8349f86
--- /dev/null
@@ -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 (file)
index 0000000..1969529
--- /dev/null
@@ -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 (file)
index 4b8c619..0000000
+++ /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>
index 62f03c9d140b8dd98234f12e7e165631a366aba5..085b01314db07ed9cd327cc315de60a95bc01257 100644 (file)
@@ -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;
index 1c36fefeac6d057995fabe80bf212fe2aaaa1b08..0157f05daf7f6f398331a5e9fd800719ccf820bc 100644 (file)
@@ -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;
index a6d0f3213970f4f5d70cddcf0370d42a38ad8a3e..6e45359b7878239a83ac2357e9d30ce828edc877 100644 (file)
@@ -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 {
 
index 7314cc7f91d2f7c38dd4a248fb47582d667dbc01..53d70b1b18b0d7c21027fc472e6c886a0c62f0f8 100644 (file)
@@ -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;
index d3cfc3b8c9979306341841a5cc8d4fb3899bd5b8..c5b5d3d6641d5e2fdde6da9e848419acafb664f1 100644 (file)
@@ -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 {
 
index d48598cb01055fe910a08ef2f0c179b8a891a759..5712d6b66b31827c37d26a0380e63cbde53794ce 100644 (file)
@@ -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 {
 
index d72d956ab7311bb7bf55bf0a1ed5e4d68b611841..01ce284b1086e6b02d1dcb23f01d928255b1a0a1 100644 (file)
@@ -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;
index 9b0f1e7c5e0c2ec23a2fc7921a758f7b0bf35a59..21f839b64f816d13f6bfa0fbbe6e433eb8988b5a 100644 (file)
@@ -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 = {
index c7a2d345a97b02c2ef19c5962858249c390fea7e..c4dcb29c973e8a2f72518c460f27df2213fc5b76 100644 (file)
@@ -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.*;
index 2df81621053c36c2186634501f254b6ff64478dd..1b7327e4ef161249baf139c89fb07709d7f6309d 100644 (file)
@@ -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 {
 
index 6aae0bde176d62a15eaddbdee90fac90581d0130..c35048345373fb27fc3be9c2cd3475ad0dbf1279 100644 (file)
@@ -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 {
 
index d8fe59c2c6249d4d66e818fb299d3eb1340111f4..e964ee9e52bd5e1da4c4ca936f0d6b9bfc049793 100644 (file)
@@ -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 {
 
index 8d20718f7f0c8f2ef950ee0f034db2833da614c9..f5a98929ca01681609124a2f549a11b816cce072 100644 (file)
@@ -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;
index c7a0525d8347e11214e623cc2b41002b401c1033..e808dee24b81fcb6676da6d7acd7bbbacba67337 100644 (file)
@@ -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 {
 
index 8d83fe3e97bc38d69960f79249cc2fa2bb4cb8d5..9e8f193815bbbdd924340824ed8c7081bf144aae 100644 (file)
@@ -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;
index 35d10eeeb329019265678dae82dc096b7c0efcbd..ad7b206c3a8f0876480187980bcffd366d4824f7 100644 (file)
@@ -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;
index 3a7891cbc95832166251435c59d3d97b466f56e9..f6568d3663b50308c32aefd292d4deb10806fbcd 100644 (file)
@@ -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
index 8b1c9061fa3a8f1b30ee13b373afe5cc1ad9d382..bd33f6640cf5882f8630766a9acdd1bc420a9dda 160000 (submodule)
--- a/pdclib
+++ b/pdclib
@@ -1 +1 @@
-Subproject commit 8b1c9061fa3a8f1b30ee13b373afe5cc1ad9d382
+Subproject commit bd33f6640cf5882f8630766a9acdd1bc420a9dda
index dc74bf8ca8925290b82414eba3aecf7f667cf5bf..ebe1df9c18285f1a999f309844fc70fb6103b352 100644 (file)
@@ -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 \
index 7e02939bf7bc0c01bca788bce526da7ee1172115..5f07e8b06cf8827e71e031b215c30a1aedbbc97d 100644 (file)
 #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,     \
index b8698a80dc8a67cd9b798b46c53b908759d312d9..6c192537be7400167d0ebbb460406687d9590c59 100644 (file)
@@ -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);
index acbf589aa4cd0d13054b24d5037804f27689cec5..6a36568748b39218440d45cbf351dd9f534cc94b 100644 (file)
@@ -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
index 32c00068a58d9d89b0a5c29358458afc6c332c1d..08d454670acb0bd881da59385e6e2ac265a3e038 100644 (file)
@@ -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);
 }
-
index dccf602ae1a2c797f0883948bab1a1f433a059f6..42754352e2b3a0b96edd5780d3d77bea094d6faf 100644 (file)
@@ -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_ */
index ffe46c6833723df2279559690e1bec2e7ad6272e..419ea8d34c58e4b5a5281e80f1aff0b4e883eeff 100644 (file)
@@ -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 (file)
index 0000000..2dd2ffd
--- /dev/null
@@ -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_ */
index 961fbb8400e95dab27624b2295075f6a5c6b481e..f1339ee5a543c43d998ce3c5da962489079f6cdb 100644 (file)
@@ -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
index 5b29deaf636ea5e07e6e14e874938d90a6302375..f997f3b55776c87e3d2e93f14d1e1b24f3f88289 100644 (file)
@@ -22,6 +22,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);
 
index d6490ba59cb34866d91170418530e21960e6f780..a5e556384615a6e6a52b2b4b615de5302c119b66 100644 (file)
@@ -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 */
index 854ac898dcbc646613caf036050e7ce205c6e2a0..16363f75a4c26efde892b06d843a354c67e7c376 100644 (file)
@@ -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 (file)
index 0000000..ce1fa6f
--- /dev/null
@@ -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]);
+}
index 799cccbd2a1848bd9510ad0aa1f62d2cea857ee3..01afedc625bc0b66fe4c07798237903019e5f2a9 100644 (file)
@@ -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
index a369070f2fd85435f5542eeedcfa6e686e666562..b62b55800b9c23abc2c78ecc45e6e30829dd982d 100644 (file)
@@ -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 */
index 2616e9061e20a5d1a7ea93073d3c4287dd1dc2bb..7ccc6085ba1b49139dcf1c6ba164304a2393b19f 100644 (file)
@@ -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 */
index 77b753d1edb3083cf56c6d917f30154438da864f..664546c2fc02d4ba3aa5b0462b6b0bae747f24dd 100644 (file)
@@ -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 (file)
index 0000000..e67759a
--- /dev/null
@@ -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 (file)
index 0000000..6a1c05b
--- /dev/null
@@ -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 (file)
index 0000000..9095a35
--- /dev/null
@@ -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 (file)
index 0000000..8642710
--- /dev/null
@@ -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 (file)
index 0000000..d667c18
--- /dev/null
@@ -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 (file)
index 0000000..304bb7c
--- /dev/null
@@ -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_ */
index a9a4b243a690643b65e0431a4406cfb1e30e3452..fbb38df2cf05dba4f17203bd3bb341c40972d485 100644 (file)
@@ -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 */
index 0208e81d1000b17155f9b51ebbfa61f1518c979c..0250a38ee3ef1b4d6ba031e874292574c0f05eac 100644 (file)
@@ -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
index e2cf12587e70203f146150bd4c47969704a7660e..165981f99e3ca6612fe6f79a07ab84dd61388945 100644 (file)
@@ -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 {
 
index 8d4916aa2e5c539240f2c47cee8c812d3d7be719..5a3a05eb395fc5368085b8c0f0ca28ca46797f7e 100644 (file)
@@ -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
index fa394b17fe3c0d2b1e830e861cbeda9e1baf4b39..4d8fdcc97900ce924a2e7b8d95ace8aa69af91d0 100644 (file)
@@ -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)
index 8fe479cc235784f69b48bcd7bf67327c266d1d3f..e3902d2f63773214f70c2fbdda287bbbe19fef01 100644 (file)
@@ -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;
index 6baccce93fe7ec1d7e3b6d00a81827cffd5b6694..ae197abe7919ba0918f0a6274ffc77e49f09836d 100644 (file)
@@ -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 {
 
index d0b843e14a59ab5d41b97272b0100c48a84f5b2f..eab9350aadabef4cda8126249fa95f58dd9f4c2e 100644 (file)
@@ -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
index dac7da5213230785ed52febe596c59777b3f8eda..516eb797002408c5341e96ed952a29c9df781692 100644 (file)
@@ -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 {
 
index 896df9d49c78cb4eec39641b6988b1949384b6f2..3a6b25151abf503c811fdd73b9c605bd855ed103 100644 (file)
@@ -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;
index eef0a034087f42dcd9c50f239b54e96db4967d7f..655f42f50df0804cd8bcd176219d5715a9c05c40 100644 (file)
@@ -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 {