diff options
author | Bdale Garbee <bdale@gag.com> | 2016-01-10 19:04:49 -0700 |
---|---|---|
committer | Bdale Garbee <bdale@gag.com> | 2016-01-10 19:04:49 -0700 |
commit | 70e9064ca962dfd345f8a342afa130f969606553 (patch) | |
tree | e8e374912df403e7e237aecbd1ec0a19fa6c5c42 | |
parent | 489d22f448d9927533e90da4d16c5a332a234a8d (diff) | |
parent | 73ce3f73526edfabccd3b98e6e67de6d82a84b63 (diff) |
Merge branch 'master' into branch-1.6
453 files changed, 14436 insertions, 14190 deletions
diff --git a/Makefile.am b/Makefile.am index 1af40358..e4b9664b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -39,6 +39,7 @@ fat_windows = \ micropeak/MicroPeak-Windows-$(VERSION_DASH).exe keithp-fat: fat + ssh keithp.com mkdir -p public_html/altos-$(VERSION) scp -p $(fat_linux) $(fat_mac) $(fat_windows) keithp.com:public_html/altos-$(VERSION) set-java-versions: @@ -5,6 +5,8 @@ These are Bdale's notes on how to do a release. git checkout master + - update the version in configure.ac if Keith hasn't already + - make sure the Google Maps API key is in the build chroot and root sudo mkdir -p /var/cache/pbuilder/base.cow/opt/google /opt/google sudo cp ~/altusmetrumllc/google-maps-api-key \ @@ -19,8 +21,6 @@ These are Bdale's notes on how to do a release. git checkout branch-<version> # the x.y parts only - cherry-pick or merge appropriate content from master - - update the version in configure.ac - - make sure there is a doc/release-notes-<version>.xsl - make sure that doc/altusmetrum.xsl has the right copyright year, and add release to the revision history at the front (release notes diff --git a/altosdroid/res/layout/map_preload.xml b/altosdroid/res/layout/map_preload.xml index dc613bf2..e8b0f26c 100644 --- a/altosdroid/res/layout/map_preload.xml +++ b/altosdroid/res/layout/map_preload.xml @@ -45,7 +45,7 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/preload_latitude_label" - android:inputType="number"/> + android:inputType="number|numberSigned|numberDecimal"/> <TextView android:id="@+id/preload_longitude_label" android:layout_width="fill_parent" android:layout_height="wrap_content" @@ -55,7 +55,7 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/preload_longitude_label" - android:inputType="number"/> + android:inputType="number|numberSigned|numberDecimal"/> <TextView android:id="@+id/preload_types" android:layout_width="fill_parent" android:layout_height="wrap_content" diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java index 976e64bb..baf38fb7 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java @@ -30,7 +30,7 @@ import android.bluetooth.BluetoothSocket; import android.os.Handler; //import android.os.Message; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosBluetooth extends AltosDroidLink { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java index db63d810..df348c9d 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java @@ -20,7 +20,7 @@ import java.util.Arrays; import java.io.*; import java.lang.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import android.app.Activity; import android.graphics.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index 3a07212a..b26a9bc8 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -49,7 +49,7 @@ import android.hardware.usb.*; import android.graphics.*; import android.graphics.drawable.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosDroid extends FragmentActivity implements AltosUnitsListener { @@ -386,12 +386,12 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { AltosGreatCircle from_receiver = null; if (saved_state != null) - prev_state = saved_state.state; + prev_state = saved_state.state(); if (state != null) { set_screen_on(state_age(state)); - if (state.state == AltosLib.ao_flight_stateless) { + if (state.state() == AltosLib.ao_flight_stateless) { boolean prev_locked = false; boolean locked = false; @@ -408,9 +408,9 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { } } } else { - if (prev_state != state.state) { + if (prev_state != state.state()) { String currentTab = mTabHost.getCurrentTabTag(); - switch (state.state) { + switch (state.state()) { case AltosLib.ao_flight_boost: if (currentTab.equals(tab_pad_name)) mTabHost.setCurrentTabByTag(tab_flight_name); break; @@ -448,8 +448,8 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { else mFlightView.setText(String.format("%d", state.flight)); } - if (saved_state == null || state.state != saved_state.state) { - if (state.state == AltosLib.ao_flight_stateless) { + if (saved_state == null || state.state() != saved_state.state()) { + if (state.state() == AltosLib.ao_flight_stateless) { mStateLayout.setVisibility(View.GONE); } else { mStateView.setText(state.state_name()); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java index 7cbba794..0e3511d3 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java @@ -24,7 +24,7 @@ import java.util.UUID; import android.os.Handler; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public abstract class AltosDroidLink extends AltosLink { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java index 5f6ff198..59f08c34 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java @@ -20,7 +20,7 @@ package org.altusmetrum.AltosDroid; import java.util.*; import java.io.*; import android.location.Location; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public interface AltosDroidMapInterface { public void onCreateView(AltosDroid altos_droid); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java index a4e27006..02defbcb 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java @@ -17,7 +17,7 @@ package org.altusmetrum.AltosDroid; import android.content.Context; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosDroidPreferences extends AltosPreferences { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java index 2ff711f5..14e6ce73 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java @@ -24,7 +24,7 @@ import android.content.SharedPreferences; import android.os.Environment; import android.util.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosDroidPreferencesBackend implements AltosPreferencesBackend { public final static String NAME = "org.altusmetrum.AltosDroid"; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java index 9d612a1e..792d0621 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java @@ -17,7 +17,7 @@ package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import android.location.Location; import android.app.Activity; import android.graphics.Color; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java index eb059901..28752110 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java @@ -20,7 +20,7 @@ package org.altusmetrum.AltosDroid; import java.util.*; import java.io.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import android.app.Activity; import android.graphics.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java index 4ac95c0b..10327091 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java @@ -19,7 +19,7 @@ package org.altusmetrum.AltosDroid; import java.util.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import com.google.android.gms.maps.*; import com.google.android.gms.maps.model.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java index b7eb76a5..12055dc5 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java @@ -28,7 +28,7 @@ import android.hardware.usb.*; import android.app.*; import android.os.Handler; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosUsb extends AltosDroidLink { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java index 325b89d2..bdc80003 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java @@ -22,7 +22,7 @@ import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; import android.location.Location; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosVoice { @@ -186,9 +186,9 @@ public class AltosVoice { if (last_tell_mode != TELL_MODE_FLIGHT) last_flight_tell = TELL_FLIGHT_NONE; - if (state.state != last_state && AltosLib.ao_flight_boost <= state.state && state.state <= AltosLib.ao_flight_landed) { + if (state.state() != last_state && AltosLib.ao_flight_boost <= state.state() && state.state() <= AltosLib.ao_flight_landed) { speak(state.state_name()); - if (descending(state.state) && !descending(last_state)) { + if (descending(state.state()) && !descending(last_state)) { if (state.max_height() != AltosLib.MISSING) { speak("max height: %s.", AltosConvert.height.say_units(state.max_height())); @@ -211,7 +211,7 @@ public class AltosVoice { if (last_flight_tell == TELL_FLIGHT_NONE || last_flight_tell == TELL_FLIGHT_STATE || last_flight_tell == TELL_FLIGHT_TRACK) { last_flight_tell = TELL_FLIGHT_SPEED; - if (state.state <= AltosLib.ao_flight_coast) { + if (state.state() <= AltosLib.ao_flight_coast) { speed = state.speed(); } else { speed = state.gps_speed(); @@ -312,7 +312,7 @@ public class AltosVoice { last_tell_mode = tell_mode; last_tell_serial = tell_serial; if (state != null) { - last_state = state.state; + last_state = state.state(); last_height = state.height(); if (state.gps != null) last_gps = state.gps; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java index 8846e56c..e1677ce6 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java @@ -34,7 +34,7 @@ import android.view.View.OnClickListener; import android.widget.*; import android.widget.AdapterView.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class MapTypeActivity extends Activity { private Button hybrid; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java index d7462089..e6ce3809 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java @@ -41,7 +41,7 @@ import android.location.LocationManager; import android.location.LocationListener; import android.location.Criteria; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; /** * This Activity appears as a dialog. It lists any paired devices and diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java index a503f1bc..095d6b33 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java @@ -17,7 +17,7 @@ package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import android.app.Activity; import android.os.Bundle; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java index 54ccd18f..3c236d58 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java @@ -20,7 +20,7 @@ package org.altusmetrum.AltosDroid; import java.util.*; import java.io.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import android.app.Activity; import android.graphics.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index 4d04316f..f5fbaf61 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -17,7 +17,7 @@ package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import android.app.Activity; import android.os.Bundle; @@ -191,9 +191,9 @@ public class TabPad extends AltosDroidTab { } if (state.flight != 0) { - if (state.state <= AltosLib.ao_flight_pad) + if (state.state() <= AltosLib.ao_flight_pad) data_logging_view.setText("Ready to record"); - else if (state.state < AltosLib.ao_flight_landed) + else if (state.state() < AltosLib.ao_flight_landed) data_logging_view.setText("Recording data"); else data_logging_view.setText("Recorded data"); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java index 19bb79d3..ee82d391 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java @@ -17,7 +17,7 @@ package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import android.app.Activity; import android.os.Bundle; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java index 79020c16..6f595817 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java @@ -1,6 +1,6 @@ package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import android.content.BroadcastReceiver; import android.content.Context; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 3199f252..473a4bfb 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -25,7 +25,7 @@ import java.util.*; import java.util.concurrent.*; import android.os.Handler; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class TelemetryReader extends Thread { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java index 4a056d95..92a7ecfa 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -43,7 +43,7 @@ import android.location.LocationManager; import android.location.LocationListener; import android.location.Criteria; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class TelemetryService extends Service implements LocationListener { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java index f9191a32..c81dfcd2 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java @@ -18,7 +18,7 @@ package org.altusmetrum.AltosDroid; import java.util.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import android.location.Location; public class TelemetryState { diff --git a/altoslib/AltosAccel.java b/altoslib/AltosAccel.java index e4e7df90..e12b6375 100644 --- a/altoslib/AltosAccel.java +++ b/altoslib/AltosAccel.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; diff --git a/altoslib/AltosCRCException.java b/altoslib/AltosCRCException.java index eaff0808..d2337512 100644 --- a/altoslib/AltosCRCException.java +++ b/altoslib/AltosCRCException.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosCRCException extends Exception { public int rssi; diff --git a/altoslib/AltosCSV.java b/altoslib/AltosCSV.java index edb23e69..8a389812 100644 --- a/altoslib/AltosCSV.java +++ b/altoslib/AltosCSV.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; @@ -129,7 +129,7 @@ public class AltosCSV implements AltosWriter { } void write_flight(AltosState state) { - out.printf("%d,%8s", state.state, state.state_name()); + out.printf("%d,%8s", state.state(), state.state_name()); } void write_basic_header() { @@ -326,14 +326,14 @@ public class AltosCSV implements AltosWriter { } private void write(AltosState state) { - if (state.state == AltosLib.ao_flight_startup) + if (state.state() == AltosLib.ao_flight_startup) return; if (!header_written) { write_header(); header_written = true; } if (!seen_boost) { - if (state.state >= AltosLib.ao_flight_boost) { + if (state.state() >= AltosLib.ao_flight_boost) { seen_boost = true; boost_tick = state.tick; flush_pad(); @@ -368,7 +368,7 @@ public class AltosCSV implements AltosWriter { has_gps_sat = false; has_companion = false; for (AltosState state : states) { - if (state.state != AltosLib.ao_flight_stateless && state.state != AltosLib.ao_flight_invalid && state.state != AltosLib.ao_flight_startup) + if (state.state() != AltosLib.ao_flight_stateless && state.state() != AltosLib.ao_flight_invalid && state.state() != AltosLib.ao_flight_startup) has_flight_state = true; if (state.acceleration() != AltosLib.MISSING || state.pressure() != AltosLib.MISSING) has_basic = true; diff --git a/altoslib/AltosCompanion.java b/altoslib/AltosCompanion.java index 86b23eb6..87e701cf 100644 --- a/altoslib/AltosCompanion.java +++ b/altoslib/AltosCompanion.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index 8e052934..7a518ab4 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.*; import java.text.*; diff --git a/altoslib/AltosConfigDataException.java b/altoslib/AltosConfigDataException.java index da11336d..d1d0d8d0 100644 --- a/altoslib/AltosConfigDataException.java +++ b/altoslib/AltosConfigDataException.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosConfigDataException extends Exception { diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java index f8a2fb14..3306aa4b 100644 --- a/altoslib/AltosConfigValues.java +++ b/altoslib/AltosConfigValues.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosConfigValues { /* set and get all of the dialog values */ diff --git a/altoslib/AltosConvert.java b/altoslib/AltosConvert.java index fd2f5750..59092a6f 100644 --- a/altoslib/AltosConvert.java +++ b/altoslib/AltosConvert.java @@ -18,7 +18,7 @@ /* * Sensor data conversion functions */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosConvert { /* diff --git a/altoslib/AltosDebug.java b/altoslib/AltosDebug.java index 16dcf6f5..35f51dd4 100644 --- a/altoslib/AltosDebug.java +++ b/altoslib/AltosDebug.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; diff --git a/altoslib/AltosDistance.java b/altoslib/AltosDistance.java index a05fb7e2..fe18250e 100644 --- a/altoslib/AltosDistance.java +++ b/altoslib/AltosDistance.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosDistance extends AltosUnits { diff --git a/altoslib/AltosEeprom.java b/altoslib/AltosEeprom.java index 194b10e8..7379b510 100644 --- a/altoslib/AltosEeprom.java +++ b/altoslib/AltosEeprom.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromChunk.java b/altoslib/AltosEepromChunk.java index 9174c6a9..b996eb00 100644 --- a/altoslib/AltosEepromChunk.java +++ b/altoslib/AltosEepromChunk.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.text.*; import java.util.concurrent.*; diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java index baaeb993..67f7fc57 100644 --- a/altoslib/AltosEepromDownload.java +++ b/altoslib/AltosEepromDownload.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; @@ -35,7 +35,7 @@ public class AltosEepromDownload implements Runnable { AltosEepromList flights; boolean success; - ParseException parse_exception; + String parse_errors; AltosState state; private void FlushPending() throws IOException { @@ -88,6 +88,13 @@ public class AltosEepromDownload implements Runnable { } } + void LogError(String error) { + if (parse_errors != null) + parse_errors.concat(error.concat("\n")); + else + parse_errors = error; + } + void CaptureEeprom(AltosEepromChunk eechunk, int log_format) throws IOException, ParseException { boolean any_valid = false; boolean got_flight = false; @@ -98,7 +105,14 @@ public class AltosEepromDownload implements Runnable { monitor.set_serial(flights.config_data.serial); for (int i = 0; i < AltosEepromChunk.chunk_size && !done; i += record_length) { - AltosEeprom r = eechunk.eeprom(i, log_format, state); + AltosEeprom r = null; + + try { + r = eechunk.eeprom(i, log_format, state); + } catch (ParseException pe) { + LogError(pe.getMessage()); + r = null; + } if (r == null) continue; @@ -111,12 +125,12 @@ public class AltosEepromDownload implements Runnable { monitor.set_flight(state.flight); /* Monitor state transitions to update display */ - if (state.state != AltosLib.ao_flight_invalid && - state.state <= AltosLib.ao_flight_landed) + if (state.state() != AltosLib.ao_flight_invalid && + state.state() <= AltosLib.ao_flight_landed) { - if (state.state > AltosLib.ao_flight_pad) + if (state.state() > AltosLib.ao_flight_pad) want_file = true; - if (state.state == AltosLib.ao_flight_landed) + if (state.state() == AltosLib.ao_flight_landed) done = true; } @@ -147,7 +161,6 @@ public class AltosEepromDownload implements Runnable { /* Reset per-capture variables */ want_file = false; - eeprom_file = null; eeprom_pending = new LinkedList<String>(); /* Set serial number in the monitor dialog window */ @@ -174,21 +187,17 @@ public class AltosEepromDownload implements Runnable { CaptureEeprom (eechunk, log_format); - if (state.state != prev_state && state.state != AltosLib.ao_flight_invalid) { + if (state.state() != prev_state && state.state() != AltosLib.ao_flight_invalid) { state_block = block; - prev_state = state.state; + prev_state = state.state(); } monitor.set_value(state.state_name(), - state.state, + state.state(), block - state_block, block - log.start_block); } CheckFile(true); - if (eeprom_file != null) { - eeprom_file.flush(); - eeprom_file.close(); - } } public void run () { @@ -198,20 +207,25 @@ public class AltosEepromDownload implements Runnable { link.start_remote(); for (AltosEepromLog log : flights) { - parse_exception = null; + parse_errors = null; if (log.selected) { monitor.reset(); + eeprom_file = null; try { CaptureLog(log); } catch (ParseException e) { - parse_exception = e; + LogError(e.getMessage()); + } + if (eeprom_file != null) { + eeprom_file.flush(); + eeprom_file.close(); } } - if (parse_exception != null) { + if (parse_errors != null) { failed = true; - monitor.show_message(String.format("Flight %d download error\n%s\nValid log data saved", + monitor.show_message(String.format("Flight %d download error. Valid log data saved\n%s", log.flight, - parse_exception.getMessage()), + parse_errors), link.name, AltosEepromMonitor.WARNING_MESSAGE); } diff --git a/altoslib/AltosEepromFile.java b/altoslib/AltosEepromFile.java index 33d4f63b..d88aeab9 100644 --- a/altoslib/AltosEepromFile.java +++ b/altoslib/AltosEepromFile.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; @@ -72,7 +72,7 @@ public class AltosEepromFile extends AltosStateIterable { headers = new AltosEepromIterable(AltosEepromHeader.read(input)); start = headers.state(); - if (start.state != AltosLib.ao_flight_stateless) + if (start.state() != AltosLib.ao_flight_stateless) start.set_state(AltosLib.ao_flight_pad); if (start.log_format == AltosLib.MISSING) { @@ -117,7 +117,7 @@ public class AltosEepromFile extends AltosStateIterable { for (AltosEeprom eeprom : body) { eeprom.update_state(state); state.finish_update(); - if (state.state >= AltosLib.ao_flight_boost) { + if (state.state() >= AltosLib.ao_flight_boost) { start.set_boost_tick(state.tick); break; } diff --git a/altoslib/AltosEepromGPS.java b/altoslib/AltosEepromGPS.java index aeb61661..07ef2920 100644 --- a/altoslib/AltosEepromGPS.java +++ b/altoslib/AltosEepromGPS.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromHeader.java b/altoslib/AltosEepromHeader.java index 95ecc32c..e7ed93b0 100644 --- a/altoslib/AltosEepromHeader.java +++ b/altoslib/AltosEepromHeader.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromIterable.java b/altoslib/AltosEepromIterable.java index c3cd5d86..f607fbd2 100644 --- a/altoslib/AltosEepromIterable.java +++ b/altoslib/AltosEepromIterable.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromList.java b/altoslib/AltosEepromList.java index 6dc6a3d6..12d10b6e 100644 --- a/altoslib/AltosEepromList.java +++ b/altoslib/AltosEepromList.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromLog.java b/altoslib/AltosEepromLog.java index 538c102b..d1a1ab6c 100644 --- a/altoslib/AltosEepromLog.java +++ b/altoslib/AltosEepromLog.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.text.*; import java.util.concurrent.*; diff --git a/altoslib/AltosEepromMega.java b/altoslib/AltosEepromMega.java index d5f0e0e0..db8ab3a8 100644 --- a/altoslib/AltosEepromMega.java +++ b/altoslib/AltosEepromMega.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromMetrum2.java b/altoslib/AltosEepromMetrum2.java index 1b4cb04a..df0075b9 100644 --- a/altoslib/AltosEepromMetrum2.java +++ b/altoslib/AltosEepromMetrum2.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromMini.java b/altoslib/AltosEepromMini.java index 8d0343b8..228145eb 100644 --- a/altoslib/AltosEepromMini.java +++ b/altoslib/AltosEepromMini.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromMonitor.java b/altoslib/AltosEepromMonitor.java index 1c1d1010..800dc0b9 100644 --- a/altoslib/AltosEepromMonitor.java +++ b/altoslib/AltosEepromMonitor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosEepromMonitor { diff --git a/altoslib/AltosEepromTM.java b/altoslib/AltosEepromTM.java index 44b98e49..316058e2 100644 --- a/altoslib/AltosEepromTM.java +++ b/altoslib/AltosEepromTM.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromTm.java b/altoslib/AltosEepromTm.java index 0a37a2aa..090b65e3 100644 --- a/altoslib/AltosEepromTm.java +++ b/altoslib/AltosEepromTm.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosFile.java b/altoslib/AltosFile.java index cab38d6d..b8d62179 100644 --- a/altoslib/AltosFile.java +++ b/altoslib/AltosFile.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.File; import java.util.*; diff --git a/altoslib/AltosFlash.java b/altoslib/AltosFlash.java index e4b980b0..627b758b 100644 --- a/altoslib/AltosFlash.java +++ b/altoslib/AltosFlash.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; diff --git a/altoslib/AltosFlashListener.java b/altoslib/AltosFlashListener.java index 6a7351f3..e977c579 100644 --- a/altoslib/AltosFlashListener.java +++ b/altoslib/AltosFlashListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosFlashListener { public void position(String label, int percent); diff --git a/altoslib/AltosFlightDisplay.java b/altoslib/AltosFlightDisplay.java index 33d71fc3..912f470f 100644 --- a/altoslib/AltosFlightDisplay.java +++ b/altoslib/AltosFlightDisplay.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosFlightDisplay extends AltosUnitsListener, AltosFontListener { void reset(); diff --git a/altoslib/AltosFlightReader.java b/altoslib/AltosFlightReader.java index fca0f20b..84b2392b 100644 --- a/altoslib/AltosFlightReader.java +++ b/altoslib/AltosFlightReader.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.text.*; import java.io.*; diff --git a/altoslib/AltosFlightStats.java b/altoslib/AltosFlightStats.java index b837ba84..39e8cdae 100644 --- a/altoslib/AltosFlightStats.java +++ b/altoslib/AltosFlightStats.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; @@ -52,7 +52,7 @@ public class AltosFlightStats { for (AltosState s : states) { state = s; - if (state.state == AltosLib.ao_flight_landed) + if (state.state() == AltosLib.ao_flight_landed) break; } @@ -92,7 +92,7 @@ public class AltosFlightStats { state = s; if (state.acceleration() < 1) boost_time = state.time; - if (state.state >= AltosLib.ao_flight_boost && state.state <= AltosLib.ao_flight_landed) + if (state.state() >= AltosLib.ao_flight_boost && state.state() <= AltosLib.ao_flight_landed) break; } if (state == null) @@ -138,7 +138,7 @@ public class AltosFlightStats { if (state.pressure() != AltosLib.MISSING) has_flight_data = true; - int state_id = state.state; + int state_id = state.state(); if (state.time >= boost_time && state_id < AltosLib.ao_flight_boost) state_id = AltosLib.ao_flight_boost; if (state.time >= landed_time && state_id < AltosLib.ao_flight_landed) diff --git a/altoslib/AltosFontListener.java b/altoslib/AltosFontListener.java index 78049350..ae23e13c 100644 --- a/altoslib/AltosFontListener.java +++ b/altoslib/AltosFontListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosFontListener { void font_size_changed(int font_size); diff --git a/altoslib/AltosFrequency.java b/altoslib/AltosFrequency.java index 6d2bb8d0..7c6ffe61 100644 --- a/altoslib/AltosFrequency.java +++ b/altoslib/AltosFrequency.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosFrequency { public double frequency; diff --git a/altoslib/AltosGPS.java b/altoslib/AltosGPS.java index a2584e77..a4cd2061 100644 --- a/altoslib/AltosGPS.java +++ b/altoslib/AltosGPS.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.text.*; import java.util.concurrent.*; diff --git a/altoslib/AltosGPSSat.java b/altoslib/AltosGPSSat.java index 44782003..3f9e479e 100644 --- a/altoslib/AltosGPSSat.java +++ b/altoslib/AltosGPSSat.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosGPSSat { public int svid; diff --git a/altoslib/AltosGreatCircle.java b/altoslib/AltosGreatCircle.java index e13eca48..9ced17e7 100644 --- a/altoslib/AltosGreatCircle.java +++ b/altoslib/AltosGreatCircle.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.lang.Math; import java.io.*; diff --git a/altoslib/AltosHeight.java b/altoslib/AltosHeight.java index bc20ef24..5cc3c20c 100644 --- a/altoslib/AltosHeight.java +++ b/altoslib/AltosHeight.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosHeight extends AltosUnits { diff --git a/altoslib/AltosHexfile.java b/altoslib/AltosHexfile.java index ece822d8..fb036d0c 100644 --- a/altoslib/AltosHexfile.java +++ b/altoslib/AltosHexfile.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.LinkedList; diff --git a/altoslib/AltosHexsym.java b/altoslib/AltosHexsym.java index e1561c7d..0149fde1 100644 --- a/altoslib/AltosHexsym.java +++ b/altoslib/AltosHexsym.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosHexsym { String name; diff --git a/altoslib/AltosIMU.java b/altoslib/AltosIMU.java index 7a4a705d..285de8cc 100644 --- a/altoslib/AltosIMU.java +++ b/altoslib/AltosIMU.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.*; import java.io.*; diff --git a/altoslib/AltosIdle.java b/altoslib/AltosIdle.java index 0e2576cd..2e5981db 100644 --- a/altoslib/AltosIdle.java +++ b/altoslib/AltosIdle.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosIdleFetch.java b/altoslib/AltosIdleFetch.java index 6c0d130b..48db6ab4 100644 --- a/altoslib/AltosIdleFetch.java +++ b/altoslib/AltosIdleFetch.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosIdleMonitor.java b/altoslib/AltosIdleMonitor.java index 1b62f385..d5c1a428 100644 --- a/altoslib/AltosIdleMonitor.java +++ b/altoslib/AltosIdleMonitor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.concurrent.*; diff --git a/altoslib/AltosIdleMonitorListener.java b/altoslib/AltosIdleMonitorListener.java index 1d06c4d9..5b751e52 100644 --- a/altoslib/AltosIdleMonitorListener.java +++ b/altoslib/AltosIdleMonitorListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosIdleMonitorListener { public void update(AltosState state, AltosListenerState listener_state); diff --git a/altoslib/AltosIgnite.java b/altoslib/AltosIgnite.java index 39f792db..d5348628 100644 --- a/altoslib/AltosIgnite.java +++ b/altoslib/AltosIgnite.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.*; import java.io.*; diff --git a/altoslib/AltosImage.java b/altoslib/AltosImage.java index fc0192a3..7a0fe9dd 100644 --- a/altoslib/AltosImage.java +++ b/altoslib/AltosImage.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; diff --git a/altoslib/AltosKML.java b/altoslib/AltosKML.java index 81433958..d302535f 100644 --- a/altoslib/AltosKML.java +++ b/altoslib/AltosKML.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; @@ -112,8 +112,8 @@ public class AltosKML implements AltosWriter { boolean started = false; void state_start(AltosState state) { - String state_name = AltosLib.state_name(state.state); - String state_color = state_color(state.state); + String state_name = AltosLib.state_name(state.state()); + String state_color = state_color(state.state()); out.printf(kml_style_start, state_name, state_color); out.printf("\tState: %s\n", state_name); out.printf("%s", kml_style_end); @@ -171,8 +171,8 @@ public class AltosKML implements AltosWriter { } if (prev != null && prev.gps_sequence == state.gps_sequence) return; - if (state.state != flight_state) { - flight_state = state.state; + if (state.state() != flight_state) { + flight_state = state.state(); if (prev != null) { coord(state); state_end(prev); diff --git a/altoslib/AltosLatLon.java b/altoslib/AltosLatLon.java index e438a787..8cd851e5 100644 --- a/altoslib/AltosLatLon.java +++ b/altoslib/AltosLatLon.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosLatLon { public double lat; diff --git a/altoslib/AltosLatitude.java b/altoslib/AltosLatitude.java index 7091ce9c..51d77785 100644 --- a/altoslib/AltosLatitude.java +++ b/altoslib/AltosLatitude.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosLatitude extends AltosLocation { public String pos() { return "N"; } diff --git a/altoslib/AltosLaunchSite.java b/altoslib/AltosLaunchSite.java index 0fa9bbd4..7958d186 100644 --- a/altoslib/AltosLaunchSite.java +++ b/altoslib/AltosLaunchSite.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.lang.*; diff --git a/altoslib/AltosLaunchSiteListener.java b/altoslib/AltosLaunchSiteListener.java index f4658660..4270dc4a 100644 --- a/altoslib/AltosLaunchSiteListener.java +++ b/altoslib/AltosLaunchSiteListener.java @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.lang.*; diff --git a/altoslib/AltosLaunchSites.java b/altoslib/AltosLaunchSites.java index fa4026ba..4e843c10 100644 --- a/altoslib/AltosLaunchSites.java +++ b/altoslib/AltosLaunchSites.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.lang.*; diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java index e82b1c73..575cfc1a 100644 --- a/altoslib/AltosLib.java +++ b/altoslib/AltosLib.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.*; import java.io.*; diff --git a/altoslib/AltosLine.java b/altoslib/AltosLine.java index b18aa965..cf3a1984 100644 --- a/altoslib/AltosLine.java +++ b/altoslib/AltosLine.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosLine { public String line; diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java index f8bf4702..10967417 100644 --- a/altoslib/AltosLink.java +++ b/altoslib/AltosLink.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.concurrent.*; diff --git a/altoslib/AltosListenerState.java b/altoslib/AltosListenerState.java index 9d7922d5..7df5c9bf 100644 --- a/altoslib/AltosListenerState.java +++ b/altoslib/AltosListenerState.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; diff --git a/altoslib/AltosLocation.java b/altoslib/AltosLocation.java index 231cd94b..436e4b02 100644 --- a/altoslib/AltosLocation.java +++ b/altoslib/AltosLocation.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public abstract class AltosLocation extends AltosUnits { diff --git a/altoslib/AltosLog.java b/altoslib/AltosLog.java index b89bac38..58306d55 100644 --- a/altoslib/AltosLog.java +++ b/altoslib/AltosLog.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.text.*; diff --git a/altoslib/AltosLongitude.java b/altoslib/AltosLongitude.java index e3e53282..bc088602 100644 --- a/altoslib/AltosLongitude.java +++ b/altoslib/AltosLongitude.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosLongitude extends AltosLocation { public String pos() { return "E"; } diff --git a/altoslib/AltosMag.java b/altoslib/AltosMag.java index 351125bf..3643ca9e 100644 --- a/altoslib/AltosMag.java +++ b/altoslib/AltosMag.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.*; import java.io.*; diff --git a/altoslib/AltosMap.java b/altoslib/AltosMap.java index 8a3266c9..6c08f2d7 100644 --- a/altoslib/AltosMap.java +++ b/altoslib/AltosMap.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.lang.*; @@ -230,23 +230,23 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener { if (!gps.locked && gps.nsat < 4) return; - switch (state.state) { + switch (state.state()) { case AltosLib.ao_flight_boost: if (!have_boost) { - add_mark(gps.lat, gps.lon, state.state); + add_mark(gps.lat, gps.lon, state.state()); have_boost = true; } break; case AltosLib.ao_flight_landed: if (!have_landed) { - add_mark(gps.lat, gps.lon, state.state); + add_mark(gps.lat, gps.lon, state.state()); have_landed = true; } break; } if (path != null) { - AltosMapRectangle damage = path.add(gps.lat, gps.lon, state.state); + AltosMapRectangle damage = path.add(gps.lat, gps.lon, state.state()); if (damage != null) repaint(damage, AltosMapPath.stroke_width); diff --git a/altoslib/AltosMapCache.java b/altoslib/AltosMapCache.java index f0ad433c..744790c6 100644 --- a/altoslib/AltosMapCache.java +++ b/altoslib/AltosMapCache.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.net.*; diff --git a/altoslib/AltosMapCacheListener.java b/altoslib/AltosMapCacheListener.java index dec181bc..c0409630 100644 --- a/altoslib/AltosMapCacheListener.java +++ b/altoslib/AltosMapCacheListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosMapCacheListener { public void map_cache_changed(int map_cache); diff --git a/altoslib/AltosMapInterface.java b/altoslib/AltosMapInterface.java index 45398ecd..0a59a808 100644 --- a/altoslib/AltosMapInterface.java +++ b/altoslib/AltosMapInterface.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.net.*; diff --git a/altoslib/AltosMapLine.java b/altoslib/AltosMapLine.java index 09ecb0c9..061f226e 100644 --- a/altoslib/AltosMapLine.java +++ b/altoslib/AltosMapLine.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.lang.Math; diff --git a/altoslib/AltosMapLoader.java b/altoslib/AltosMapLoader.java index 8573489a..9ed93a42 100644 --- a/altoslib/AltosMapLoader.java +++ b/altoslib/AltosMapLoader.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosMapLoaderListener.java b/altoslib/AltosMapLoaderListener.java index 0b41d9f4..798270cc 100644 --- a/altoslib/AltosMapLoaderListener.java +++ b/altoslib/AltosMapLoaderListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosMapLoaderListener { public abstract void loader_start(int max); diff --git a/altoslib/AltosMapMark.java b/altoslib/AltosMapMark.java index cc28f438..e87c168d 100644 --- a/altoslib/AltosMapMark.java +++ b/altoslib/AltosMapMark.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.lang.Math; diff --git a/altoslib/AltosMapPath.java b/altoslib/AltosMapPath.java index 6967f479..64be49be 100644 --- a/altoslib/AltosMapPath.java +++ b/altoslib/AltosMapPath.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.lang.Math; diff --git a/altoslib/AltosMapPathPoint.java b/altoslib/AltosMapPathPoint.java index 0af98997..d500a7db 100644 --- a/altoslib/AltosMapPathPoint.java +++ b/altoslib/AltosMapPathPoint.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.lang.Math; diff --git a/altoslib/AltosMapRectangle.java b/altoslib/AltosMapRectangle.java index 9fdab1a0..9c116b82 100644 --- a/altoslib/AltosMapRectangle.java +++ b/altoslib/AltosMapRectangle.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosMapRectangle { AltosLatLon ul, lr; diff --git a/altoslib/AltosMapStore.java b/altoslib/AltosMapStore.java index b24fabc8..c0638433 100644 --- a/altoslib/AltosMapStore.java +++ b/altoslib/AltosMapStore.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.net.*; diff --git a/altoslib/AltosMapStoreListener.java b/altoslib/AltosMapStoreListener.java index cef4f926..8912caf7 100644 --- a/altoslib/AltosMapStoreListener.java +++ b/altoslib/AltosMapStoreListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosMapStoreListener { abstract void notify_store(AltosMapStore store, int status); diff --git a/altoslib/AltosMapTile.java b/altoslib/AltosMapTile.java index a6ba5da5..23ab64e4 100644 --- a/altoslib/AltosMapTile.java +++ b/altoslib/AltosMapTile.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosMapTileListener.java b/altoslib/AltosMapTileListener.java index c02483bb..83c1eaed 100644 --- a/altoslib/AltosMapTileListener.java +++ b/altoslib/AltosMapTileListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosMapTileListener { abstract public void notify_tile(AltosMapTile tile, int status); diff --git a/altoslib/AltosMapTransform.java b/altoslib/AltosMapTransform.java index b8f29107..ae78befa 100644 --- a/altoslib/AltosMapTransform.java +++ b/altoslib/AltosMapTransform.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.lang.Math; diff --git a/altoslib/AltosMapZoomListener.java b/altoslib/AltosMapZoomListener.java index aa067303..5067aaec 100644 --- a/altoslib/AltosMapZoomListener.java +++ b/altoslib/AltosMapZoomListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosMapZoomListener { abstract public void zoom_changed(int zoom); diff --git a/altoslib/AltosMma655x.java b/altoslib/AltosMma655x.java index 8b1ac088..17aaa3f8 100644 --- a/altoslib/AltosMma655x.java +++ b/altoslib/AltosMma655x.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.*; diff --git a/altoslib/AltosMs5607.java b/altoslib/AltosMs5607.java index e7ca1ba3..aa16e231 100644 --- a/altoslib/AltosMs5607.java +++ b/altoslib/AltosMs5607.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.*; import java.io.*; diff --git a/altoslib/AltosNoSymbol.java b/altoslib/AltosNoSymbol.java index 6ef2a142..51b48666 100644 --- a/altoslib/AltosNoSymbol.java +++ b/altoslib/AltosNoSymbol.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosNoSymbol extends Exception { public AltosNoSymbol(String name) { diff --git a/altoslib/AltosOrient.java b/altoslib/AltosOrient.java index 1c2e2aab..a2d501b2 100644 --- a/altoslib/AltosOrient.java +++ b/altoslib/AltosOrient.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosOrient extends AltosUnits { diff --git a/altoslib/AltosParse.java b/altoslib/AltosParse.java index 8f624b96..18ef807b 100644 --- a/altoslib/AltosParse.java +++ b/altoslib/AltosParse.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.*; import java.text.*; diff --git a/altoslib/AltosPointDouble.java b/altoslib/AltosPointDouble.java index ecfcbea7..a358ea66 100644 --- a/altoslib/AltosPointDouble.java +++ b/altoslib/AltosPointDouble.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosPointDouble { public double x, y; diff --git a/altoslib/AltosPointInt.java b/altoslib/AltosPointInt.java index e690aa43..5f9591cc 100644 --- a/altoslib/AltosPointInt.java +++ b/altoslib/AltosPointInt.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosPointInt { public int x, y; diff --git a/altoslib/AltosPreferences.java b/altoslib/AltosPreferences.java index a1e76834..91cfc6b6 100644 --- a/altoslib/AltosPreferences.java +++ b/altoslib/AltosPreferences.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosPreferencesBackend.java b/altoslib/AltosPreferencesBackend.java index 3154a519..f43c2ec9 100644 --- a/altoslib/AltosPreferencesBackend.java +++ b/altoslib/AltosPreferencesBackend.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.File; diff --git a/altoslib/AltosProgrammer.java b/altoslib/AltosProgrammer.java index 74ab42b5..7f9b277d 100644 --- a/altoslib/AltosProgrammer.java +++ b/altoslib/AltosProgrammer.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; diff --git a/altoslib/AltosPyro.java b/altoslib/AltosPyro.java index 9b7e79f3..851e35fb 100644 --- a/altoslib/AltosPyro.java +++ b/altoslib/AltosPyro.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.*; import java.text.*; diff --git a/altoslib/AltosQuaternion.java b/altoslib/AltosQuaternion.java index f78b5065..e96aa7db 100644 --- a/altoslib/AltosQuaternion.java +++ b/altoslib/AltosQuaternion.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosQuaternion { double r; /* real bit */ diff --git a/altoslib/AltosRectangle.java b/altoslib/AltosRectangle.java index 1b1cc9f4..6933198a 100644 --- a/altoslib/AltosRectangle.java +++ b/altoslib/AltosRectangle.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosRectangle { public int x, y, width, height; diff --git a/altoslib/AltosReplayReader.java b/altoslib/AltosReplayReader.java index 9419ec93..5dcb8702 100644 --- a/altoslib/AltosReplayReader.java +++ b/altoslib/AltosReplayReader.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; @@ -39,7 +39,7 @@ public class AltosReplayReader extends AltosFlightReader { public void update(AltosState state) throws InterruptedException { /* Make it run in realtime after the rocket leaves the pad */ - if (state.state > AltosLib.ao_flight_pad && state.time_change > 0) + if (state.state() > AltosLib.ao_flight_pad && state.time_change > 0) Thread.sleep((int) (Math.min(state.time_change,10) * 1000)); state.set_received_time(System.currentTimeMillis()); } diff --git a/altoslib/AltosRomconfig.java b/altoslib/AltosRomconfig.java index 28134aeb..9c6bb668 100644 --- a/altoslib/AltosRomconfig.java +++ b/altoslib/AltosRomconfig.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; diff --git a/altoslib/AltosRotation.java b/altoslib/AltosRotation.java index 9771c166..e3c4dd56 100644 --- a/altoslib/AltosRotation.java +++ b/altoslib/AltosRotation.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosRotation { private AltosQuaternion rotation; @@ -28,7 +28,7 @@ public class AltosRotation { } public void rotate(double dt, double x, double y, double z) { - AltosQuaternion rot = AltosQuaternion.half_euler(x * dt, y * dt, z * dt); + AltosQuaternion rot = AltosQuaternion.half_euler(x * dt / 2.0, y * dt / 2.0, z * dt / 2.0); rotation = rot.multiply(rotation).normalize(); } diff --git a/altoslib/AltosSavedState.java b/altoslib/AltosSavedState.java index e2ca9f73..a5a69c95 100644 --- a/altoslib/AltosSavedState.java +++ b/altoslib/AltosSavedState.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; diff --git a/altoslib/AltosSelfFlash.java b/altoslib/AltosSelfFlash.java index e2988b56..3aa727b3 100644 --- a/altoslib/AltosSelfFlash.java +++ b/altoslib/AltosSelfFlash.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; diff --git a/altoslib/AltosSensorEMini.java b/altoslib/AltosSensorEMini.java index e8b7b044..825cbd5d 100644 --- a/altoslib/AltosSensorEMini.java +++ b/altoslib/AltosSensorEMini.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMM.java b/altoslib/AltosSensorMM.java index 9be29ae0..c0a92a18 100644 --- a/altoslib/AltosSensorMM.java +++ b/altoslib/AltosSensorMM.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMega.java b/altoslib/AltosSensorMega.java index 1f71302e..f38d7b44 100644 --- a/altoslib/AltosSensorMega.java +++ b/altoslib/AltosSensorMega.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMetrum.java b/altoslib/AltosSensorMetrum.java index c00e00d5..fbc10fdd 100644 --- a/altoslib/AltosSensorMetrum.java +++ b/altoslib/AltosSensorMetrum.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTGPS.java b/altoslib/AltosSensorTGPS.java index 64cce640..a2d22e9a 100644 --- a/altoslib/AltosSensorTGPS.java +++ b/altoslib/AltosSensorTGPS.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTM.java b/altoslib/AltosSensorTM.java index 4957b94d..e0449568 100644 --- a/altoslib/AltosSensorTM.java +++ b/altoslib/AltosSensorTM.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTMini.java b/altoslib/AltosSensorTMini.java index 9b2db2ff..74ecacd6 100644 --- a/altoslib/AltosSensorTMini.java +++ b/altoslib/AltosSensorTMini.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSpeed.java b/altoslib/AltosSpeed.java index b9fca82b..45bd4c6a 100644 --- a/altoslib/AltosSpeed.java +++ b/altoslib/AltosSpeed.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosSpeed extends AltosUnits { diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index 4edae54a..523f5a70 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -19,7 +19,7 @@ * Track flight state from telemetry or eeprom data stream */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; @@ -284,7 +284,7 @@ public class AltosState implements Cloneable, Serializable { } } - public int state; + private int state; public int flight; public int serial; public int altitude_32; @@ -1056,6 +1056,10 @@ public class AltosState implements Cloneable, Serializable { } } + public int state() { + return state; + } + public void set_device_type(int device_type) { this.device_type = device_type; switch (device_type) { @@ -1358,11 +1362,6 @@ public class AltosState implements Cloneable, Serializable { } } - public void make_companion (int nchannels) { - if (companion == null) - companion = new AltosCompanion(nchannels); - } - public void set_companion(AltosCompanion companion) { this.companion = companion; } diff --git a/altoslib/AltosStateIterable.java b/altoslib/AltosStateIterable.java index 5533468b..13b8f4ca 100644 --- a/altoslib/AltosStateIterable.java +++ b/altoslib/AltosStateIterable.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosStateUpdate.java b/altoslib/AltosStateUpdate.java index ed2e1826..68212846 100644 --- a/altoslib/AltosStateUpdate.java +++ b/altoslib/AltosStateUpdate.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosStateUpdate { public void update_state(AltosState state) throws InterruptedException; diff --git a/altoslib/AltosTelemetry.java b/altoslib/AltosTelemetry.java index 4c973cd9..0ba9849a 100644 --- a/altoslib/AltosTelemetry.java +++ b/altoslib/AltosTelemetry.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.text.*; @@ -44,7 +44,7 @@ public abstract class AltosTelemetry implements AltosStateUpdate { public void update_state(AltosState state) { state.set_serial(serial); - if (state.state == AltosLib.ao_flight_invalid) + if (state.state() == AltosLib.ao_flight_invalid) state.set_state(AltosLib.ao_flight_startup); state.set_tick(tick); state.set_rssi(rssi, status); diff --git a/altoslib/AltosTelemetryCompanion.java b/altoslib/AltosTelemetryCompanion.java new file mode 100644 index 00000000..c47f9486 --- /dev/null +++ b/altoslib/AltosTelemetryCompanion.java @@ -0,0 +1,54 @@ +/* + * Copyright © 2015 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altoslib_9; + +public class AltosTelemetryCompanion extends AltosTelemetryStandard { + AltosCompanion companion; + + static final public int max_channels = 12; + + public AltosTelemetryCompanion(int[] bytes) { + super(bytes); + + int channels = uint8(7); + + if (channels > max_channels) + channels = max_channels; + + companion = new AltosCompanion(channels); + + companion.tick = tick; + companion.board_id = uint8(5); + companion.update_period = uint8(6); + + if (channels == 0) + companion.companion_data = null; + else { + companion.companion_data = new int[channels]; + + for (int i = 0; i < channels; i++) + companion.companion_data[i] = uint16(8 + i * 2); + } + } + + public void update_state(AltosState state) { + super.update_state(state); + + state.set_companion(companion); + } +} diff --git a/altoslib/AltosTelemetryConfiguration.java b/altoslib/AltosTelemetryConfiguration.java index c4cd36b2..20381a53 100644 --- a/altoslib/AltosTelemetryConfiguration.java +++ b/altoslib/AltosTelemetryConfiguration.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTelemetryConfiguration extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryFile.java b/altoslib/AltosTelemetryFile.java index d2275f54..a762f615 100644 --- a/altoslib/AltosTelemetryFile.java +++ b/altoslib/AltosTelemetryFile.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; @@ -75,7 +75,7 @@ public class AltosTelemetryFile extends AltosStateIterable { for (AltosTelemetry telem : telems) { telem.update_state(state); state.finish_update(); - if (state.state != AltosLib.ao_flight_invalid && state.state >= AltosLib.ao_flight_boost) { + if (state.state() != AltosLib.ao_flight_invalid && state.state() >= AltosLib.ao_flight_boost) { start.set_boost_tick(state.tick); break; } @@ -93,4 +93,4 @@ public class AltosTelemetryFile extends AltosStateIterable { } return new AltosTelemetryIterator(state, i); } -}
\ No newline at end of file +} diff --git a/altoslib/AltosTelemetryIterable.java b/altoslib/AltosTelemetryIterable.java index e18f7eda..b29881e8 100644 --- a/altoslib/AltosTelemetryIterable.java +++ b/altoslib/AltosTelemetryIterable.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.io.*; import java.util.*; diff --git a/altoslib/AltosTelemetryLegacy.java b/altoslib/AltosTelemetryLegacy.java index f8e72c86..b3071a4b 100644 --- a/altoslib/AltosTelemetryLegacy.java +++ b/altoslib/AltosTelemetryLegacy.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.text.*; diff --git a/altoslib/AltosTelemetryLocation.java b/altoslib/AltosTelemetryLocation.java index 9341d003..6fbed4bc 100644 --- a/altoslib/AltosTelemetryLocation.java +++ b/altoslib/AltosTelemetryLocation.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTelemetryLocation extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryMap.java b/altoslib/AltosTelemetryMap.java index d3242254..5aa0c41d 100644 --- a/altoslib/AltosTelemetryMap.java +++ b/altoslib/AltosTelemetryMap.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.text.*; import java.util.HashMap; diff --git a/altoslib/AltosTelemetryMegaData.java b/altoslib/AltosTelemetryMegaData.java index 2af8d931..49657051 100644 --- a/altoslib/AltosTelemetryMegaData.java +++ b/altoslib/AltosTelemetryMegaData.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTelemetryMegaData extends AltosTelemetryStandard { int state; diff --git a/altoslib/AltosTelemetryMegaSensor.java b/altoslib/AltosTelemetryMegaSensor.java index 77a76cd7..2f6256fc 100644 --- a/altoslib/AltosTelemetryMegaSensor.java +++ b/altoslib/AltosTelemetryMegaSensor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTelemetryMegaSensor extends AltosTelemetryStandard { int accel; diff --git a/altoslib/AltosTelemetryMetrumData.java b/altoslib/AltosTelemetryMetrumData.java index 17a3410a..4fbb9b86 100644 --- a/altoslib/AltosTelemetryMetrumData.java +++ b/altoslib/AltosTelemetryMetrumData.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTelemetryMetrumData extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryMetrumSensor.java b/altoslib/AltosTelemetryMetrumSensor.java index 71fbd544..3769c129 100644 --- a/altoslib/AltosTelemetryMetrumSensor.java +++ b/altoslib/AltosTelemetryMetrumSensor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryMini.java b/altoslib/AltosTelemetryMini.java index c9fda5b8..173fac42 100644 --- a/altoslib/AltosTelemetryMini.java +++ b/altoslib/AltosTelemetryMini.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTelemetryMini extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryRaw.java b/altoslib/AltosTelemetryRaw.java index 843ca4eb..7fa12f5e 100644 --- a/altoslib/AltosTelemetryRaw.java +++ b/altoslib/AltosTelemetryRaw.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTelemetryRaw extends AltosTelemetryStandard { public AltosTelemetryRaw(int[] bytes) { diff --git a/altoslib/AltosTelemetryReader.java b/altoslib/AltosTelemetryReader.java index cbbdceff..2d76f281 100644 --- a/altoslib/AltosTelemetryReader.java +++ b/altoslib/AltosTelemetryReader.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.text.*; import java.io.*; diff --git a/altoslib/AltosTelemetrySatellite.java b/altoslib/AltosTelemetrySatellite.java index 2f4e3354..a3a8abfa 100644 --- a/altoslib/AltosTelemetrySatellite.java +++ b/altoslib/AltosTelemetrySatellite.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTelemetrySatellite extends AltosTelemetryStandard { int channels; diff --git a/altoslib/AltosTelemetrySensor.java b/altoslib/AltosTelemetrySensor.java index 27cf22f0..578ac2da 100644 --- a/altoslib/AltosTelemetrySensor.java +++ b/altoslib/AltosTelemetrySensor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTelemetrySensor extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryStandard.java b/altoslib/AltosTelemetryStandard.java index 27561826..5a147b2b 100644 --- a/altoslib/AltosTelemetryStandard.java +++ b/altoslib/AltosTelemetryStandard.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public abstract class AltosTelemetryStandard extends AltosTelemetry { int[] bytes; @@ -68,11 +68,9 @@ public abstract class AltosTelemetryStandard extends AltosTelemetry { case packet_type_satellite: telem = new AltosTelemetrySatellite(bytes); break; -/* case packet_type_companion: telem = new AltosTelemetryCompanion(bytes); break; -*/ case packet_type_mega_sensor: telem = new AltosTelemetryMegaSensor(bytes); break; diff --git a/altoslib/AltosTemperature.java b/altoslib/AltosTemperature.java index b4d465a0..19e3393d 100644 --- a/altoslib/AltosTemperature.java +++ b/altoslib/AltosTemperature.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosTemperature extends AltosUnits { diff --git a/altoslib/AltosUnits.java b/altoslib/AltosUnits.java index 6b4fff0c..c211eb6d 100644 --- a/altoslib/AltosUnits.java +++ b/altoslib/AltosUnits.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import java.text.*; diff --git a/altoslib/AltosUnitsListener.java b/altoslib/AltosUnitsListener.java index 0e31492e..f71c4270 100644 --- a/altoslib/AltosUnitsListener.java +++ b/altoslib/AltosUnitsListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosUnitsListener { public void units_changed(boolean imperial_units); diff --git a/altoslib/AltosVersion.java.in b/altoslib/AltosVersion.java.in index 89ed400f..8c53ef0d 100644 --- a/altoslib/AltosVersion.java.in +++ b/altoslib/AltosVersion.java.in @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosVersion { public final static String version = "@VERSION@"; diff --git a/altoslib/AltosVoltage.java b/altoslib/AltosVoltage.java index fb6f41ee..34f4620e 100644 --- a/altoslib/AltosVoltage.java +++ b/altoslib/AltosVoltage.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public class AltosVoltage extends AltosUnits { diff --git a/altoslib/AltosWriter.java b/altoslib/AltosWriter.java index 1dcd3391..b5cc34f0 100644 --- a/altoslib/AltosWriter.java +++ b/altoslib/AltosWriter.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; public interface AltosWriter { diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am index a6b178fa..d1f8f265 100644 --- a/altoslib/Makefile.am +++ b/altoslib/Makefile.am @@ -96,6 +96,7 @@ altoslib_JAVA = \ AltosStateUpdate.java \ AltosTelemetry.java \ AltosTelemetryConfiguration.java \ + AltosTelemetryCompanion.java \ AltosTelemetryFile.java \ AltosTelemetryIterable.java \ AltosTelemetryLegacy.java \ diff --git a/altosui/Altos.java b/altosui/Altos.java index 4b3d17fe..aae2a793 100644 --- a/altosui/Altos.java +++ b/altosui/Altos.java @@ -20,8 +20,8 @@ package altosui; import java.awt.*; import libaltosJNI.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class Altos extends AltosUILib { diff --git a/altosui/AltosAscent.java b/altosui/AltosAscent.java index 453246bc..2fed6e7c 100644 --- a/altosui/AltosAscent.java +++ b/altosui/AltosAscent.java @@ -21,8 +21,8 @@ import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosAscent extends AltosUIFlightTab { JLabel cur, max; diff --git a/altosui/AltosCompanionInfo.java b/altosui/AltosCompanionInfo.java index 28f26a62..f5080f56 100644 --- a/altosui/AltosCompanionInfo.java +++ b/altosui/AltosCompanionInfo.java @@ -19,8 +19,8 @@ package altosui; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosCompanionInfo extends JTable implements AltosFlightDisplay { private AltosFlightInfoTableModel model; diff --git a/altosui/AltosConfig.java b/altosui/AltosConfig.java index 39ed5ca4..50be7f8e 100644 --- a/altosui/AltosConfig.java +++ b/altosui/AltosConfig.java @@ -22,8 +22,8 @@ import javax.swing.*; import java.io.*; import java.util.concurrent.*; import java.text.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosConfig implements ActionListener { diff --git a/altosui/AltosConfigPyroUI.java b/altosui/AltosConfigPyroUI.java index 50a25f00..4ad62405 100644 --- a/altosui/AltosConfigPyroUI.java +++ b/altosui/AltosConfigPyroUI.java @@ -22,8 +22,8 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosConfigPyroUI extends AltosUIDialog diff --git a/altosui/AltosConfigTD.java b/altosui/AltosConfigTD.java index 112ebbc6..3958a013 100644 --- a/altosui/AltosConfigTD.java +++ b/altosui/AltosConfigTD.java @@ -21,8 +21,8 @@ import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosConfigTD implements ActionListener { diff --git a/altosui/AltosConfigTDUI.java b/altosui/AltosConfigTDUI.java index 857ab64d..94416465 100644 --- a/altosui/AltosConfigTDUI.java +++ b/altosui/AltosConfigTDUI.java @@ -21,8 +21,8 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosConfigTDUI extends AltosUIDialog diff --git a/altosui/AltosConfigUI.java b/altosui/AltosConfigUI.java index 76837b31..a4216212 100644 --- a/altosui/AltosConfigUI.java +++ b/altosui/AltosConfigUI.java @@ -22,8 +22,8 @@ import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.text.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosConfigUI extends AltosUIDialog diff --git a/altosui/AltosConfigureUI.java b/altosui/AltosConfigureUI.java index fa815762..3d8bb754 100644 --- a/altosui/AltosConfigureUI.java +++ b/altosui/AltosConfigureUI.java @@ -22,7 +22,7 @@ import java.awt.event.*; import java.beans.*; import javax.swing.*; import javax.swing.event.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*; public class AltosConfigureUI extends AltosUIConfigure diff --git a/altosui/AltosDescent.java b/altosui/AltosDescent.java index f5b92816..9257f069 100644 --- a/altosui/AltosDescent.java +++ b/altosui/AltosDescent.java @@ -21,8 +21,8 @@ import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosDescent extends AltosUIFlightTab { diff --git a/altosui/AltosFlightStatus.java b/altosui/AltosFlightStatus.java index 815a6fa4..cffed41d 100644 --- a/altosui/AltosFlightStatus.java +++ b/altosui/AltosFlightStatus.java @@ -19,8 +19,8 @@ package altosui; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosFlightStatus extends JComponent implements AltosFlightDisplay { GridBagLayout layout; @@ -173,14 +173,14 @@ public class AltosFlightStatus extends JComponent implements AltosFlightDisplay int last_state = -1; void show(AltosState state, AltosListenerState listener_state) { - if (state.state != last_state) { - if (state.state == AltosLib.ao_flight_stateless) + if (state.state() != last_state) { + if (state.state() == AltosLib.ao_flight_stateless) hide(); else { show(); value.setText(state.state_name()); } - last_state = state.state; + last_state = state.state(); } } diff --git a/altosui/AltosFlightStatusTableModel.java b/altosui/AltosFlightStatusTableModel.java index b5587a84..f8a643fe 100644 --- a/altosui/AltosFlightStatusTableModel.java +++ b/altosui/AltosFlightStatusTableModel.java @@ -27,7 +27,7 @@ import java.util.*; import java.text.*; import java.util.prefs.*; import java.util.concurrent.LinkedBlockingQueue; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosFlightStatusTableModel extends AbstractTableModel { private String[] columnNames = { diff --git a/altosui/AltosFlightStatusUpdate.java b/altosui/AltosFlightStatusUpdate.java index 9768c6d1..9fa813d2 100644 --- a/altosui/AltosFlightStatusUpdate.java +++ b/altosui/AltosFlightStatusUpdate.java @@ -18,7 +18,7 @@ package altosui; import java.awt.event.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosFlightStatusUpdate implements ActionListener { diff --git a/altosui/AltosFlightUI.java b/altosui/AltosFlightUI.java index db33e0d9..d7646a77 100644 --- a/altosui/AltosFlightUI.java +++ b/altosui/AltosFlightUI.java @@ -22,8 +22,8 @@ import java.awt.event.*; import javax.swing.*; import java.util.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay { AltosVoice voice; @@ -53,13 +53,13 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay { JComponent cur_tab = null; JComponent which_tab(AltosState state) { - if (state.state < Altos.ao_flight_boost) + if (state.state() < Altos.ao_flight_boost) return pad; - if (state.state <= Altos.ao_flight_coast) + if (state.state() <= Altos.ao_flight_coast) return ascent; - if (state.state <= Altos.ao_flight_main) + if (state.state() <= Altos.ao_flight_main) return descent; - if (state.state == AltosLib.ao_flight_stateless) + if (state.state() == AltosLib.ao_flight_stateless) return descent; return landed; } @@ -102,7 +102,7 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay { if (state == null) state = new AltosState(); - if (state.state != Altos.ao_flight_startup) { + if (state.state() != Altos.ao_flight_startup) { if (!has_state) { pane.setTitleAt(0, "Launch Pad"); pane.add(ascent, 1); diff --git a/altosui/AltosGraphUI.java b/altosui/AltosGraphUI.java index 6e45a092..8e12f229 100644 --- a/altosui/AltosGraphUI.java +++ b/altosui/AltosGraphUI.java @@ -23,8 +23,8 @@ import java.util.ArrayList; import java.awt.*; import java.awt.event.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; diff --git a/altosui/AltosIdleMonitorUI.java b/altosui/AltosIdleMonitorUI.java index d54b05c5..565ab1b1 100644 --- a/altosui/AltosIdleMonitorUI.java +++ b/altosui/AltosIdleMonitorUI.java @@ -24,8 +24,8 @@ import javax.swing.event.*; import java.io.*; import java.util.concurrent.*; import java.util.Arrays; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDisplay, AltosIdleMonitorListener, DocumentListener { AltosDevice device; diff --git a/altosui/AltosIgniteUI.java b/altosui/AltosIgniteUI.java index 14a2b606..01d58b5e 100644 --- a/altosui/AltosIgniteUI.java +++ b/altosui/AltosIgniteUI.java @@ -24,8 +24,8 @@ import java.io.*; import java.text.*; import java.util.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosIgniteUI extends AltosUIDialog diff --git a/altosui/AltosIgnitor.java b/altosui/AltosIgnitor.java index 682afc5e..e0f9e921 100644 --- a/altosui/AltosIgnitor.java +++ b/altosui/AltosIgnitor.java @@ -20,8 +20,8 @@ package altosui; import java.awt.*; import java.awt.event.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosIgnitor extends AltosUIFlightTab { diff --git a/altosui/AltosLanded.java b/altosui/AltosLanded.java index c2997b29..423e0e23 100644 --- a/altosui/AltosLanded.java +++ b/altosui/AltosLanded.java @@ -21,8 +21,8 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosLanded extends AltosUIFlightTab implements ActionListener { diff --git a/altosui/AltosLaunch.java b/altosui/AltosLaunch.java index 6dc1ca02..da0dfd92 100644 --- a/altosui/AltosLaunch.java +++ b/altosui/AltosLaunch.java @@ -20,7 +20,7 @@ package altosui; import java.io.*; import java.util.concurrent.*; import java.awt.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*; public class AltosLaunch { AltosDevice device; diff --git a/altosui/AltosLaunchUI.java b/altosui/AltosLaunchUI.java index 132001bf..e6bc7929 100644 --- a/altosui/AltosLaunchUI.java +++ b/altosui/AltosLaunchUI.java @@ -23,7 +23,7 @@ import javax.swing.*; import java.io.*; import java.text.*; import java.util.concurrent.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*; class FireButton extends JButton { protected void processMouseEvent(MouseEvent e) { diff --git a/altosui/AltosPad.java b/altosui/AltosPad.java index 2f87b681..f984e908 100644 --- a/altosui/AltosPad.java +++ b/altosui/AltosPad.java @@ -18,8 +18,8 @@ package altosui; import java.util.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosPad extends AltosUIFlightTab { @@ -49,10 +49,10 @@ public class AltosPad extends AltosUIFlightTab { hide(); } else { if (state.flight != 0) { - if (state.state <= Altos.ao_flight_pad) + if (state.state() <= Altos.ao_flight_pad) show("Ready to record"); - else if (state.state < Altos.ao_flight_landed || - state.state == AltosLib.ao_flight_stateless) + else if (state.state() < Altos.ao_flight_landed || + state.state() == AltosLib.ao_flight_stateless) show("Recording data"); else show("Recorded data"); @@ -121,8 +121,8 @@ public class AltosPad extends AltosUIFlightTab { } boolean report_pad(AltosState state) { - if ((state.state == AltosLib.ao_flight_stateless || - state.state < AltosLib.ao_flight_pad) && + if ((state.state() == AltosLib.ao_flight_stateless || + state.state() < AltosLib.ao_flight_pad) && state.gps != null && state.gps.lat != AltosLib.MISSING) { diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java index f6caa4ef..de6aa34c 100644 --- a/altosui/AltosUI.java +++ b/altosui/AltosUI.java @@ -22,8 +22,8 @@ import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class AltosUI extends AltosUIFrame { public AltosVoice voice = new AltosVoice(); @@ -539,7 +539,7 @@ public class AltosUI extends AltosUIFrame { System.out.printf ("process cat\n"); for (AltosState state : eef) { System.out.printf ("tick %d state %d height %g\n", - state.tick, state.state, state.height()); + state.tick, state.state(), state.height()); if ((state.set & AltosState.set_gps) != 0) System.out.printf ("time %g lat %g lon %g alt %g\n", state.time_since_boost(), diff --git a/altosui/Makefile.am b/altosui/Makefile.am index e6de1d97..dce8420e 100644 --- a/altosui/Makefile.am +++ b/altosui/Makefile.am @@ -149,7 +149,7 @@ TEMPLATE_DOC=\ $(top_srcdir)/doc/telemetrum-outline.pdf \ $(top_srcdir)/doc/easymini-outline.pdf \ $(top_srcdir)/doc/telemega-outline.pdf \ - $(top_srcdir)/doc/telemini.pdf + $(top_srcdir)/doc/telemini-outline.pdf DOC=$(ALTUSMETRUM_DOC) $(ALTOS_DOC) $(TELEMETRY_DOC) $(TEMPLATE_DOC) diff --git a/altosui/altos-windows.nsi.in b/altosui/altos-windows.nsi.in index 2f22a4a3..c88b9e34 100644 --- a/altosui/altos-windows.nsi.in +++ b/altosui/altos-windows.nsi.in @@ -145,7 +145,7 @@ Section "Documentation" File "../doc/telemetrum-outline.pdf" File "../doc/telemega-outline.pdf" File "../doc/easymini-outline.pdf" - File "../doc/telemini.pdf" + File "../doc/telemini-outline.pdf" SectionEnd Section "File Associations" diff --git a/altosuilib/AltosBTDevice.java b/altosuilib/AltosBTDevice.java index 0d7d07c0..01421071 100644 --- a/altosuilib/AltosBTDevice.java +++ b/altosuilib/AltosBTDevice.java @@ -15,10 +15,10 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import libaltosJNI.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosBTDevice extends altos_bt_device implements AltosDevice { diff --git a/altosuilib/AltosBTDeviceIterator.java b/altosuilib/AltosBTDeviceIterator.java index ca6c436e..b8c4c6cf 100644 --- a/altosuilib/AltosBTDeviceIterator.java +++ b/altosuilib/AltosBTDeviceIterator.java @@ -15,11 +15,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.util.*; import libaltosJNI.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosBTDeviceIterator implements Iterator<AltosBTDevice> { AltosBTDevice current; diff --git a/altosuilib/AltosBTKnown.java b/altosuilib/AltosBTKnown.java index 0d10fafd..e444d310 100644 --- a/altosuilib/AltosBTKnown.java +++ b/altosuilib/AltosBTKnown.java @@ -15,10 +15,10 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.util.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosBTKnown implements Iterable<AltosBTDevice> { LinkedList<AltosBTDevice> devices = new LinkedList<AltosBTDevice>(); diff --git a/altosuilib/AltosBTManage.java b/altosuilib/AltosBTManage.java index 8a912c94..65744141 100644 --- a/altosuilib/AltosBTManage.java +++ b/altosuilib/AltosBTManage.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; @@ -23,7 +23,7 @@ import javax.swing.*; import javax.swing.plaf.basic.*; import java.util.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosBTManage extends AltosUIDialog implements ActionListener, Iterable<AltosBTDevice> { LinkedBlockingQueue<AltosBTDevice> found_devices; diff --git a/altosuilib/AltosCSVUI.java b/altosuilib/AltosCSVUI.java index 281a9081..d5796cb1 100644 --- a/altosuilib/AltosCSVUI.java +++ b/altosuilib/AltosCSVUI.java @@ -15,13 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosCSVUI extends AltosUIDialog diff --git a/altosuilib/AltosConfigFreqUI.java b/altosuilib/AltosConfigFreqUI.java index 04d93f6e..ccfdc1a3 100644 --- a/altosuilib/AltosConfigFreqUI.java +++ b/altosuilib/AltosConfigFreqUI.java @@ -15,14 +15,14 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.text.*; import java.awt.event.*; import javax.swing.*; import java.util.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; class AltosEditFreqUI extends AltosUIDialog implements ActionListener { Frame frame; diff --git a/altosuilib/AltosDataChooser.java b/altosuilib/AltosDataChooser.java index d30aec3f..f7bc516b 100644 --- a/altosuilib/AltosDataChooser.java +++ b/altosuilib/AltosDataChooser.java @@ -15,12 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.io.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosDataChooser extends JFileChooser { JFrame frame; diff --git a/altosuilib/AltosDevice.java b/altosuilib/AltosDevice.java index 64a99596..f78fc2d0 100644 --- a/altosuilib/AltosDevice.java +++ b/altosuilib/AltosDevice.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import libaltosJNI.*; diff --git a/altosuilib/AltosDeviceDialog.java b/altosuilib/AltosDeviceDialog.java index a3c5d283..52083b60 100644 --- a/altosuilib/AltosDeviceDialog.java +++ b/altosuilib/AltosDeviceDialog.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import javax.swing.*; import java.awt.*; diff --git a/altosuilib/AltosDeviceUIDialog.java b/altosuilib/AltosDeviceUIDialog.java index aa6d323f..908e74e7 100644 --- a/altosuilib/AltosDeviceUIDialog.java +++ b/altosuilib/AltosDeviceUIDialog.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import javax.swing.*; import java.awt.*; diff --git a/altosuilib/AltosDisplayThread.java b/altosuilib/AltosDisplayThread.java index 73d85698..9aa31aa1 100644 --- a/altosuilib/AltosDisplayThread.java +++ b/altosuilib/AltosDisplayThread.java @@ -15,13 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import javax.swing.*; import java.io.*; import java.text.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosDisplayThread extends Thread { @@ -78,7 +78,7 @@ public class AltosDisplayThread extends Thread { return; /* reset the landing count once we hear about a new flight */ - if (state.state < AltosLib.ao_flight_drogue) + if (state.state() < AltosLib.ao_flight_drogue) reported_landing = 0; /* Shut up once the rocket is on the ground */ @@ -87,8 +87,8 @@ public class AltosDisplayThread extends Thread { } /* If the rocket isn't on the pad, then report height */ - if (AltosLib.ao_flight_drogue <= state.state && - state.state < AltosLib.ao_flight_landed && + if (AltosLib.ao_flight_drogue <= state.state() && + state.state() < AltosLib.ao_flight_landed && state.from_pad != null && state.range >= 0) { @@ -99,7 +99,7 @@ public class AltosDisplayThread extends Thread { (int) (state.from_pad.bearing + 0.5), (int) (state.elevation + 0.5), AltosConvert.distance.say(state.range)); - } else if (state.state > AltosLib.ao_flight_pad && state.height() != AltosLib.MISSING) { + } else if (state.state() > AltosLib.ao_flight_pad && state.height() != AltosLib.MISSING) { voice.speak(AltosConvert.height.say_units(state.height())); } else { reported_landing = 0; @@ -109,11 +109,11 @@ public class AltosDisplayThread extends Thread { * either we've got a landed report or we haven't heard from it in * a long time */ - if (state.state != AltosLib.ao_flight_stateless && - state.state >= AltosLib.ao_flight_drogue && + if (state.state() != AltosLib.ao_flight_stateless && + state.state() >= AltosLib.ao_flight_drogue && (last || System.currentTimeMillis() - state.received_time >= 15000 || - state.state == AltosLib.ao_flight_landed)) + state.state() == AltosLib.ao_flight_landed)) { if (Math.abs(state.speed()) < 20 && state.height() < 100) voice.speak("rocket landed safely"); @@ -124,10 +124,6 @@ public class AltosDisplayThread extends Thread { (int) (state.from_pad.bearing + 0.5), AltosConvert.distance.say_units(state.from_pad.distance)); ++reported_landing; - if (state.state != AltosLib.ao_flight_landed) { - state.state = AltosLib.ao_flight_landed; - show_safely(); - } } } @@ -167,7 +163,7 @@ public class AltosDisplayThread extends Thread { } public synchronized void notice(boolean spoken) { - if (old_state != null && old_state.state != state.state) { + if (old_state != null && old_state.state() != state.state()) { report_time = now(); this.notify(); } else if (spoken) @@ -182,17 +178,17 @@ public class AltosDisplayThread extends Thread { synchronized boolean tell() { boolean ret = false; - if (old_state == null || old_state.state != state.state) { - if (state.state != AltosLib.ao_flight_stateless) + if (old_state == null || old_state.state() != state.state()) { + if (state.state() != AltosLib.ao_flight_stateless) voice.speak(state.state_name()); - if ((old_state == null || old_state.state <= AltosLib.ao_flight_boost) && - state.state > AltosLib.ao_flight_boost) { + if ((old_state == null || old_state.state() <= AltosLib.ao_flight_boost) && + state.state() > AltosLib.ao_flight_boost) { if (state.max_speed() != AltosLib.MISSING) voice.speak("max speed: %s.", AltosConvert.speed.say_units(state.max_speed() + 0.5)); ret = true; - } else if ((old_state == null || old_state.state < AltosLib.ao_flight_drogue) && - state.state >= AltosLib.ao_flight_drogue) { + } else if ((old_state == null || old_state.state() < AltosLib.ao_flight_drogue) && + state.state() >= AltosLib.ao_flight_drogue) { if (state.max_height() != AltosLib.MISSING) voice.speak("max height: %s.", AltosConvert.height.say_units(state.max_height() + 0.5)); @@ -223,12 +219,14 @@ public class AltosDisplayThread extends Thread { try { for (;;) { try { - state = reader.read(); - if (state == null) { + AltosState new_state = reader.read(); + if (new_state == null) { + state = null; listener_state.running = false; break; } - reader.update(state); + reader.update(new_state); + state = new_state; show_safely(); told = tell(); idle_thread.notice(told); diff --git a/altosuilib/AltosEepromDelete.java b/altosuilib/AltosEepromDelete.java index 7648382d..270b0494 100644 --- a/altosuilib/AltosEepromDelete.java +++ b/altosuilib/AltosEepromDelete.java @@ -15,13 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosEepromDelete implements Runnable { AltosEepromList flights; diff --git a/altosuilib/AltosEepromManage.java b/altosuilib/AltosEepromManage.java index d97edd12..14cfb127 100644 --- a/altosuilib/AltosEepromManage.java +++ b/altosuilib/AltosEepromManage.java @@ -15,13 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosEepromManage implements ActionListener { diff --git a/altosuilib/AltosEepromMonitor.java b/altosuilib/AltosEepromMonitor.java index 28fa734d..41d447bc 100644 --- a/altosuilib/AltosEepromMonitor.java +++ b/altosuilib/AltosEepromMonitor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; diff --git a/altosuilib/AltosEepromMonitorUI.java b/altosuilib/AltosEepromMonitorUI.java index 5f0df7d3..0c8083cd 100644 --- a/altosuilib/AltosEepromMonitorUI.java +++ b/altosuilib/AltosEepromMonitorUI.java @@ -15,12 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMonitor { JFrame owner; diff --git a/altosuilib/AltosEepromSelect.java b/altosuilib/AltosEepromSelect.java index 56b10ef0..e5c45ca1 100644 --- a/altosuilib/AltosEepromSelect.java +++ b/altosuilib/AltosEepromSelect.java @@ -15,13 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; class AltosEepromItem implements ActionListener { AltosEepromLog log; diff --git a/altosuilib/AltosFlashUI.java b/altosuilib/AltosFlashUI.java index 0ab085cf..33d432c8 100644 --- a/altosuilib/AltosFlashUI.java +++ b/altosuilib/AltosFlashUI.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; @@ -23,7 +23,7 @@ import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.io.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosFlashUI extends AltosUIDialog diff --git a/altosuilib/AltosFlightInfoTableModel.java b/altosuilib/AltosFlightInfoTableModel.java index e55004e4..912fc716 100644 --- a/altosuilib/AltosFlightInfoTableModel.java +++ b/altosuilib/AltosFlightInfoTableModel.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import javax.swing.table.*; diff --git a/altosuilib/AltosFlightStatsTable.java b/altosuilib/AltosFlightStatsTable.java index 9c613365..c7461432 100644 --- a/altosuilib/AltosFlightStatsTable.java +++ b/altosuilib/AltosFlightStatsTable.java @@ -15,12 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import javax.swing.*; import java.util.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosFlightStatsTable extends JComponent implements AltosFontListener { GridBagLayout layout; diff --git a/altosuilib/AltosGraph.java b/altosuilib/AltosGraph.java index be013d57..ceb730f9 100644 --- a/altosuilib/AltosGraph.java +++ b/altosuilib/AltosGraph.java @@ -15,14 +15,14 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.io.*; import java.util.ArrayList; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import org.jfree.ui.*; import org.jfree.chart.*; diff --git a/altosuilib/AltosGraphDataPoint.java b/altosuilib/AltosGraphDataPoint.java index 30d436ae..6a38f446 100644 --- a/altosuilib/AltosGraphDataPoint.java +++ b/altosuilib/AltosGraphDataPoint.java @@ -15,9 +15,9 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosGraphDataPoint implements AltosUIDataPoint { @@ -217,7 +217,7 @@ public class AltosGraphDataPoint implements AltosUIDataPoint { public int id(int index) { if (index == data_state) { - int s = state.state; + int s = state.state(); if (AltosLib.ao_flight_boost <= s && s <= AltosLib.ao_flight_landed) return s; } else if (data_ignitor_fired_0 <= index && index <= data_ignitor_fired_max) { diff --git a/altosuilib/AltosGraphDataSet.java b/altosuilib/AltosGraphDataSet.java index 7902f407..d7d07c83 100644 --- a/altosuilib/AltosGraphDataSet.java +++ b/altosuilib/AltosGraphDataSet.java @@ -15,12 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.lang.*; import java.io.*; import java.util.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; class AltosGraphIterator implements Iterator<AltosUIDataPoint> { AltosGraphDataSet dataSet; diff --git a/altosuilib/AltosInfoTable.java b/altosuilib/AltosInfoTable.java index d87c38e2..8e6558b1 100644 --- a/altosuilib/AltosInfoTable.java +++ b/altosuilib/AltosInfoTable.java @@ -15,13 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosInfoTable extends JTable implements AltosFlightDisplay, HierarchyListener { private AltosFlightInfoTableModel model; diff --git a/altosuilib/AltosLed.java b/altosuilib/AltosLed.java index b47aa493..fbe6b4ed 100644 --- a/altosuilib/AltosLed.java +++ b/altosuilib/AltosLed.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import javax.swing.*; diff --git a/altosuilib/AltosLights.java b/altosuilib/AltosLights.java index 8cbd1d10..6ab50549 100644 --- a/altosuilib/AltosLights.java +++ b/altosuilib/AltosLights.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import javax.swing.*; diff --git a/altosuilib/AltosPositionListener.java b/altosuilib/AltosPositionListener.java index 0c900787..0c4fb373 100644 --- a/altosuilib/AltosPositionListener.java +++ b/altosuilib/AltosPositionListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; public interface AltosPositionListener { public void position_changed(int position); diff --git a/altosuilib/AltosRomconfigUI.java b/altosuilib/AltosRomconfigUI.java index 257674dc..275070ee 100644 --- a/altosuilib/AltosRomconfigUI.java +++ b/altosuilib/AltosRomconfigUI.java @@ -15,12 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosRomconfigUI extends AltosUIDialog diff --git a/altosuilib/AltosScanUI.java b/altosuilib/AltosScanUI.java index e2efd4b3..bc647e8f 100644 --- a/altosuilib/AltosScanUI.java +++ b/altosuilib/AltosScanUI.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; @@ -25,7 +25,7 @@ import java.io.*; import java.util.*; import java.text.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; class AltosScanResult { String callsign; diff --git a/altosuilib/AltosSerial.java b/altosuilib/AltosSerial.java index ff8d900a..a91740c5 100644 --- a/altosuilib/AltosSerial.java +++ b/altosuilib/AltosSerial.java @@ -19,13 +19,13 @@ * Deal with TeleDongle on a serial port */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.io.*; import java.util.*; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import libaltosJNI.*; /* diff --git a/altosuilib/AltosSerialInUseException.java b/altosuilib/AltosSerialInUseException.java index 2b198aec..d1083098 100644 --- a/altosuilib/AltosSerialInUseException.java +++ b/altosuilib/AltosSerialInUseException.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; public class AltosSerialInUseException extends Exception { public AltosDevice device; diff --git a/altosuilib/AltosUIAxis.java b/altosuilib/AltosUIAxis.java index 155e7ed6..b4024a17 100644 --- a/altosuilib/AltosUIAxis.java +++ b/altosuilib/AltosUIAxis.java @@ -15,14 +15,14 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.io.*; import java.util.ArrayList; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import org.jfree.ui.*; import org.jfree.chart.*; diff --git a/altosuilib/AltosUIConfigure.java b/altosuilib/AltosUIConfigure.java index 146acda8..03967d19 100644 --- a/altosuilib/AltosUIConfigure.java +++ b/altosuilib/AltosUIConfigure.java @@ -15,14 +15,14 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; import java.beans.*; import javax.swing.*; import javax.swing.event.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; class DelegatingRenderer implements ListCellRenderer<Object> { diff --git a/altosuilib/AltosUIDataMissing.java b/altosuilib/AltosUIDataMissing.java index 39b8f900..1a7e12bf 100644 --- a/altosuilib/AltosUIDataMissing.java +++ b/altosuilib/AltosUIDataMissing.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; public class AltosUIDataMissing extends Exception { public int id; diff --git a/altosuilib/AltosUIDataPoint.java b/altosuilib/AltosUIDataPoint.java index 793fabfb..cf320265 100644 --- a/altosuilib/AltosUIDataPoint.java +++ b/altosuilib/AltosUIDataPoint.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; public interface AltosUIDataPoint { public abstract double x() throws AltosUIDataMissing; diff --git a/altosuilib/AltosUIDataSet.java b/altosuilib/AltosUIDataSet.java index b7472000..29648dbf 100644 --- a/altosuilib/AltosUIDataSet.java +++ b/altosuilib/AltosUIDataSet.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; public interface AltosUIDataSet { public abstract String name(); diff --git a/altosuilib/AltosUIDialog.java b/altosuilib/AltosUIDialog.java index cfbf2cd3..2d0bc3c9 100644 --- a/altosuilib/AltosUIDialog.java +++ b/altosuilib/AltosUIDialog.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; diff --git a/altosuilib/AltosUIEnable.java b/altosuilib/AltosUIEnable.java index b4d8d81e..42a09acf 100644 --- a/altosuilib/AltosUIEnable.java +++ b/altosuilib/AltosUIEnable.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; @@ -23,7 +23,7 @@ import javax.swing.*; import java.io.*; import java.util.concurrent.*; import java.util.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import org.jfree.ui.*; import org.jfree.chart.*; diff --git a/altosuilib/AltosUIFlightTab.java b/altosuilib/AltosUIFlightTab.java index a2a3e367..0db1e5da 100644 --- a/altosuilib/AltosUIFlightTab.java +++ b/altosuilib/AltosUIFlightTab.java @@ -15,13 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public abstract class AltosUIFlightTab extends JComponent implements AltosFlightDisplay, HierarchyListener { public GridBagLayout layout; diff --git a/altosuilib/AltosUIFrame.java b/altosuilib/AltosUIFrame.java index 79015103..b82f07f7 100644 --- a/altosuilib/AltosUIFrame.java +++ b/altosuilib/AltosUIFrame.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; diff --git a/altosuilib/AltosUIFreqList.java b/altosuilib/AltosUIFreqList.java index 9479087e..e0e2ede7 100644 --- a/altosuilib/AltosUIFreqList.java +++ b/altosuilib/AltosUIFreqList.java @@ -15,10 +15,10 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosUIFreqList extends JComboBox<AltosFrequency> { diff --git a/altosuilib/AltosUIGraph.java b/altosuilib/AltosUIGraph.java index a11978d0..9a669e32 100644 --- a/altosuilib/AltosUIGraph.java +++ b/altosuilib/AltosUIGraph.java @@ -15,14 +15,14 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.io.*; import java.util.ArrayList; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import org.jfree.ui.*; import org.jfree.chart.*; diff --git a/altosuilib/AltosUIGrapher.java b/altosuilib/AltosUIGrapher.java index 0fe685ef..0df5c1a7 100644 --- a/altosuilib/AltosUIGrapher.java +++ b/altosuilib/AltosUIGrapher.java @@ -15,14 +15,14 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.io.*; import java.util.ArrayList; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import org.jfree.ui.*; import org.jfree.chart.*; diff --git a/altosuilib/AltosUIImage.java b/altosuilib/AltosUIImage.java index 77743741..8c09b2e7 100644 --- a/altosuilib/AltosUIImage.java +++ b/altosuilib/AltosUIImage.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_8; +package org.altusmetrum.altoslib_9; import javax.swing.*; import javax.imageio.ImageIO; diff --git a/altosuilib/AltosUIIndicator.java b/altosuilib/AltosUIIndicator.java index 0a940d97..9bac992b 100644 --- a/altosuilib/AltosUIIndicator.java +++ b/altosuilib/AltosUIIndicator.java @@ -15,11 +15,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public abstract class AltosUIIndicator implements AltosFontListener, AltosUnitsListener { JLabel label; diff --git a/altosuilib/AltosUILib.java b/altosuilib/AltosUILib.java index 2fc20317..1f1ad23b 100644 --- a/altosuilib/AltosUILib.java +++ b/altosuilib/AltosUILib.java @@ -15,12 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import libaltosJNI.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosUILib extends AltosLib { diff --git a/altosuilib/AltosUIListener.java b/altosuilib/AltosUIListener.java index 5b49e7da..8f758300 100644 --- a/altosuilib/AltosUIListener.java +++ b/altosuilib/AltosUIListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; public interface AltosUIListener { public void ui_changed(String look_and_feel); diff --git a/altosuilib/AltosUIMapNew.java b/altosuilib/AltosUIMapNew.java index 016a202b..8de6bea2 100644 --- a/altosuilib/AltosUIMapNew.java +++ b/altosuilib/AltosUIMapNew.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; @@ -27,7 +27,7 @@ import java.awt.geom.*; import java.util.*; import java.util.concurrent.*; import javax.imageio.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosUIMapNew extends JComponent implements AltosFlightDisplay, AltosMapInterface { diff --git a/altosuilib/AltosUIMapPreloadNew.java b/altosuilib/AltosUIMapPreloadNew.java index 2d4d45b2..c1c3f8bb 100644 --- a/altosuilib/AltosUIMapPreloadNew.java +++ b/altosuilib/AltosUIMapPreloadNew.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; @@ -26,7 +26,7 @@ import java.text.*; import java.lang.Math; import java.net.URL; import java.net.URLConnection; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; class AltosUIMapPos extends Box { AltosUIFrame owner; diff --git a/altosuilib/AltosUIMarker.java b/altosuilib/AltosUIMarker.java index ec5aae78..7c5a91b0 100644 --- a/altosuilib/AltosUIMarker.java +++ b/altosuilib/AltosUIMarker.java @@ -15,14 +15,14 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.io.*; import java.util.ArrayList; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import org.jfree.ui.*; import org.jfree.chart.*; diff --git a/altosuilib/AltosUIPreferences.java b/altosuilib/AltosUIPreferences.java index 5602dc17..83099fa5 100644 --- a/altosuilib/AltosUIPreferences.java +++ b/altosuilib/AltosUIPreferences.java @@ -15,13 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.io.*; import java.util.*; import java.awt.Component; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosUIPreferences extends AltosPreferences { diff --git a/altosuilib/AltosUIPreferencesBackend.java b/altosuilib/AltosUIPreferencesBackend.java index ebdc8b77..6d7aa88b 100644 --- a/altosuilib/AltosUIPreferencesBackend.java +++ b/altosuilib/AltosUIPreferencesBackend.java @@ -15,11 +15,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.io.File; import java.util.prefs.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import javax.swing.filechooser.FileSystemView; public class AltosUIPreferencesBackend implements AltosPreferencesBackend { diff --git a/altosuilib/AltosUIRateList.java b/altosuilib/AltosUIRateList.java index a8898808..8407f31d 100644 --- a/altosuilib/AltosUIRateList.java +++ b/altosuilib/AltosUIRateList.java @@ -15,10 +15,10 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosUIRateList extends JComboBox<String> { diff --git a/altosuilib/AltosUISeries.java b/altosuilib/AltosUISeries.java index d4421ac7..e2d19e47 100644 --- a/altosuilib/AltosUISeries.java +++ b/altosuilib/AltosUISeries.java @@ -15,14 +15,14 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.io.*; import java.util.ArrayList; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; import org.jfree.ui.*; import org.jfree.chart.*; diff --git a/altosuilib/AltosUITelemetryList.java b/altosuilib/AltosUITelemetryList.java index edbc7fd6..fbbd7c06 100644 --- a/altosuilib/AltosUITelemetryList.java +++ b/altosuilib/AltosUITelemetryList.java @@ -15,11 +15,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.util.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class AltosUITelemetryList extends JComboBox<String> { diff --git a/altosuilib/AltosUIUnitsIndicator.java b/altosuilib/AltosUIUnitsIndicator.java index b58cd1cc..61e04b34 100644 --- a/altosuilib/AltosUIUnitsIndicator.java +++ b/altosuilib/AltosUIUnitsIndicator.java @@ -15,11 +15,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public abstract class AltosUIUnitsIndicator extends AltosUIIndicator { diff --git a/altosuilib/AltosUIVoltageIndicator.java b/altosuilib/AltosUIVoltageIndicator.java index 12649730..779098ce 100644 --- a/altosuilib/AltosUIVoltageIndicator.java +++ b/altosuilib/AltosUIVoltageIndicator.java @@ -15,11 +15,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public abstract class AltosUIVoltageIndicator extends AltosUIUnitsIndicator { diff --git a/altosuilib/AltosUSBDevice.java b/altosuilib/AltosUSBDevice.java index 74306523..6da50deb 100644 --- a/altosuilib/AltosUSBDevice.java +++ b/altosuilib/AltosUSBDevice.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.util.*; import libaltosJNI.*; diff --git a/altosuilib/AltosVoice.java b/altosuilib/AltosVoice.java index 71a05a23..e68c6d8b 100644 --- a/altosuilib/AltosVoice.java +++ b/altosuilib/AltosVoice.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import com.sun.speech.freetts.Voice; import com.sun.speech.freetts.VoiceManager; diff --git a/altosuilib/GrabNDrag.java b/altosuilib/GrabNDrag.java index 919289c7..d9f0c7fd 100644 --- a/altosuilib/GrabNDrag.java +++ b/altosuilib/GrabNDrag.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.awt.*; import java.awt.event.*; diff --git a/altosuilib/OSXAdapter.java b/altosuilib/OSXAdapter.java index 5155b0fe..69cc3a55 100755 --- a/altosuilib/OSXAdapter.java +++ b/altosuilib/OSXAdapter.java @@ -55,7 +55,7 @@ Copyright © 2003-2007 Apple, Inc., All Rights Reserved */ -package org.altusmetrum.altosuilib_8; +package org.altusmetrum.altosuilib_9; import java.lang.reflect.*; import java.util.HashMap; diff --git a/ao-bringup/test-telemega b/ao-bringup/test-telemega index 2e497886..b801b20c 100755 --- a/ao-bringup/test-telemega +++ b/ao-bringup/test-telemega @@ -1,6 +1,6 @@ #!/bin/sh -VERSION=1.0 +VERSION=2.0 PRODUCT=TeleMega BASE=`echo $PRODUCT | tr 'A-Z' 'a-z'` diff --git a/ao-bringup/test-telemega-v1.0 b/ao-bringup/test-telemega-v1.0 new file mode 100755 index 00000000..2e497886 --- /dev/null +++ b/ao-bringup/test-telemega-v1.0 @@ -0,0 +1,66 @@ +#!/bin/sh + +VERSION=1.0 +PRODUCT=TeleMega +BASE=`echo $PRODUCT | tr 'A-Z' 'a-z'` + +echo "$PRODUCT-v$VERSION Test Program" +echo "Copyright 2014 by Keith Packard. Released under GPL v2" +echo +echo "Expectations:" +echo "\t$PRODUCT v$VERSION powered from USB" +echo + +ret=1 +ao-list | while read product serial dev; do + case "$product" in + "$PRODUCT-v$VERSION") + + echo "Testing $product $serial $dev" + + ./test-igniters $dev main drogue 3 0 1 2 + echo"" + + echo "Testing baro sensor" + ../ao-tools/ao-test-baro/ao-test-baro --tty="$dev" + + case $? in + 0) + ;; + *) + echo "failed" + exit 1 + esac + echo"" + + FLASHSIZE=8388608 + + echo "Testing flash" + ../ao-tools/ao-test-flash/ao-test-flash --tty="$dev" "$FLASHSIZE" + + case $? in + 0) + ;; + *) + echo "failed" + exit 1 + esac + echo"" + + echo "Testing GPS" + ../ao-tools/ao-test-gps/ao-test-gps --tty="$dev" + + case $? in + 0) + ;; + *) + echo "failed" + exit 1 + esac + echo"" + + echo "$PRODUCT-v$VERSION" serial "$serial" is ready to ship + ret=0 + ;; + esac +done diff --git a/ao-bringup/turnon_telebt b/ao-bringup/turnon_telebt index 7c036bc2..509814d3 100755 --- a/ao-bringup/turnon_telebt +++ b/ao-bringup/turnon_telebt @@ -56,6 +56,15 @@ SERIAL=$SERIAL ./cal-freq $dev echo 'E 1' > $dev +echo -n "checking BlueTooth functionality... " +btdev=`hcitool scan | awk -F \- '/TeleBT/ { print $2 }'` +if [ "$btdev" = "$SERIAL" ]; then + echo "working!" +else + echo "device not found" + exit 1 +fi + echo "TeleBT-v$VERSION $SERIAL is ready to ship" exit $? diff --git a/ao-bringup/turnon_telemega b/ao-bringup/turnon_telemega index 7b95bf20..62f51fba 100755 --- a/ao-bringup/turnon_telemega +++ b/ao-bringup/turnon_telemega @@ -14,7 +14,7 @@ else exit 1 fi -VERSION=1.0 +VERSION=2.0 REPO=~/altusmetrumllc/Binaries echo "TeleMega v$VERSION Turn-On and Calibration Program" diff --git a/ao-bringup/turnon_telemega_v1.0 b/ao-bringup/turnon_telemega_v1.0 new file mode 100755 index 00000000..7b95bf20 --- /dev/null +++ b/ao-bringup/turnon_telemega_v1.0 @@ -0,0 +1,63 @@ +#!/bin/sh + +if [ -x /usr/bin/ao-flash-stm ]; then + FLASH_STM=/usr/bin/ao-flash-stm +else + echo "Can't find ao-flash-stm! Aborting." + exit 1 +fi + +if [ -x /usr/bin/ao-usbload ]; then + USBLOAD=/usr/bin/ao-usbload +else + echo "Can't find ao-usbload! Aborting." + exit 1 +fi + +VERSION=1.0 +REPO=~/altusmetrumllc/Binaries + +echo "TeleMega v$VERSION Turn-On and Calibration Program" +echo "Copyright 2014 by Bdale Garbee. Released under GPL v2" +echo +echo "Expectations:" +echo "\tTeleMega v$VERSION powered from USB" +echo "\t\twith ST-Link-V2 cabled to debug header" +echo "\t\twith coax from UHF to frequency counter" +echo +echo -n "TeleMega-$VERSION serial number: " +read SERIAL + +echo $FLASH_STM + +$FLASH_STM $REPO/loaders/telemega-v$VERSION*.elf || exit 1 + +sleep 5 + +$USBLOAD --serial=$SERIAL $REPO/telemega-v$VERSION*.elf || exit 1 + +sleep 5 + +dev=`ao-list | awk '/TeleMega-v'"$VERSION"'/ { print $3; exit(0); }'` + +case "$dev" in +/dev/tty*) + echo "TeleMega found on $dev" + ;; +*) + echo 'No TeleMega-v'"$VERSION"' found' + exit 1 + ;; +esac + +echo 'E 0' > $dev + +SERIAL=$SERIAL ./cal-freq $dev + +../ao-tools/ao-cal-accel/ao-cal-accel $dev + +echo 'E 1' > $dev + +./test-telemega + +exit $? diff --git a/ao-tools/ao-dbg/ao-dbg-main.c b/ao-tools/ao-dbg/ao-dbg-main.c index 25eca54b..8c879035 100644 --- a/ao-tools/ao-dbg/ao-dbg-main.c +++ b/ao-tools/ao-dbg/ao-dbg-main.c @@ -66,7 +66,6 @@ main(int argc, char **argv) { int flags, opt; char *endptr; - struct sigvec vec, ovec; while ((opt = getopt_long(argc, argv, "PVvHhmt:X:c:r:Z:s:S:p:T:", options, NULL)) != -1) { switch (opt) { @@ -169,22 +168,16 @@ main(int argc, char **argv) perror("fdopen"); exit(1); } - vec.sv_handler = SIG_IGN; - vec.sv_mask = 0; - vec.sv_flags = 0; - sigvec(SIGINT, &vec, &ovec); + signal(SIGINT, SIG_IGN); command_read(); - sigvec(SIGINT, &ovec, NULL); + signal(SIGINT, SIG_DFL); fclose(s51_input); fclose(s51_output); } } else { s51_input = stdin; s51_output = stdout; - vec.sv_handler = s51_sigint; - vec.sv_mask = 0; - vec.sv_flags = 0; - sigvec(SIGINT, &vec, &ovec); + signal(SIGINT, s51_sigint); command_read(); } exit(0); diff --git a/ao-tools/ao-telem/ao-telem.c b/ao-tools/ao-telem/ao-telem.c index da873838..05a69542 100644 --- a/ao-tools/ao-telem/ao-telem.c +++ b/ao-tools/ao-telem/ao-telem.c @@ -173,6 +173,15 @@ main (int argc, char **argv) telem.mega_sensor.mag_y, telem.mega_sensor.mag_z); break; + case AO_TELEMETRY_COMPANION: + printf("board_id %3d update_period %3d channels %2d", + telem.companion.board_id, + telem.companion.update_period, + telem.companion.channels); + for (c = 0; c < telem.companion.channels; c++) + printf(" %6d", telem.companion.companion_data[c]); + printf("\n"); + break; case AO_TELEMETRY_MEGA_DATA: printf ("state %1d v_batt %5d v_pyro %5d ", telem.mega_data.state, @@ -182,7 +191,7 @@ main (int argc, char **argv) printf ("s%1d %5d ", c, telem.mega_data.sense[c] | (telem.mega_data.sense[c] << 8)); - + printf ("ground_pres %5d ground_accel %5d accel_plus %5d accel_minus %5d ", telem.mega_data.ground_pres, telem.mega_data.ground_accel, diff --git a/configure.ac b/configure.ac index bbf82377..addaad0c 100644 --- a/configure.ac +++ b/configure.ac @@ -18,8 +18,8 @@ dnl dnl Process this file with autoconf to create configure. AC_PREREQ(2.57) -AC_INIT([altos], 1.6.1) -ANDROID_VERSION=9 +AC_INIT([altos], 1.6.2) +ANDROID_VERSION=10 AC_CONFIG_SRCDIR([src/kernel/ao.h]) AM_INIT_AUTOMAKE([foreign dist-bzip2]) AM_MAINTAINER_MODE @@ -31,8 +31,8 @@ AC_SUBST(ANDROID_VERSION) dnl ========================================================================== dnl Java library versions -ALTOSUILIB_VERSION=8 -ALTOSLIB_VERSION=8 +ALTOSUILIB_VERSION=9 +ALTOSLIB_VERSION=9 AC_SUBST(ALTOSLIB_VERSION) AC_DEFINE(ALTOSLIB_VERSION,$ALTOSLIB_VERSION,[Version of the AltosLib package]) diff --git a/debian/control b/debian/control index 7fa2029d..426fb777 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,8 @@ Section: electronics Priority: optional Maintainer: Bdale Garbee <bdale@gag.com> Uploaders: Keith Packard <keithp@keithp.com> -Build-Depends: autoconf, +Build-Depends: asciidoc, + autoconf, automake, cc1111, debhelper (>= 7), diff --git a/doc/.gitignore b/doc/.gitignore index 73fe56e6..786123a3 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -1,4 +1,6 @@ *.html *.pdf *.fo +*.raw titlepage.templates.xsl +fop-cfg.xml diff --git a/doc/Makefile b/doc/Makefile index 9c6189b4..6a04a591 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,26 +2,28 @@ # http://docbook.sourceforge.net/release/xsl/current/README # -RELNOTES=\ - release-notes-0.7.1.html \ - release-notes-0.8.html \ - release-notes-0.9.html \ - release-notes-0.9.2.html \ - release-notes-1.0.1.html \ - release-notes-1.1.html \ - release-notes-1.1.1.html \ - release-notes-1.2.html \ - release-notes-1.2.1.html \ - release-notes-1.3.html \ - release-notes-1.3.1.html \ - release-notes-1.3.2.html \ - release-notes-1.4.html \ - release-notes-1.4.1.html \ - release-notes-1.5.html \ - release-notes-1.6.html \ - release-notes-1.6.1.html - -PICTURES=\ +RELNOTES_INC=\ + release-notes-1.6.2.inc \ + release-notes-1.6.1.inc \ + release-notes-1.6.inc \ + release-notes-1.5.inc \ + release-notes-1.4.2.inc \ + release-notes-1.4.1.inc \ + release-notes-1.4.inc \ + release-notes-1.3.2.inc \ + release-notes-1.3.1.inc \ + release-notes-1.3.inc \ + release-notes-1.2.1.inc \ + release-notes-1.2.inc \ + release-notes-1.1.1.inc \ + release-notes-1.1.inc \ + release-notes-1.0.1.inc \ + release-notes-0.9.2.inc \ + release-notes-0.9.inc \ + release-notes-0.8.inc \ + release-notes-0.7.1.inc + +IMAGES=\ altosui.png \ ascent.png \ configure-altimeter.png \ @@ -30,12 +32,17 @@ PICTURES=\ configure-pyro.png \ descent.png \ device-selection.png \ + easymega.svg \ + easymega-v1.0-bottom.jpg \ + easymega-v1.0-top.jpg \ + easymini.svg \ easymini-top.jpg \ fire-igniter.png \ graph-configure.png \ graph-map.png \ graph.png \ graph-stats.png \ + ignitor.png \ landed.png \ launch-pad.png \ load-maps.png \ @@ -46,6 +53,7 @@ PICTURES=\ micropeak-download.png \ micropeak-graph-configure.png \ micropeak-graph.png \ + micropeak-nofont.svg \ micropeak-preferences.png \ micropeak-raw-data.png \ micropeak-save-dialog.png \ @@ -56,10 +64,105 @@ PICTURES=\ scan-channels.png \ site-map.png \ table.png \ + telegps-configure.png \ + telegps-graph-configure.png \ + telegps-graph-graph.png \ + telegps-graph-map.png \ + telegps-graph-stats.png \ + telegps-info.png \ + telegps-location.png \ + telegps-map.png \ + telegps-preferences.png \ + telegps-scan.png \ + telegps-status.png \ + telegps-table.png \ + telegps-v1.0-top.jpg \ + telemega.svg \ telemega-v1.0-top.jpg \ + telemetrum.svg \ telemetrum-v1.1-thside.jpg \ + telemetrum-v2.0-th.jpg \ + telemini.svg \ telemini-v1-top.jpg \ - telemini-v2-top.jpg + altusmetrum-oneline.svg \ + telegps-oneline.svg \ + micropeak-oneline.svg + +TXT_FILES=altusmetrum.txt + +COMMON_INC_FILES=\ + config-device.inc \ + config-ui.inc \ + load-maps.inc \ + aprs-operation.inc \ + handling.inc + +INC_FILES=\ + dedication.inc \ + intro.inc \ + getting-started.inc \ + usage.inc \ + telemetrum.inc \ + telemini-v1.0.inc \ + easymini-device.inc \ + telemega.inc \ + easymega.inc \ + installation.inc \ + using-am-products.inc \ + updating-firmware.inc \ + altosui.inc \ + altosdroid.inc \ + system-operation.inc \ + pyro-channels.inc \ + flight-data-recording.inc \ + specs.inc \ + $(COMMON_INC_FILES) \ + release-notes.inc \ + $(RELNOTES_INC) + +RAW_FILES=$(TXT_FILES:.txt=.raw) $(INC_FILES:.inc=.raw) + +TELEGPS_INC_FILES=\ + telegps-dedication.inc \ + telegps-quick-start.inc \ + telegps-using.inc \ + telegps-system-operation.inc \ + telegps-application.inc \ + telegps-specs.inc \ + telegps-updating-firmware.inc \ + telegps-release-notes.inc \ + $(COMMON_INC_FILES) + +TELEGPS_TXT_FILES=\ + telegps.txt + +TELEGPS_RAW_FILES=$(TELEGPS_TXT_FILES:.txt=.raw) $(TELEGPS_INC_FILES:.inc=.raw) + +MICROPEAK_TXT_FILES=\ + micropeak.txt + +MICROPEAK_INC_FILES= + +MICROPEAK_RAW_FILES=$(MICROPEAK_TXT_FILES:.txt=.raw) $(MICROPEAK_INC_FILES:.inc=.raw) + +EASYMINI_TXT_FILES=\ + easymini.txt + +EASYMINI_INC_FILES=$(INC_FILES) easymini-release-notes.inc + + +EASYMINI_RAW_FILES=$(EASYMINI_TXT_FILES:.txt=.raw) $(EASYMINI_INC_FILES:.inc=.raw) + +OUTLINE_TXT_FILES=\ + easymega-outline.txt \ + easymini-outline.txt \ + telemega-outline.txt \ + telemetrum-outline.txt \ + telemini-outline.txt + +OUTLINE_RAW_FILES=$(OUTLINE_TXT_FILES:.txt=.raw) + +OUTLINE_PDF_FILES=$(OUTLINE_TXT_FILES:.txt=.pdf) SVG=\ easymini.svg \ @@ -68,56 +171,116 @@ SVG=\ telemini.svg \ easymega.svg -RELNOTES_XSL=$(RELNOTES:.html=.xsl) -HTML=altusmetrum.html altos.html telemetry.html companion.html micropeak.html telegps.html $(RELNOTES) -PDF=altusmetrum.pdf altos.pdf telemetry.pdf companion.pdf micropeak.pdf telegps.pdf \ - telemetrum-outline.pdf telemega-outline.pdf easymini-outline.pdf easymega-outline.pdf -HTMLSTYLE=/usr/share/xml/docbook/stylesheet/docbook-xsl/html/docbook.xsl -FOSTYLE=xorg-fo.xsl -TEMPLATES=titlepage.templates.xsl -PDFSTYLE= -IMAGES=$(PICTURES) $(SVG) -DOC=$(HTML) $(PDF) $(IMAGES) +RELNOTES_PDF=$(RELNOTES_INC:.inc=.pdf) +RELNOTES_HTML=$(RELNOTES_INC:.inc=.html) + +ONEFILE_TXT_FILES=\ + altos.txt \ + companion.txt \ + telemetry.txt -.SUFFIXES: .xml .xsl .html .pdf +ONEFILE_RAW_FILES=$(ONEFILE_TXT_FILES:.txt=.raw) +ONEFILE_PDF_FILES=$(ONEFILE_TXT_FILES:.txt=.pdf) -XSLTFLAGS=--stringparam section.autolabel 1 --xinclude +AM_HTML=am.html -.xsl.html: - xsltproc $(XSLTFLAGS) -o $@ $(HTMLSTYLE) $*.xsl +HTML=altusmetrum.html micropeak.html telegps.html easymini.html $(RELNOTES_HTML) $(ONEFILE_HTML_FILES) -.xsl.pdf: - xmlto -x $(FOSTYLE) --with-fop pdf $*.xsl +HTML_REVHISTORY=\ + altusmetrum-revhistory.html \ + micropeak-revhistory.html \ + telegps-revhistory.html \ + easymini-revhistory.html -.xml.xsl: - xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.xml +PDF=altusmetrum.pdf micropeak.pdf telegps.pdf easymini.pdf $(RELNOTES_PDF) $(ONEFILE_PDF_FILES) \ + $(OUTLINE_PDF_FILES) + +FOP_STYLE=am-fo.xsl +HTML_STYLE=am-html.xsl +COMMON_STYLE=common.xsl +FOP_XCONF=fop.xconf +STYLESHEET=am.css + +FONTS=\ + fonts/DejaVuSansMono-BoldOblique.ttf \ + fonts/DejaVuSansMono-Bold.ttf \ + fonts/DejaVuSansMono-Oblique.ttf \ + fonts/DejaVuSansMono.ttf \ + fonts/OpenSans-Light.ttf \ + fonts/OpenSans-LightItalic.ttf \ + fonts/OpenSans-Regular.ttf \ + fonts/OpenSans-Italic.ttf \ + fonts/OpenSans-Semibold.ttf \ + fonts/OpenSans-SemiboldItalic.ttf + +TEMPLATES_TMPL=titlepage.templates.tmpl + +TEMPLATES_XSL=$(TEMPLATES_TMPL:.tmpl=.xsl) + +PDF_CONFIG_FILES=$(FOP_STYLE) $(COMMON_STYLE) $(FOP_XCONF) $(TEMPLATES_XSL) +HTML_CONFIG_FILES=$(HTML_STYLE) $(COMMON_STYLE) $(TEMPLATES_XSL) + +DOC=$(HTML) $(HTML_REVHISTORY) $(PDF) $(IMAGES) $(STYLESHEET) + +.SUFFIXES: .tmpl .xsl .inc .txt .raw .pdf .html + +.txt.raw: + sed -e 's/^[ ]*//' -e 's/^\\//' $*.txt > $@ + +.inc.raw: + sed -e 's/^[ ]*//' -e 's/^\\//' $*.inc > $@ + +.raw.pdf: + a2x --verbose -a docinfo -f pdf --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(FOP_STYLE) --fop --fop-opts="-c $(FOP_XCONF)" $*.raw + a2x --verbose -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(HTML_STYLE) --stylesheet=$(STYLESHEET) $*.raw + +.pdf.html: + @touch $@ + +.tmpl.xsl: + xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.tmpl all: $(HTML) $(PDF) +altusmetrum-revhistory.html: altusmetrum.html + +micropeak-revhistory.html: micropeak.html + +telegps-revhistory.html: telegps.html + +altusmetrum.pdf altusmetrum.html: altusmetrum-docinfo.xml $(RAW_FILES) $(IMAGES) + +telegps.html telegps.pdf: telegps-docinfo.xml $(TELEGPS_RAW_FILES) $(IMAGES) + +micropeak.pdf micropeak.html: micropeak-docinfo.xml $(MICROPEAK_RAW_FILES) $(IMAGES) + +easymini.pdf easymini.html: easymini-docinfo.xml $(EASYMINI_RAW_FILES) $(IMAGES) + install: all -publish: $(DOC) +publish: $(DOC) $(FONTS) cp $(DOC) /home/bdale/web/altusmetrum/AltOS/doc/ + mkdir -p /home/bdale/web/altusmetrum/AltOS/doc/fonts/ + cp $(FONTS) /home/bdale/web/altusmetrum/AltOS/doc/fonts/ (cd /home/bdale/web/altusmetrum ; \ git add /home/bdale/web/altusmetrum/AltOS/doc/* ; \ + git add /home/bdale/web/altusmetrum/AltOS/doc/fonts/* ; \ echo "update docs" | \ - git commit -F - /home/bdale/web/altusmetrum/AltOS/doc/* ; \ + git commit -F - /home/bdale/web/altusmetrum/AltOS/doc/* /home/bdale/web/altusmetrum/AltOS/doc/fonts/* ; \ git push) +publish-keithp: am.html $(DOC) $(FONTS) + scp -p am.html $(DOC) keithp.com:~keithp/public_html/altos + scp -p $(FONTS) keithp.com:~keithp/public_html/altos/fonts + clean: - rm -f $(HTML) $(PDF) $(TEMPLATES) + rm -f am.html $(HTML) $(HTML_REVHISTORY) $(PDF) $(TEMPLATES_XSL) $(RAW_FILES) $(TELEGPS_RAW_FILES) $(MICROPEAK_RAW_FILES) -distclean: +distclean: clean rm -f $(HTML) $(PDF) -altusmetrum.html: $(RELNOTES_XSL) $(IMAGES) -altusmetrum.pdf: $(RELNOTES_XSL) $(IMAGES) - -telegps.html: $(RELNOTES_XSL) $(IMAGES) -telegps.pdf: $(RELNOTES_XSL) $(IMAGES) - -$(PDF): $(FOSTYLE) $(TEMPLATES) - -indent: altusmetrum.xsl - xmlindent -i 2 < altusmetrum.xsl > altusmetrum.new +$(PDF): $(PDF_CONFIG_FILES) +$(HTML): $(HTML_CONFIG_FILES) +am.html: Makefile make-am-html $(HTML) + sh ./make-am-html $(HTML) > $@ diff --git a/doc/RELNOTES b/doc/RELNOTES new file mode 100644 index 00000000..8f7d2540 --- /dev/null +++ b/doc/RELNOTES @@ -0,0 +1,34 @@ +Creating documentation for a new release of AltOS + +* Write release notes in release-notes-${version}.inc. Write docinfo + for release notes in release-notes-${version}-docinfo.xml. Add to + Makefile + +* Add references to that as appropriate from each of the + documents: + + release-notes.inc + easymini-release-notes.inc + telegps-release-notes.inc + +* Update date and add docinfo short release info for each document as + appropriate + + altusmetrum-docinfo.xml + companion-docinfo.xml + easymini-docinfo.xml + micropeak-docinfo.xml + telegps-docinfo.xml + telemetry-docinfo.xml + +* Update copyright year as appropriate + + altusmetrum-docinfo.xml + companion-docinfo.xml + easymini-docinfo.xml + micropeak-docinfo.xml + telegps-docinfo.xml + telemetry-docinfo.xml + +* Add release-notes-${version}.inc and + release-notes-${version}-docinfo.xml to git diff --git a/doc/altos-docinfo.xml b/doc/altos-docinfo.xml new file mode 100644 index 00000000..b9193a8f --- /dev/null +++ b/doc/altos-docinfo.xml @@ -0,0 +1,33 @@ +<subtitle>Altos Metrum Operating System</subtitle> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>05 November 2012</date> +<copyright> + <year>2012</year> + <holder>Keith Packard</holder> +</copyright> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> +<revhistory> + <?dbhtml filename="altos-revhistory.html"?> + <revision> + <revnumber>1.1</revnumber> + <date>05 November 2012</date> + <revremark>Portable version</revremark> + </revision> + <revision> + <revnumber>0.1</revnumber> + <date>22 November 2010</date> + <revremark>Initial content</revremark> + </revision> +</revhistory> diff --git a/doc/altos.txt b/doc/altos.txt new file mode 100644 index 00000000..f2b1ee59 --- /dev/null +++ b/doc/altos.txt @@ -0,0 +1,1400 @@ += AltOS +:doctype: book +:toc: +:numbered: + +== Overview + + AltOS is a operating system built for a variety of + microcontrollers used in Altus Metrum devices. It has a simple + porting layer for each CPU while providing a convenient + operating enviroment for the developer. AltOS currently + supports three different CPUs: + + * STM32L series from ST Microelectronics. This ARM Cortex-M3 + based microcontroller offers low power consumption and a + wide variety of built-in peripherals. Altus Metrum uses this + in the TeleMega, MegaDongle and TeleLCO projects. + + * CC1111 from Texas Instruments. This device includes a + fabulous 10mW digital RF transceiver along with an + 8051-compatible processor core and a range of + peripherals. This is used in the TeleMetrum, TeleMini, + TeleDongle and TeleFire projects which share the need for a + small microcontroller and an RF interface. + + * ATmega32U4 from Atmel. This 8-bit AVR microcontroller is one + of the many used to create Arduino boards. The 32U4 includes + a USB interface, making it easy to connect to other + computers. Altus Metrum used this in prototypes of the + TeleScience and TelePyro boards; those have been switched to + the STM32L which is more capable and cheaper. + + Among the features of AltOS are: + + * Multi-tasking. While microcontrollers often don't + provide separate address spaces, it's often easier to write + code that operates in separate threads instead of tying + everything into one giant event loop. + + * Non-preemptive. This increases latency for thread + switching but reduces the number of places where context + switching can occur. It also simplifies the operating system + design somewhat. Nothing in the target system (rocket flight + control) has tight timing requirements, and so this seems like + a reasonable compromise. + + * Sleep/wakeup scheduling. Taken directly from ancient + Unix designs, these two provide the fundemental scheduling + primitive within AltOS. + + * Mutexes. As a locking primitive, mutexes are easier to + use than semaphores, at least in my experience. + + * Timers. Tasks can set an alarm which will abort any + pending sleep, allowing operations to time-out instead of + blocking forever. + + The device drivers and other subsystems in AltOS are + conventionally enabled by invoking their _init() function from + the 'main' function before that calls + ao_start_scheduler(). These functions initialize the pin + assignments, add various commands to the command processor and + may add tasks to the scheduler to handle the device. A typical + main program, thus, looks like: + + .... + \void + \main(void) + \{ + \ ao_clock_init(); + + \ /* Turn on the LED until the system is stable */ + \ ao_led_init(LEDS_AVAILABLE); + \ ao_led_on(AO_LED_RED); + \ ao_timer_init(); + \ ao_cmd_init(); + \ ao_usb_init(); + \ ao_monitor_init(AO_LED_GREEN, TRUE); + \ ao_rssi_init(AO_LED_RED); + \ ao_radio_init(); + \ ao_packet_slave_init(); + \ ao_packet_master_init(); + \#if HAS_DBG + \ ao_dbg_init(); + \#endif + \ ao_config_init(); + \ ao_start_scheduler(); + \} + .... + + As you can see, a long sequence of subsystems are initialized + and then the scheduler is started. + +== AltOS Porting Layer + + AltOS provides a CPU-independent interface to various common + microcontroller subsystems, including GPIO pins, interrupts, + SPI, I2C, USB and asynchronous serial interfaces. By making + these CPU-independent, device drivers, generic OS and + application code can all be written that work on any supported + CPU. Many of the architecture abstraction interfaces are + prefixed with ao_arch. + + === Low-level CPU operations + + These primitive operations provide the abstraction needed to + run the multi-tasking framework while providing reliable + interrupt delivery. + + ==== ao_arch_block_interrupts/ao_arch_release_interrupts + + .... + static inline void + ao_arch_block_interrupts(void); + + static inline void + ao_arch_release_interrupts(void); + .... + + These disable/enable interrupt delivery, they may not + discard any interrupts. Use these for sections of code that + must be atomic with respect to any code run from an + interrupt handler. + + ==== ao_arch_save_regs, ao_arch_save_stack, ao_arch_restore_stack + + .... + static inline void + ao_arch_save_regs(void); + + static inline void + ao_arch_save_stack(void); + + static inline void + ao_arch_restore_stack(void); + .... + + These provide all of the support needed to switch + between tasks.. ao_arch_save_regs must save all CPU + registers to the current stack, including the + interrupt enable state. ao_arch_save_stack records the + current stack location in the current ao_task + structure. ao_arch_restore_stack switches back to the + saved stack, restores all registers and branches to + the saved return address. + + ==== ao_arch_wait_interupt + + .... + #define ao_arch_wait_interrupt() + .... + + This stops the CPU, leaving clocks and interrupts + enabled. When an interrupt is received, this must wake up + and handle the interrupt. ao_arch_wait_interrupt is entered + with interrupts disabled to ensure that there is no gap + between determining that no task wants to run and idling the + CPU. It must sleep the CPU, process interrupts and then + disable interrupts again. If the CPU doesn't have any + reduced power mode, this must at the least allow pending + interrupts to be processed. + + === GPIO operations + + These functions provide an abstract interface to configure and + manipulate GPIO pins. + + ==== GPIO setup + + These macros may be invoked at system + initialization time to configure pins as + needed for system operation. One tricky aspect + is that some chips provide direct access to + specific GPIO pins while others only provide + access to a whole register full of pins. To + support this, the GPIO macros provide both + port+bit and pin arguments. Simply define the + arguments needed for the target platform and + leave the others undefined. + + ===== ao_enable_output + + .... + #define ao_enable_output(port, bit, pin, value) + .... + + Set the specified port+bit (also called 'pin') + for output, initializing to the specified + value. The macro must avoid driving the pin + with the opposite value if at all possible. + + ===== ao_enable_input + + .... + #define ao_enable_input(port, bit, mode) + .... + + Sets the specified port/bit to be an input + pin. 'mode' is a combination of one or more of + the following. Note that some platforms may + not support the desired mode. In that case, + the value will not be defined so that the + program will fail to compile. + + * AO_EXTI_MODE_PULL_UP. Apply a pull-up to the + pin; a disconnected pin will read as 1. + + * AO_EXTI_MODE_PULL_DOWN. Apply a pull-down to + the pin; a disconnected pin will read as 0. + + * 0. Don't apply either a pull-up or + pull-down. A disconnected pin will read an + undetermined value. + + ==== Reading and writing GPIO pins + + These macros read and write individual GPIO pins. + + ===== ao_gpio_set + + .... + #define ao_gpio_set(port, bit, pin, value) + .... + + Sets the specified port/bit or pin to + the indicated value + + ===== ao_gpio_get + + .... + #define ao_gpio_get(port, bit, pin) + .... + + Returns either 1 or 0 depending on + whether the input to the pin is high + or low. +== Programming the 8051 with SDCC + + The 8051 is a primitive 8-bit processor, designed in the mists + of time in as few transistors as possible. The architecture is + highly irregular and includes several separate memory + spaces. Furthermore, accessing stack variables is slow, and + the stack itself is of limited size. While SDCC papers over + the instruction set, it is not completely able to hide the + memory architecture from the application designer. + + When built on other architectures, the various SDCC-specific + symbols are #defined as empty strings so they don't affect the + compiler. + + === 8051 memory spaces + + The __data/__xdata/__code memory spaces below were completely + separate in the original 8051 design. In the cc1111, this + isn't true—they all live in a single unified 64kB address + space, and so it's possible to convert any address into a + unique 16-bit address. SDCC doesn't know this, and so a + 'global' address to SDCC consumes 3 bytes of memory, 1 byte as + a tag indicating the memory space and 2 bytes of offset within + that space. AltOS avoids these 3-byte addresses as much as + possible; using them involves a function call per byte + access. The result is that nearly every variable declaration + is decorated with a memory space identifier which clutters the + code but makes the resulting code far smaller and more + efficient. + + ==== __data + + The 8051 can directly address these 128 bytes of + memory. This makes them precious so they should be + reserved for frequently addressed values. Oh, just to + confuse things further, the 8 general registers in the + CPU are actually stored in this memory space. There are + magic instructions to 'bank switch' among 4 banks of + these registers located at 0x00 - 0x1F. AltOS uses only + the first bank at 0x00 - 0x07, leaving the other 24 + bytes available for other data. + + ==== __idata + + There are an additional 128 bytes of internal memory + that share the same address space as __data but which + cannot be directly addressed. The stack normally + occupies this space and so AltOS doesn't place any + static storage here. + + ==== __xdata + + This is additional general memory accessed through a + single 16-bit address register. The CC1111F32 has 32kB + of memory available here. Most program data should live + in this memory space. + + ==== __pdata + + This is an alias for the first 256 bytes of __xdata + memory, but uses a shorter addressing mode with + single global 8-bit value for the high 8 bits of the + address and any of several 8-bit registers for the low 8 + bits. AltOS uses a few bits of this memory, it should + probably use more. + + ==== __code + + All executable code must live in this address space, but + you can stick read-only data here too. It is addressed + using the 16-bit address register and special 'code' + access opcodes. Anything read-only should live in this space. + + ==== __bit + + The 8051 has 128 bits of bit-addressible memory that + lives in the __data segment from 0x20 through + 0x2f. Special instructions access these bits + in a single atomic operation. This isn't so much a + separate address space as a special addressing mode for + a few bytes in the __data segment. + + ==== __sfr, __sfr16, __sfr32, __sbit + + Access to physical registers in the device use this mode + which declares the variable name, its type and the + address it lives at. No memory is allocated for these + variables. + + === Function calls on the 8051 + + Because stack addressing is expensive, and stack space + limited, the default function call declaration in SDCC + allocates all parameters and local variables in static global + memory. Just like fortran. This makes these functions + non-reentrant, and also consume space for parameters and + locals even when they are not running. The benefit is smaller + code and faster execution. + + ==== __reentrant functions + + All functions which are re-entrant, either due to recursion + or due to a potential context switch while executing, should + be marked as __reentrant so that their parameters and local + variables get allocated on the stack. This ensures that + these values are not overwritten by another invocation of + the function. + + Functions which use significant amounts of space for + arguments and/or local variables and which are not often + invoked can also be marked as __reentrant. The resulting + code will be larger, but the savings in memory are + frequently worthwhile. + + ==== Non __reentrant functions + + All parameters and locals in non-reentrant functions can + have data space decoration so that they are allocated in + __xdata, __pdata or __data space as desired. This can avoid + consuming __data space for infrequently used variables in + frequently used functions. + + All library functions called by SDCC, including functions + for multiplying and dividing large data types, are + non-reentrant. Because of this, interrupt handlers must not + invoke any library functions, including the multiply and + divide code. + + ==== __interrupt functions + + Interrupt functions are declared with with an __interrupt + decoration that includes the interrupt number. SDCC saves + and restores all of the registers in these functions and + uses the 'reti' instruction at the end so that they operate + as stand-alone interrupt handlers. Interrupt functions may + call the ao_wakeup function to wake AltOS tasks. + + ==== __critical functions and statements + + SDCC has built-in support for suspending interrupts during + critical code. Functions marked as __critical will have + interrupts suspended for the whole period of + execution. Individual statements may also be marked as + __critical which blocks interrupts during the execution of + that statement. Keeping critical sections as short as + possible is key to ensuring that interrupts are handled as + quickly as possible. AltOS doesn't use this form in shared + code as other compilers wouldn't know what to do. Use + ao_arch_block_interrupts and ao_arch_release_interrupts instead. + +== Task functions + + This chapter documents how to create, destroy and schedule + AltOS tasks. + + === ao_add_task + + .... + \void + \ao_add_task(__xdata struct ao_task * task, + \ void (*start)(void), + \ __code char *name); + .... + + This initializes the statically allocated task structure, + assigns a name to it (not used for anything but the task + display), and the start address. It does not switch to the + new task. 'start' must not ever return; there is no place + to return to. + + === ao_exit + + .... + void + ao_exit(void) + .... + + This terminates the current task. + + === ao_sleep + + .... + void + ao_sleep(__xdata void *wchan) + .... + + This suspends the current task until 'wchan' is signaled + by ao_wakeup, or until the timeout, set by ao_alarm, + fires. If 'wchan' is signaled, ao_sleep returns 0, otherwise + it returns 1. This is the only way to switch to another task. + + Because ao_wakeup wakes every task waiting on a particular + location, ao_sleep should be used in a loop that first checks + the desired condition, blocks in ao_sleep and then rechecks + until the condition is satisfied. If the location may be + signaled from an interrupt handler, the code will need to + block interrupts around the block of code. Here's a complete + example: + + .... + \ao_arch_block_interrupts(); + \while (!ao_radio_done) + \ ao_sleep(&ao_radio_done); + \ao_arch_release_interrupts(); + .... + + === ao_wakeup + + .... + void + ao_wakeup(__xdata void *wchan) + .... + + Wake all tasks blocked on 'wchan'. This makes them + available to be run again, but does not actually switch + to another task. Here's an example of using this: + + .... + \if (RFIF & RFIF_IM_DONE) { + \ ao_radio_done = 1; + \ ao_wakeup(&ao_radio_done); + \ RFIF &= ~RFIF_IM_DONE; + \} + .... + + Note that this need not block interrupts as the + ao_sleep block can only be run from normal mode, and + so this sequence can never be interrupted with + execution of the other sequence. + + === ao_alarm + + .... + void + ao_alarm(uint16_t delay); + + void + ao_clear_alarm(void); + .... + + Schedules an alarm to fire in at least 'delay' + ticks. If the task is asleep when the alarm fires, it + will wakeup and ao_sleep will return 1. ao_clear_alarm + resets any pending alarm so that it doesn't fire at + some arbitrary point in the future. + + .... + ao_alarm(ao_packet_master_delay); + ao_arch_block_interrupts(); + while (!ao_radio_dma_done) + if (ao_sleep(&ao_radio_dma_done) != 0) + ao_radio_abort(); + ao_arch_release_interrupts(); + ao_clear_alarm(); + .... + + In this example, a timeout is set before waiting for + incoming radio data. If no data is received before the + timeout fires, ao_sleep will return 1 and then this + code will abort the radio receive operation. + + === ao_start_scheduler + + .... + void + ao_start_scheduler(void); + .... + + This is called from 'main' when the system is all + initialized and ready to run. It will not return. + + === ao_clock_init + + .... + void + ao_clock_init(void); + .... + + This initializes the main CPU clock and switches to it. + +== Timer Functions + + AltOS sets up one of the CPU timers to run at 100Hz and + exposes this tick as the fundemental unit of time. At each + interrupt, AltOS increments the counter, and schedules any tasks + waiting for that time to pass, then fires off the sensors to + collect current data readings. Doing this from the ISR ensures + that the values are sampled at a regular rate, independent + of any scheduling jitter. + + === ao_time + + .... + uint16_t + ao_time(void) + .... + + Returns the current system tick count. Note that this is + only a 16 bit value, and so it wraps every 655.36 seconds. + + === ao_delay + + .... + void + ao_delay(uint16_t ticks); + .... + + Suspend the current task for at least 'ticks' clock units. + + === ao_timer_set_adc_interval + + .... + void + ao_timer_set_adc_interval(uint8_t interval); + .... + + This sets the number of ticks between ADC samples. If set + to 0, no ADC samples are generated. AltOS uses this to + slow down the ADC sampling rate to save power. + + === ao_timer_init + + .... + void + ao_timer_init(void) + .... + + This turns on the 100Hz tick. It is required for any of the + time-based functions to work. It should be called by 'main' + before ao_start_scheduler. + +== AltOS Mutexes + + AltOS provides mutexes as a basic synchronization primitive. Each + mutexes is simply a byte of memory which holds 0 when the mutex + is free or the task id of the owning task when the mutex is + owned. Mutex calls are checked—attempting to acquire a mutex + already held by the current task or releasing a mutex not held + by the current task will both cause a panic. + + === ao_mutex_get + + .... + void + ao_mutex_get(__xdata uint8_t *mutex); + .... + + Acquires the specified mutex, blocking if the mutex is + owned by another task. + + === ao_mutex_put + + .... + void + ao_mutex_put(__xdata uint8_t *mutex); + .... + + Releases the specified mutex, waking up all tasks waiting + for it. + +== DMA engine + + The CC1111 and STM32L both contain a useful bit of extra + hardware in the form of a number of programmable DMA + engines. They can be configured to copy data in memory, or + between memory and devices (or even between two devices). AltOS + exposes a general interface to this hardware and uses it to + handle both internal and external devices. + + Because the CC1111 and STM32L DMA engines are different, the + interface to them is also different. As the DMA engines are + currently used to implement platform-specific drivers, this + isn't yet a problem. + + Code using a DMA engine should allocate one at startup + time. There is no provision to free them, and if you run out, + AltOS will simply panic. + + During operation, the DMA engine is initialized with the + transfer parameters. Then it is started, at which point it + awaits a suitable event to start copying data. When copying data + from hardware to memory, that trigger event is supplied by the + hardware device. When copying data from memory to hardware, the + transfer is usually initiated by software. + + === CC1111 DMA Engine + + ==== ao_dma_alloc + + .... + uint8_t + ao_dma_alloc(__xdata uint8_t *done) + .... + + Allocate a DMA engine, returning the + identifier. 'done' is cleared when the DMA is + started, and then receives the AO_DMA_DONE bit + on a successful transfer or the AO_DMA_ABORTED + bit if ao_dma_abort was called. Note that it + is possible to get both bits if the transfer + was aborted after it had finished. + + ==== ao_dma_set_transfer + + .... + void + ao_dma_set_transfer(uint8_t id, + void __xdata *srcaddr, + void __xdata *dstaddr, + uint16_t count, + uint8_t cfg0, + uint8_t cfg1) + .... + + Initializes the specified dma engine to copy + data from 'srcaddr' to 'dstaddr' for 'count' + units. cfg0 and cfg1 are values directly out + of the CC1111 documentation and tell the DMA + engine what the transfer unit size, direction + and step are. + + ==== ao_dma_start + + .... + void + ao_dma_start(uint8_t id); + .... + + Arm the specified DMA engine and await a + signal from either hardware or software to + start transferring data. + + ==== ao_dma_trigger + + .... + void + ao_dma_trigger(uint8_t id) + .... + + Trigger the specified DMA engine to start + copying data. + + ==== ao_dma_abort + + .... + void + ao_dma_abort(uint8_t id) + .... + + Terminate any in-progress DMA transaction, + marking its 'done' variable with the + AO_DMA_ABORTED bit. + + === STM32L DMA Engine + + ==== ao_dma_alloc + + .... + uint8_t ao_dma_done[]; + + void + ao_dma_alloc(uint8_t index); + .... + + Reserve a DMA engine for exclusive use by one + driver. + + ==== ao_dma_set_transfer + + .... + void + ao_dma_set_transfer(uint8_t id, + void *peripheral, + void *memory, + uint16_t count, + uint32_t ccr); + .... + + Initializes the specified dma engine to copy + data between 'peripheral' and 'memory' for + 'count' units. 'ccr' is a value directly out + of the STM32L documentation and tells the DMA + engine what the transfer unit size, direction + and step are. + + ==== ao_dma_set_isr + + .... + void + ao_dma_set_isr(uint8_t index, void (*isr)(int)) + .... + + This sets a function to be called when the DMA + transfer completes in lieu of setting the + ao_dma_done bits. Use this when some work + needs to be done when the DMA finishes that + cannot wait until user space resumes. + + ==== ao_dma_start + + .... + void + ao_dma_start(uint8_t id); + .... + + Arm the specified DMA engine and await a + signal from either hardware or software to + start transferring data. 'ao_dma_done[index]' + is cleared when the DMA is started, and then + receives the AO_DMA_DONE bit on a successful + transfer or the AO_DMA_ABORTED bit if + ao_dma_abort was called. Note that it is + possible to get both bits if the transfer was + aborted after it had finished. + + ==== ao_dma_done_transfer + + .... + void + ao_dma_done_transfer(uint8_t id); + .... + + Signals that a specific DMA engine is done + being used. This allows multiple drivers to + use the same DMA engine safely. + + ==== ao_dma_abort + + .... + void + ao_dma_abort(uint8_t id) + .... + + Terminate any in-progress DMA transaction, + marking its 'done' variable with the + AO_DMA_ABORTED bit. + +== Stdio interface + + AltOS offers a stdio interface over USB, serial and the RF + packet link. This provides for control of the device locally or + remotely. This is hooked up to the stdio functions by providing + the standard putchar/getchar/flush functions. These + automatically multiplex the available communication channels; + output is always delivered to the channel which provided the + most recent input. + + === putchar + + .... + void + putchar(char c) + .... + + Delivers a single character to the current console + device. + + === getchar + + .... + char + getchar(void) + .... + + Reads a single character from any of the available + console devices. The current console device is set to + that which delivered this character. This blocks until + a character is available. + + === flush + + .... + void + flush(void) + .... + + Flushes the current console device output buffer. Any + pending characters will be delivered to the target device. + + === ao_add_stdio + + .... + void + ao_add_stdio(char (*pollchar)(void), + void (*putchar)(char), + void (*flush)(void)) + .... + + This adds another console device to the available + list. + + 'pollchar' returns either an available character or + AO_READ_AGAIN if none is available. Significantly, it does + not block. The device driver must set 'ao_stdin_ready' to + 1 and call ao_wakeup(&ao_stdin_ready) when it receives + input to tell getchar that more data is available, at + which point 'pollchar' will be called again. + + 'putchar' queues a character for output, flushing if the output buffer is + full. It may block in this case. + + 'flush' forces the output buffer to be flushed. It may + block until the buffer is delivered, but it is not + required to do so. + +== Command line interface + + AltOS includes a simple command line parser which is hooked up + to the stdio interfaces permitting remote control of the + device over USB, serial or the RF link as desired. Each + command uses a single character to invoke it, the remaining + characters on the line are available as parameters to the + command. + + === ao_cmd_register + + .... + void + ao_cmd_register(__code struct ao_cmds *cmds) + .... + + This registers a set of commands with the command + parser. There is a fixed limit on the number of command + sets, the system will panic if too many are registered. + Each command is defined by a struct ao_cmds entry: + + .... + \struct ao_cmds { + \ char cmd; + \ void (*func)(void); + \ const char *help; + \}; + .... + 'cmd' is the character naming the command. 'func' is the + function to invoke and 'help' is a string displayed by the + '?' command. Syntax errors found while executing 'func' + should be indicated by modifying the global ao_cmd_status + variable with one of the following values: + + ao_cmd_success:: + + The command was parsed successfully. There is no need + to assign this value, it is the default. + + ao_cmd_lex_error:: + + A token in the line was invalid, such as a number + containing invalid characters. The low-level lexing + functions already assign this value as needed. + + ao_syntax_error:: + + The command line is invalid for some reason other than + invalid tokens. + + === ao_cmd_lex + + .... + void + ao_cmd_lex(void); + .... + + This gets the next character out of the command line + buffer and sticks it into ao_cmd_lex_c. At the end of + the line, ao_cmd_lex_c will get a newline ('\n') + character. + + === ao_cmd_put16 + + .... + void + ao_cmd_put16(uint16_t v); + .... + + Writes 'v' as four hexadecimal characters. + + === ao_cmd_put8 + + .... + void + ao_cmd_put8(uint8_t v); + .... + + Writes 'v' as two hexadecimal characters. + + === ao_cmd_white + + .... + void + ao_cmd_white(void) + .... + + This skips whitespace by calling ao_cmd_lex while + ao_cmd_lex_c is either a space or tab. It does not + skip any characters if ao_cmd_lex_c already non-white. + + === ao_cmd_hex + + .... + void + ao_cmd_hex(void) + .... + + This reads a 16-bit hexadecimal value from the command + line with optional leading whitespace. The resulting + value is stored in ao_cmd_lex_i; + + === ao_cmd_decimal + + .... + void + ao_cmd_decimal(void) + .... + + This reads a 32-bit decimal value from the command + line with optional leading whitespace. The resulting + value is stored in ao_cmd_lex_u32 and the low 16 bits + are stored in ao_cmd_lex_i; + + === ao_match_word + + .... + uint8_t + ao_match_word(__code char *word) + .... + + This checks to make sure that 'word' occurs on the + command line. It does not skip leading white space. If + 'word' is found, then 1 is returned. Otherwise, + ao_cmd_status is set to ao_cmd_syntax_error and 0 is + returned. + + === ao_cmd_init + + .... + void + ao_cmd_init(void + .... + + Initializes the command system, setting up the + built-in commands and adding a task to run the command + processing loop. It should be called by 'main' before + ao_start_scheduler. + +== USB target device + + AltOS contains a full-speed USB target device driver. It can + be programmed to offer any kind of USB target, but to simplify + interactions with a variety of operating systems, AltOS + provides only a single target device profile, that of a USB + modem which has native drivers for Linux, Windows and Mac OS + X. It would be easy to change the code to provide an alternate + target device if necessary. + + To the rest of the system, the USB device looks like a simple + two-way byte stream. It can be hooked into the command line + interface if desired, offering control of the device over the + USB link. Alternatively, the functions can be accessed + directly to provide for USB-specific I/O. + + === ao_usb_flush + + .... + void + ao_usb_flush(void); + .... + + Flushes any pending USB output. This queues an 'IN' + packet to be delivered to the USB host if there is + pending data, or if the last IN packet was full to + indicate to the host that there isn't any more pending + data available. + + === ao_usb_putchar + + .... + void + ao_usb_putchar(char c); + .... + + If there is a pending 'IN' packet awaiting delivery to + the host, this blocks until that has been + fetched. Then, this adds a byte to the pending IN + packet for delivery to the USB host. If the USB packet + is full, this queues the 'IN' packet for delivery. + + === ao_usb_pollchar + + .... + char + ao_usb_pollchar(void); + .... + + If there are no characters remaining in the last 'OUT' + packet received, this returns + AO_READ_AGAIN. Otherwise, it returns the next + character, reporting to the host that it is ready for + more data when the last character is gone. + + === ao_usb_getchar + + .... + char + ao_usb_getchar(void); + .... + + This uses ao_pollchar to receive the next character, + blocking while ao_pollchar returns AO_READ_AGAIN. + + === ao_usb_disable + + .... + void + ao_usb_disable(void); + .... + + This turns off the USB controller. It will no longer + respond to host requests, nor return + characters. Calling any of the i/o routines while the + USB device is disabled is undefined, and likely to + break things. Disabling the USB device when not needed + saves power. + + Note that neither TeleDongle v0.2 nor TeleMetrum v1 + are able to signal to the USB host that they have + disconnected, so after disabling the USB device, it's + likely that the cable will need to be disconnected and + reconnected before it will work again. + + === ao_usb_enable + + .... + void + ao_usb_enable(void); + .... + + This turns the USB controller on again after it has + been disabled. See the note above about needing to + physically remove and re-insert the cable to get the + host to re-initialize the USB link. + + === ao_usb_init + + .... + void + ao_usb_init(void); + .... + + This turns the USB controller on, adds a task to + handle the control end point and adds the usb I/O + functions to the stdio system. Call this from main + before ao_start_scheduler. + +== Serial peripherals + + The CC1111 provides two USART peripherals. AltOS uses one for + asynch serial data, generally to communicate with a GPS + device, and the other for a SPI bus. The UART is configured to + operate in 8-bits, no parity, 1 stop bit framing. The default + configuration has clock settings for 4800, 9600 and 57600 baud + operation. Additional speeds can be added by computing + appropriate clock values. + + To prevent loss of data, AltOS provides receive and transmit + fifos of 32 characters each. + + === ao_serial_getchar + + .... + char + ao_serial_getchar(void); + .... + + Returns the next character from the receive fifo, blocking + until a character is received if the fifo is empty. + + === ao_serial_putchar + + .... + void + ao_serial_putchar(char c); + .... + + Adds a character to the transmit fifo, blocking if the + fifo is full. Starts transmitting characters. + + === ao_serial_drain + + .... + void + ao_serial_drain(void); + .... + + Blocks until the transmit fifo is empty. Used internally + when changing serial speeds. + + === ao_serial_set_speed + + .... + void + ao_serial_set_speed(uint8_t speed); + .... + + Changes the serial baud rate to one of + AO_SERIAL_SPEED_4800, AO_SERIAL_SPEED_9600 or + AO_SERIAL_SPEED_57600. This first flushes the transmit + fifo using ao_serial_drain. + + === ao_serial_init + + .... + void + ao_serial_init(void) + .... + + Initializes the serial peripheral. Call this from 'main' + before jumping to ao_start_scheduler. The default speed + setting is AO_SERIAL_SPEED_4800. + +== CC1111/CC1120/CC1200 Radio peripheral + + === Radio Introduction + + The CC1111, CC1120 and CC1200 radio transceiver sends + and receives digital packets with forward error + correction and detection. The AltOS driver is fairly + specific to the needs of the TeleMetrum and TeleDongle + devices, using it for other tasks may require + customization of the driver itself. There are three + basic modes of operation: + + . Telemetry mode. In this mode, TeleMetrum transmits telemetry + frames at a fixed rate. The frames are of fixed size. This + is strictly a one-way communication from TeleMetrum to + TeleDongle. + + . Packet mode. In this mode, the radio is used to create a + reliable duplex byte stream between TeleDongle and + TeleMetrum. This is an asymmetrical protocol with + TeleMetrum only transmitting in response to a packet sent + from TeleDongle. Thus getting data from TeleMetrum to + TeleDongle requires polling. The polling rate is adaptive, + when no data has been received for a while, the rate slows + down. The packets are checked at both ends and invalid data + are ignored. + + On the TeleMetrum side, the packet link is hooked into the + stdio mechanism, providing an alternate data path for the + command processor. It is enabled when the unit boots up in + 'idle' mode. + + On the TeleDongle side, the packet link is enabled with a + command; data from the stdio package is forwarded over the + packet link providing a connection from the USB command + stream to the remote TeleMetrum device. + + . Radio Direction Finding mode. In this mode, TeleMetrum + constructs a special packet that sounds like an audio tone + when received by a conventional narrow-band FM + receiver. This is designed to provide a beacon to track the + device when other location mechanisms fail. + + === ao_radio_set_telemetry + + .... + void + ao_radio_set_telemetry(void); + .... + + Configures the radio to send or receive telemetry + packets. This includes packet length, modulation scheme and + other RF parameters. It does not include the base frequency + or channel though. Those are set at the time of transmission + or reception, in case the values are changed by the user. + + === ao_radio_set_packet + + .... + void + ao_radio_set_packet(void); + .... + + Configures the radio to send or receive packet data. This + includes packet length, modulation scheme and other RF + parameters. It does not include the base frequency or + channel though. Those are set at the time of transmission or + reception, in case the values are changed by the user. + + === ao_radio_set_rdf + + .... + void + ao_radio_set_rdf(void); + .... + + Configures the radio to send RDF 'packets'. An RDF 'packet' + is a sequence of hex 0x55 bytes sent at a base bit rate of + 2kbps using a 5kHz deviation. All of the error correction + and data whitening logic is turned off so that the resulting + modulation is received as a 1kHz tone by a conventional 70cm + FM audio receiver. + + === ao_radio_idle + + .... + void + ao_radio_idle(void); + .... + + Sets the radio device to idle mode, waiting until it reaches + that state. This will terminate any in-progress transmit or + receive operation. + + === ao_radio_get + + .... + void + ao_radio_get(void); + .... + + Acquires the radio mutex and then configures the radio + frequency using the global radio calibration and channel + values. + + === ao_radio_put + + .... + void + ao_radio_put(void); + .... + + Releases the radio mutex. + + === ao_radio_abort + + .... + void + ao_radio_abort(void); + .... + + Aborts any transmission or reception process by aborting the + associated DMA object and calling ao_radio_idle to terminate + the radio operation. + + === Radio Telemetry + + In telemetry mode, you can send or receive a telemetry + packet. The data from receiving a packet also includes the RSSI + and status values supplied by the receiver. These are added + after the telemetry data. + + ==== ao_radio_send + + .... + void + ao_radio_send(__xdata struct ao_telemetry *telemetry); + .... + + This sends the specific telemetry packet, waiting for the + transmission to complete. The radio must have been set to + telemetry mode. This function calls ao_radio_get() before + sending, and ao_radio_put() afterwards, to correctly + serialize access to the radio device. + + ==== ao_radio_recv + + .... + void + ao_radio_recv(__xdata struct ao_radio_recv *radio); + .... + + This blocks waiting for a telemetry packet to be received. + The radio must have been set to telemetry mode. This + function calls ao_radio_get() before receiving, and + ao_radio_put() afterwards, to correctly serialize access + to the radio device. This returns non-zero if a packet was + received, or zero if the operation was aborted (from some + other task calling ao_radio_abort()). + + === Radio Direction Finding + + In radio direction finding mode, there's just one function to + use + + ==== ao_radio_rdf + + .... + void + ao_radio_rdf(int ms); + .... + + This sends an RDF packet lasting for the specified amount + of time. The maximum length is 1020 ms. + + === Radio Packet Mode + + Packet mode is asymmetrical and is configured at compile time + for either master or slave mode (but not both). The basic I/O + functions look the same at both ends, but the internals are + different, along with the initialization steps. + + ==== ao_packet_putchar + + .... + void + ao_packet_putchar(char c); + .... + + If the output queue is full, this first blocks waiting for + that data to be delivered. Then, queues a character for + packet transmission. On the master side, this will + transmit a packet if the output buffer is full. On the + slave side, any pending data will be sent the next time + the master polls for data. + + ==== ao_packet_pollchar + + .... + char + ao_packet_pollchar(void); + .... + + This returns a pending input character if available, + otherwise returns AO_READ_AGAIN. On the master side, if + this empties the buffer, it triggers a poll for more data. + + ==== ao_packet_slave_start + + .... + void + ao_packet_slave_start(void); + .... + + This is available only on the slave side and starts a task + to listen for packet data. + + ==== ao_packet_slave_stop + + .... + void + ao_packet_slave_stop(void); + .... + + Disables the packet slave task, stopping the radio receiver. + + ==== ao_packet_slave_init + + .... + void + ao_packet_slave_init(void); + .... + + Adds the packet stdio functions to the stdio package so + that when packet slave mode is enabled, characters will + get send and received through the stdio functions. + + ==== ao_packet_master_init + + .... + void + ao_packet_master_init(void); + .... + + Adds the 'p' packet forward command to start packet mode. diff --git a/doc/altos.xsl b/doc/altos.xsl deleted file mode 100644 index 6092dfcb..00000000 --- a/doc/altos.xsl +++ /dev/null @@ -1,1612 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<book> - <title>AltOS</title> - <subtitle>Altos Metrum Operating System</subtitle> - <bookinfo> - <author> - <firstname>Keith</firstname> - <surname>Packard</surname> - </author> - <copyright> - <year>2010</year> - <holder>Keith Packard</holder> - </copyright> - <legalnotice> - <para> - This document is released under the terms of the - <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> - Creative Commons ShareAlike 3.0 - </ulink> - license. - </para> - </legalnotice> - <revhistory> - <revision> - <revnumber>1.1</revnumber> - <date>05 November 2012</date> - <revremark>Portable version</revremark> - </revision> - <revision> - <revnumber>0.1</revnumber> - <date>22 November 2010</date> - <revremark>Initial content</revremark> - </revision> - </revhistory> - </bookinfo> - <chapter> - <title>Overview</title> - <para> - AltOS is a operating system built for a variety of - microcontrollers used in Altus Metrum devices. It has a simple - porting layer for each CPU while providing a convenient - operating enviroment for the developer. AltOS currently - supports three different CPUs: - <itemizedlist> - <listitem> - <para> - STM32L series from ST Microelectronics. This ARM Cortex-M3 - based microcontroller offers low power consumption and a - wide variety of built-in peripherals. Altus Metrum uses - this in the TeleMega, MegaDongle and TeleLCO projects. - </para> - </listitem> - <listitem> - <para> - CC1111 from Texas Instruments. This device includes a - fabulous 10mW digital RF transceiver along with an - 8051-compatible processor core and a range of - peripherals. This is used in the TeleMetrum, TeleMini, - TeleDongle and TeleFire projects which share the need for - a small microcontroller and an RF interface. - </para> - </listitem> - <listitem> - <para> - ATmega32U4 from Atmel. This 8-bit AVR microcontroller is - one of the many used to create Arduino boards. The 32U4 - includes a USB interface, making it easy to connect to - other computers. Altus Metrum used this in prototypes of - the TeleScience and TelePyro boards; those have been - switched to the STM32L which is more capable and cheaper. - </para> - </listitem> - </itemizedlist> - Among the features of AltOS are: - <itemizedlist> - <listitem> - <para>Multi-tasking. While microcontrollers often don't - provide separate address spaces, it's often easier to write - code that operates in separate threads instead of tying - everything into one giant event loop. - </para> - </listitem> - <listitem> - <para>Non-preemptive. This increases latency for thread - switching but reduces the number of places where context - switching can occur. It also simplifies the operating system - design somewhat. Nothing in the target system (rocket flight - control) has tight timing requirements, and so this seems like - a reasonable compromise. - </para> - </listitem> - <listitem> - <para>Sleep/wakeup scheduling. Taken directly from ancient - Unix designs, these two provide the fundemental scheduling - primitive within AltOS. - </para> - </listitem> - <listitem> - <para>Mutexes. As a locking primitive, mutexes are easier to - use than semaphores, at least in my experience. - </para> - </listitem> - <listitem> - <para>Timers. Tasks can set an alarm which will abort any - pending sleep, allowing operations to time-out instead of - blocking forever. - </para> - </listitem> - </itemizedlist> - </para> - <para> - The device drivers and other subsystems in AltOS are - conventionally enabled by invoking their _init() function from - the 'main' function before that calls - ao_start_scheduler(). These functions initialize the pin - assignments, add various commands to the command processor and - may add tasks to the scheduler to handle the device. A typical - main program, thus, looks like: - <programlisting> - void - main(void) - { - ao_clock_init(); - - /* Turn on the LED until the system is stable */ - ao_led_init(LEDS_AVAILABLE); - ao_led_on(AO_LED_RED); - ao_timer_init(); - ao_cmd_init(); - ao_usb_init(); - ao_monitor_init(AO_LED_GREEN, TRUE); - ao_rssi_init(AO_LED_RED); - ao_radio_init(); - ao_packet_slave_init(); - ao_packet_master_init(); - #if HAS_DBG - ao_dbg_init(); - #endif - ao_config_init(); - ao_start_scheduler(); - } - </programlisting> - As you can see, a long sequence of subsystems are initialized - and then the scheduler is started. - </para> - </chapter> - <chapter> - <title>AltOS Porting Layer</title> - <para> - AltOS provides a CPU-independent interface to various common - microcontroller subsystems, including GPIO pins, interrupts, - SPI, I2C, USB and asynchronous serial interfaces. By making - these CPU-independent, device drivers, generic OS and - application code can all be written that work on any supported - CPU. Many of the architecture abstraction interfaces are - prefixed with ao_arch. - </para> - <section> - <title>Low-level CPU operations</title> - <para> - These primitive operations provide the abstraction needed to - run the multi-tasking framework while providing reliable - interrupt delivery. - </para> - <section> - <title>ao_arch_block_interrupts/ao_arch_release_interrupts</title> - <programlisting> - static inline void - ao_arch_block_interrupts(void); - - static inline void - ao_arch_release_interrupts(void); - </programlisting> - <para> - These disable/enable interrupt delivery, they may not - discard any interrupts. Use these for sections of code that - must be atomic with respect to any code run from an - interrupt handler. - </para> - </section> - <section> - <title>ao_arch_save_regs, ao_arch_save_stack, - ao_arch_restore_stack</title> - <programlisting> - static inline void - ao_arch_save_regs(void); - - static inline void - ao_arch_save_stack(void); - - static inline void - ao_arch_restore_stack(void); - </programlisting> - <para> - These provide all of the support needed to switch between - tasks.. ao_arch_save_regs must save all CPU registers to the - current stack, including the interrupt enable - state. ao_arch_save_stack records the current stack location - in the current ao_task structure. ao_arch_restore_stack - switches back to the saved stack, restores all registers and - branches to the saved return address. - </para> - </section> - <section> - <title>ao_arch_wait_interupt</title> - <programlisting> - #define ao_arch_wait_interrupt() - </programlisting> - <para> - This stops the CPU, leaving clocks and interrupts - enabled. When an interrupt is received, this must wake up - and handle the interrupt. ao_arch_wait_interrupt is entered - with interrupts disabled to ensure that there is no gap - between determining that no task wants to run and idling the - CPU. It must sleep the CPU, process interrupts and then - disable interrupts again. If the CPU doesn't have any - reduced power mode, this must at the least allow pending - interrupts to be processed. - </para> - </section> - </section> - <section> - <title>GPIO operations</title> - <para> - These functions provide an abstract interface to configure and - manipulate GPIO pins. - </para> - <section> - <title>GPIO setup</title> - <para> - These macros may be invoked at system initialization time to - configure pins as needed for system operation. One tricky - aspect is that some chips provide direct access to specific - GPIO pins while others only provide access to a whole - register full of pins. To support this, the GPIO macros - provide both port+bit and pin arguments. Simply define the - arguments needed for the target platform and leave the - others undefined. - </para> - <section> - <title>ao_enable_output</title> - <programlisting> - #define ao_enable_output(port, bit, pin, value) - </programlisting> - <para> - Set the specified port+bit (also called 'pin') for output, - initializing to the specified value. The macro must avoid - driving the pin with the opposite value if at all - possible. - </para> - </section> - <section> - <title>ao_enable_input</title> - <programlisting> - #define ao_enable_input(port, bit, mode) - </programlisting> - <para> - Sets the specified port/bit to be an input pin. 'mode' is - a combination of one or more of the following. Note that - some platforms may not support the desired mode. In that - case, the value will not be defined so that the program - will fail to compile. - <itemizedlist> - <listitem> -<para> - AO_EXTI_MODE_PULL_UP. Apply a pull-up to the pin; a - disconnected pin will read as 1. -</para> - </listitem> - <listitem> -<para> - AO_EXTI_MODE_PULL_DOWN. Apply a pull-down to the pin; - a disconnected pin will read as 0. -</para> - </listitem> - <listitem> -<para> - 0. Don't apply either a pull-up or pull-down. A - disconnected pin will read an undetermined value. -</para> - </listitem> - </itemizedlist> - </para> - </section> - </section> - <section> - <title>Reading and writing GPIO pins</title> - <para> - These macros read and write individual GPIO pins. - </para> - <section> - <title>ao_gpio_set</title> - <programlisting> - #define ao_gpio_set(port, bit, pin, value) - </programlisting> - <para> - Sets the specified port/bit or pin to the indicated value - </para> - </section> - <section> - <title>ao_gpio_get</title> - <programlisting> - #define ao_gpio_get(port, bit, pin) - </programlisting> - <para> - Returns either 1 or 0 depending on whether the input to - the pin is high or low. - </para> - </section> - </section> - </section> - </chapter> - <chapter> - <title>Programming the 8051 with SDCC</title> - <para> - The 8051 is a primitive 8-bit processor, designed in the mists - of time in as few transistors as possible. The architecture is - highly irregular and includes several separate memory - spaces. Furthermore, accessing stack variables is slow, and the - stack itself is of limited size. While SDCC papers over the - instruction set, it is not completely able to hide the memory - architecture from the application designer. - </para> - <para> - When built on other architectures, the various SDCC-specific - symbols are #defined as empty strings so they don't affect the compiler. - </para> - <section> - <title>8051 memory spaces</title> - <para> - The __data/__xdata/__code memory spaces below were completely - separate in the original 8051 design. In the cc1111, this - isn't true—they all live in a single unified 64kB address - space, and so it's possible to convert any address into a - unique 16-bit address. SDCC doesn't know this, and so a - 'global' address to SDCC consumes 3 bytes of memory, 1 byte as - a tag indicating the memory space and 2 bytes of offset within - that space. AltOS avoids these 3-byte addresses as much as - possible; using them involves a function call per byte - access. The result is that nearly every variable declaration - is decorated with a memory space identifier which clutters the - code but makes the resulting code far smaller and more - efficient. - </para> - <section> - <title>__data</title> - <para> - The 8051 can directly address these 128 bytes of - memory. This makes them precious so they should be - reserved for frequently addressed values. Oh, just to - confuse things further, the 8 general registers in the - CPU are actually stored in this memory space. There are - magic instructions to 'bank switch' among 4 banks of - these registers located at 0x00 - 0x1F. AltOS uses only - the first bank at 0x00 - 0x07, leaving the other 24 - bytes available for other data. - </para> - </section> - <section> - <title>__idata</title> - <para> - There are an additional 128 bytes of internal memory - that share the same address space as __data but which - cannot be directly addressed. The stack normally - occupies this space and so AltOS doesn't place any - static storage here. - </para> - </section> - <section> - <title>__xdata</title> - <para> - This is additional general memory accessed through a - single 16-bit address register. The CC1111F32 has 32kB - of memory available here. Most program data should live - in this memory space. - </para> - </section> - <section> - <title>__pdata</title> - <para> - This is an alias for the first 256 bytes of __xdata - memory, but uses a shorter addressing mode with - single global 8-bit value for the high 8 bits of the - address and any of several 8-bit registers for the low 8 - bits. AltOS uses a few bits of this memory, it should - probably use more. - </para> - </section> - <section> - <title>__code</title> - <para> - All executable code must live in this address space, but - you can stick read-only data here too. It is addressed - using the 16-bit address register and special 'code' - access opcodes. Anything read-only should live in this space. - </para> - </section> - <section> - <title>__bit</title> - <para> - The 8051 has 128 bits of bit-addressible memory that - lives in the __data segment from 0x20 through - 0x2f. Special instructions access these bits - in a single atomic operation. This isn't so much a - separate address space as a special addressing mode for - a few bytes in the __data segment. - </para> - </section> - <section> - <title>__sfr, __sfr16, __sfr32, __sbit</title> - <para> - Access to physical registers in the device use this mode - which declares the variable name, its type and the - address it lives at. No memory is allocated for these - variables. - </para> - </section> - </section> - <section> - <title>Function calls on the 8051</title> - <para> - Because stack addressing is expensive, and stack space - limited, the default function call declaration in SDCC - allocates all parameters and local variables in static global - memory. Just like fortran. This makes these functions - non-reentrant, and also consume space for parameters and - locals even when they are not running. The benefit is smaller - code and faster execution. - </para> - <section> - <title>__reentrant functions</title> - <para> - All functions which are re-entrant, either due to recursion - or due to a potential context switch while executing, should - be marked as __reentrant so that their parameters and local - variables get allocated on the stack. This ensures that - these values are not overwritten by another invocation of - the function. - </para> - <para> - Functions which use significant amounts of space for - arguments and/or local variables and which are not often - invoked can also be marked as __reentrant. The resulting - code will be larger, but the savings in memory are - frequently worthwhile. - </para> - </section> - <section> - <title>Non __reentrant functions</title> - <para> - All parameters and locals in non-reentrant functions can - have data space decoration so that they are allocated in - __xdata, __pdata or __data space as desired. This can avoid - consuming __data space for infrequently used variables in - frequently used functions. - </para> - <para> - All library functions called by SDCC, including functions - for multiplying and dividing large data types, are - non-reentrant. Because of this, interrupt handlers must not - invoke any library functions, including the multiply and - divide code. - </para> - </section> - <section> - <title>__interrupt functions</title> - <para> - Interrupt functions are declared with with an __interrupt - decoration that includes the interrupt number. SDCC saves - and restores all of the registers in these functions and - uses the 'reti' instruction at the end so that they operate - as stand-alone interrupt handlers. Interrupt functions may - call the ao_wakeup function to wake AltOS tasks. - </para> - </section> - <section> - <title>__critical functions and statements</title> - <para> - SDCC has built-in support for suspending interrupts during - critical code. Functions marked as __critical will have - interrupts suspended for the whole period of - execution. Individual statements may also be marked as - __critical which blocks interrupts during the execution of - that statement. Keeping critical sections as short as - possible is key to ensuring that interrupts are handled as - quickly as possible. AltOS doesn't use this form in shared - code as other compilers wouldn't know what to do. Use - ao_arch_block_interrupts and ao_arch_release_interrupts instead. - </para> - </section> - </section> - </chapter> - <chapter> - <title>Task functions</title> - <para> - This chapter documents how to create, destroy and schedule AltOS tasks. - </para> - <section> - <title>ao_add_task</title> - <programlisting> - void - ao_add_task(__xdata struct ao_task * task, - void (*start)(void), - __code char *name); - </programlisting> - <para> - This initializes the statically allocated task structure, - assigns a name to it (not used for anything but the task - display), and the start address. It does not switch to the - new task. 'start' must not ever return; there is no place - to return to. - </para> - </section> - <section> - <title>ao_exit</title> - <programlisting> - void - ao_exit(void) - </programlisting> - <para> - This terminates the current task. - </para> - </section> - <section> - <title>ao_sleep</title> - <programlisting> - void - ao_sleep(__xdata void *wchan) - </programlisting> - <para> - This suspends the current task until 'wchan' is signaled - by ao_wakeup, or until the timeout, set by ao_alarm, - fires. If 'wchan' is signaled, ao_sleep returns 0, otherwise - it returns 1. This is the only way to switch to another task. - </para> - <para> - Because ao_wakeup wakes every task waiting on a particular - location, ao_sleep should be used in a loop that first checks - the desired condition, blocks in ao_sleep and then rechecks - until the condition is satisfied. If the location may be - signaled from an interrupt handler, the code will need to - block interrupts around the block of code. Here's a complete - example: - <programlisting> - ao_arch_block_interrupts(); - while (!ao_radio_done) - ao_sleep(&ao_radio_done); - ao_arch_release_interrupts(); - </programlisting> - </para> - </section> - <section> - <title>ao_wakeup</title> - <programlisting> - void - ao_wakeup(__xdata void *wchan) - </programlisting> - <para> - Wake all tasks blocked on 'wchan'. This makes them - available to be run again, but does not actually switch - to another task. Here's an example of using this: - <programlisting> - if (RFIF & RFIF_IM_DONE) { - ao_radio_done = 1; - ao_wakeup(&ao_radio_done); - RFIF &= ~RFIF_IM_DONE; - } - </programlisting> - Note that this need not block interrupts as the ao_sleep block - can only be run from normal mode, and so this sequence can - never be interrupted with execution of the other sequence. - </para> - </section> - <section> - <title>ao_alarm</title> - <programlisting> - void - ao_alarm(uint16_t delay); - - void - ao_clear_alarm(void); - </programlisting> - <para> - Schedules an alarm to fire in at least 'delay' ticks. If the - task is asleep when the alarm fires, it will wakeup and - ao_sleep will return 1. ao_clear_alarm resets any pending - alarm so that it doesn't fire at some arbitrary point in the - future. - <programlisting> - ao_alarm(ao_packet_master_delay); - ao_arch_block_interrupts(); - while (!ao_radio_dma_done) - if (ao_sleep(&ao_radio_dma_done) != 0) - ao_radio_abort(); - ao_arch_release_interrupts(); - ao_clear_alarm(); - </programlisting> - In this example, a timeout is set before waiting for - incoming radio data. If no data is received before the - timeout fires, ao_sleep will return 1 and then this code - will abort the radio receive operation. - </para> - </section> - <section> - <title>ao_start_scheduler</title> - <programlisting> - void - ao_start_scheduler(void); - </programlisting> - <para> - This is called from 'main' when the system is all - initialized and ready to run. It will not return. - </para> - </section> - <section> - <title>ao_clock_init</title> - <programlisting> - void - ao_clock_init(void); - </programlisting> - <para> - This initializes the main CPU clock and switches to it. - </para> - </section> - </chapter> - <chapter> - <title>Timer Functions</title> - <para> - AltOS sets up one of the CPU timers to run at 100Hz and - exposes this tick as the fundemental unit of time. At each - interrupt, AltOS increments the counter, and schedules any tasks - waiting for that time to pass, then fires off the sensors to - collect current data readings. Doing this from the ISR ensures - that the values are sampled at a regular rate, independent - of any scheduling jitter. - </para> - <section> - <title>ao_time</title> - <programlisting> - uint16_t - ao_time(void) - </programlisting> - <para> - Returns the current system tick count. Note that this is - only a 16 bit value, and so it wraps every 655.36 seconds. - </para> - </section> - <section> - <title>ao_delay</title> - <programlisting> - void - ao_delay(uint16_t ticks); - </programlisting> - <para> - Suspend the current task for at least 'ticks' clock units. - </para> - </section> - <section> - <title>ao_timer_set_adc_interval</title> - <programlisting> - void - ao_timer_set_adc_interval(uint8_t interval); - </programlisting> - <para> - This sets the number of ticks between ADC samples. If set - to 0, no ADC samples are generated. AltOS uses this to - slow down the ADC sampling rate to save power. - </para> - </section> - <section> - <title>ao_timer_init</title> - <programlisting> - void - ao_timer_init(void) - </programlisting> - <para> - This turns on the 100Hz tick. It is required for any of the - time-based functions to work. It should be called by 'main' - before ao_start_scheduler. - </para> - </section> - </chapter> - <chapter> - <title>AltOS Mutexes</title> - <para> - AltOS provides mutexes as a basic synchronization primitive. Each - mutexes is simply a byte of memory which holds 0 when the mutex - is free or the task id of the owning task when the mutex is - owned. Mutex calls are checked—attempting to acquire a mutex - already held by the current task or releasing a mutex not held - by the current task will both cause a panic. - </para> - <section> - <title>ao_mutex_get</title> - <programlisting> - void - ao_mutex_get(__xdata uint8_t *mutex); - </programlisting> - <para> - Acquires the specified mutex, blocking if the mutex is - owned by another task. - </para> - </section> - <section> - <title>ao_mutex_put</title> - <programlisting> - void - ao_mutex_put(__xdata uint8_t *mutex); - </programlisting> - <para> - Releases the specified mutex, waking up all tasks waiting - for it. - </para> - </section> - </chapter> - <chapter> - <title>DMA engine</title> - <para> - The CC1111 and STM32L both contain a useful bit of extra - hardware in the form of a number of programmable DMA - engines. They can be configured to copy data in memory, or - between memory and devices (or even between two devices). AltOS - exposes a general interface to this hardware and uses it to - handle both internal and external devices. - </para> - <para> - Because the CC1111 and STM32L DMA engines are different, the - interface to them is also different. As the DMA engines are - currently used to implement platform-specific drivers, this - isn't yet a problem. - </para> - <para> - Code using a DMA engine should allocate one at startup - time. There is no provision to free them, and if you run out, - AltOS will simply panic. - </para> - <para> - During operation, the DMA engine is initialized with the - transfer parameters. Then it is started, at which point it - awaits a suitable event to start copying data. When copying data - from hardware to memory, that trigger event is supplied by the - hardware device. When copying data from memory to hardware, the - transfer is usually initiated by software. - </para> - <section> - <title>CC1111 DMA Engine</title> - <section> - <title>ao_dma_alloc</title> - <programlisting> - uint8_t - ao_dma_alloc(__xdata uint8_t *done) - </programlisting> - <para> - Allocate a DMA engine, returning the identifier. 'done' is - cleared when the DMA is started, and then receives the - AO_DMA_DONE bit on a successful transfer or the - AO_DMA_ABORTED bit if ao_dma_abort was called. Note that it - is possible to get both bits if the transfer was aborted - after it had finished. - </para> - </section> - <section> - <title>ao_dma_set_transfer</title> - <programlisting> - void - ao_dma_set_transfer(uint8_t id, - void __xdata *srcaddr, - void __xdata *dstaddr, - uint16_t count, - uint8_t cfg0, - uint8_t cfg1) - </programlisting> - <para> - Initializes the specified dma engine to copy data - from 'srcaddr' to 'dstaddr' for 'count' units. cfg0 and - cfg1 are values directly out of the CC1111 documentation - and tell the DMA engine what the transfer unit size, - direction and step are. - </para> - </section> - <section> - <title>ao_dma_start</title> - <programlisting> - void - ao_dma_start(uint8_t id); - </programlisting> - <para> - Arm the specified DMA engine and await a signal from - either hardware or software to start transferring data. - </para> - </section> - <section> - <title>ao_dma_trigger</title> - <programlisting> - void - ao_dma_trigger(uint8_t id) - </programlisting> - <para> - Trigger the specified DMA engine to start copying data. - </para> - </section> - <section> - <title>ao_dma_abort</title> - <programlisting> - void - ao_dma_abort(uint8_t id) - </programlisting> - <para> - Terminate any in-progress DMA transaction, marking its - 'done' variable with the AO_DMA_ABORTED bit. - </para> - </section> - </section> - <section> - <title>STM32L DMA Engine</title> - <section> - <title>ao_dma_alloc</title> - <programlisting> - uint8_t ao_dma_done[]; - - void - ao_dma_alloc(uint8_t index); - </programlisting> - <para> - Reserve a DMA engine for exclusive use by one - driver. - </para> - </section> - <section> - <title>ao_dma_set_transfer</title> - <programlisting> - void - ao_dma_set_transfer(uint8_t id, - void *peripheral, - void *memory, - uint16_t count, - uint32_t ccr); - </programlisting> - <para> - Initializes the specified dma engine to copy data between - 'peripheral' and 'memory' for 'count' units. 'ccr' is a - value directly out of the STM32L documentation and tells the - DMA engine what the transfer unit size, direction and step - are. - </para> - </section> - <section> - <title>ao_dma_set_isr</title> - <programlisting> - void - ao_dma_set_isr(uint8_t index, void (*isr)(int)) - </programlisting> - <para> - This sets a function to be called when the DMA transfer - completes in lieu of setting the ao_dma_done bits. Use this - when some work needs to be done when the DMA finishes that - cannot wait until user space resumes. - </para> - </section> - <section> - <title>ao_dma_start</title> - <programlisting> - void - ao_dma_start(uint8_t id); - </programlisting> - <para> - Arm the specified DMA engine and await a signal from either - hardware or software to start transferring data. - 'ao_dma_done[index]' is cleared when the DMA is started, and - then receives the AO_DMA_DONE bit on a successful transfer - or the AO_DMA_ABORTED bit if ao_dma_abort was called. Note - that it is possible to get both bits if the transfer was - aborted after it had finished. - </para> - </section> - <section> - <title>ao_dma_done_transfer</title> - <programlisting> - void - ao_dma_done_transfer(uint8_t id); - </programlisting> - <para> - Signals that a specific DMA engine is done being used. This - allows multiple drivers to use the same DMA engine safely. - </para> - </section> - <section> - <title>ao_dma_abort</title> - <programlisting> - void - ao_dma_abort(uint8_t id) - </programlisting> - <para> - Terminate any in-progress DMA transaction, marking its - 'done' variable with the AO_DMA_ABORTED bit. - </para> - </section> - </section> - </chapter> - <chapter> - <title>Stdio interface</title> - <para> - AltOS offers a stdio interface over USB, serial and the RF - packet link. This provides for control of the device locally or - remotely. This is hooked up to the stdio functions by providing - the standard putchar/getchar/flush functions. These - automatically multiplex the available communication channels; - output is always delivered to the channel which provided the - most recent input. - </para> - <section> - <title>putchar</title> - <programlisting> - void - putchar(char c) - </programlisting> - <para> - Delivers a single character to the current console - device. - </para> - </section> - <section> - <title>getchar</title> - <programlisting> - char - getchar(void) - </programlisting> - <para> - Reads a single character from any of the available - console devices. The current console device is set to - that which delivered this character. This blocks until - a character is available. - </para> - </section> - <section> - <title>flush</title> - <programlisting> - void - flush(void) - </programlisting> - <para> - Flushes the current console device output buffer. Any - pending characters will be delivered to the target device. - </para> - </section> - <section> - <title>ao_add_stdio</title> - <programlisting> - void - ao_add_stdio(char (*pollchar)(void), - void (*putchar)(char), - void (*flush)(void)) - </programlisting> - <para> - This adds another console device to the available - list. - </para> - <para> - 'pollchar' returns either an available character or - AO_READ_AGAIN if none is available. Significantly, it does - not block. The device driver must set 'ao_stdin_ready' to - 1 and call ao_wakeup(&ao_stdin_ready) when it receives - input to tell getchar that more data is available, at - which point 'pollchar' will be called again. - </para> - <para> - 'putchar' queues a character for output, flushing if the output buffer is - full. It may block in this case. - </para> - <para> - 'flush' forces the output buffer to be flushed. It may - block until the buffer is delivered, but it is not - required to do so. - </para> - </section> - </chapter> - <chapter> - <title>Command line interface</title> - <para> - AltOS includes a simple command line parser which is hooked up - to the stdio interfaces permitting remote control of the device - over USB, serial or the RF link as desired. Each command uses a - single character to invoke it, the remaining characters on the - line are available as parameters to the command. - </para> - <section> - <title>ao_cmd_register</title> - <programlisting> - void - ao_cmd_register(__code struct ao_cmds *cmds) - </programlisting> - <para> - This registers a set of commands with the command - parser. There is a fixed limit on the number of command - sets, the system will panic if too many are registered. - Each command is defined by a struct ao_cmds entry: - <programlisting> - struct ao_cmds { - char cmd; - void (*func)(void); - const char *help; - }; - </programlisting> - 'cmd' is the character naming the command. 'func' is the - function to invoke and 'help' is a string displayed by the - '?' command. Syntax errors found while executing 'func' - should be indicated by modifying the global ao_cmd_status - variable with one of the following values: - <variablelist> - <varlistentry> - <term>ao_cmd_success</term> - <listitem> - <para> - The command was parsed successfully. There is no - need to assign this value, it is the default. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>ao_cmd_lex_error</term> - <listitem> - <para> - A token in the line was invalid, such as a number - containing invalid characters. The low-level - lexing functions already assign this value as needed. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>ao_syntax_error</term> - <listitem> - <para> - The command line is invalid for some reason other - than invalid tokens. - </para> - </listitem> - </varlistentry> - </variablelist> - </para> - </section> - <section> - <title>ao_cmd_lex</title> - <programlisting> - void - ao_cmd_lex(void); - </programlisting> - <para> - This gets the next character out of the command line - buffer and sticks it into ao_cmd_lex_c. At the end of the - line, ao_cmd_lex_c will get a newline ('\n') character. - </para> - </section> - <section> - <title>ao_cmd_put16</title> - <programlisting> - void - ao_cmd_put16(uint16_t v); - </programlisting> - <para> - Writes 'v' as four hexadecimal characters. - </para> - </section> - <section> - <title>ao_cmd_put8</title> - <programlisting> - void - ao_cmd_put8(uint8_t v); - </programlisting> - <para> - Writes 'v' as two hexadecimal characters. - </para> - </section> - <section> - <title>ao_cmd_white</title> - <programlisting> - void - ao_cmd_white(void) - </programlisting> - <para> - This skips whitespace by calling ao_cmd_lex while - ao_cmd_lex_c is either a space or tab. It does not skip - any characters if ao_cmd_lex_c already non-white. - </para> - </section> - <section> - <title>ao_cmd_hex</title> - <programlisting> - void - ao_cmd_hex(void) - </programlisting> - <para> - This reads a 16-bit hexadecimal value from the command - line with optional leading whitespace. The resulting value - is stored in ao_cmd_lex_i; - </para> - </section> - <section> - <title>ao_cmd_decimal</title> - <programlisting> - void - ao_cmd_decimal(void) - </programlisting> - <para> - This reads a 32-bit decimal value from the command - line with optional leading whitespace. The resulting value - is stored in ao_cmd_lex_u32 and the low 16 bits are stored - in ao_cmd_lex_i; - </para> - </section> - <section> - <title>ao_match_word</title> - <programlisting> - uint8_t - ao_match_word(__code char *word) - </programlisting> - <para> - This checks to make sure that 'word' occurs on the command - line. It does not skip leading white space. If 'word' is - found, then 1 is returned. Otherwise, ao_cmd_status is set to - ao_cmd_syntax_error and 0 is returned. - </para> - </section> - <section> - <title>ao_cmd_init</title> - <programlisting> - void - ao_cmd_init(void - </programlisting> - <para> - Initializes the command system, setting up the built-in - commands and adding a task to run the command processing - loop. It should be called by 'main' before ao_start_scheduler. - </para> - </section> - </chapter> - <chapter> - <title>USB target device</title> - <para> - AltOS contains a full-speed USB target device driver. It can be - programmed to offer any kind of USB target, but to simplify - interactions with a variety of operating systems, AltOS provides - only a single target device profile, that of a USB modem which - has native drivers for Linux, Windows and Mac OS X. It would be - easy to change the code to provide an alternate target device if - necessary. - </para> - <para> - To the rest of the system, the USB device looks like a simple - two-way byte stream. It can be hooked into the command line - interface if desired, offering control of the device over the - USB link. Alternatively, the functions can be accessed directly - to provide for USB-specific I/O. - </para> - <section> - <title>ao_usb_flush</title> - <programlisting> - void - ao_usb_flush(void); - </programlisting> - <para> - Flushes any pending USB output. This queues an 'IN' packet - to be delivered to the USB host if there is pending data, - or if the last IN packet was full to indicate to the host - that there isn't any more pending data available. - </para> - </section> - <section> - <title>ao_usb_putchar</title> - <programlisting> - void - ao_usb_putchar(char c); - </programlisting> - <para> - If there is a pending 'IN' packet awaiting delivery to the - host, this blocks until that has been fetched. Then, this - adds a byte to the pending IN packet for delivery to the - USB host. If the USB packet is full, this queues the 'IN' - packet for delivery. - </para> - </section> - <section> - <title>ao_usb_pollchar</title> - <programlisting> - char - ao_usb_pollchar(void); - </programlisting> - <para> - If there are no characters remaining in the last 'OUT' - packet received, this returns AO_READ_AGAIN. Otherwise, it - returns the next character, reporting to the host that it - is ready for more data when the last character is gone. - </para> - </section> - <section> - <title>ao_usb_getchar</title> - <programlisting> - char - ao_usb_getchar(void); - </programlisting> - <para> - This uses ao_pollchar to receive the next character, - blocking while ao_pollchar returns AO_READ_AGAIN. - </para> - </section> - <section> - <title>ao_usb_disable</title> - <programlisting> - void - ao_usb_disable(void); - </programlisting> - <para> - This turns off the USB controller. It will no longer - respond to host requests, nor return characters. Calling - any of the i/o routines while the USB device is disabled - is undefined, and likely to break things. Disabling the - USB device when not needed saves power. - </para> - <para> - Note that neither TeleDongle nor TeleMetrum are able to - signal to the USB host that they have disconnected, so - after disabling the USB device, it's likely that the cable - will need to be disconnected and reconnected before it - will work again. - </para> - </section> - <section> - <title>ao_usb_enable</title> - <programlisting> - void - ao_usb_enable(void); - </programlisting> - <para> - This turns the USB controller on again after it has been - disabled. See the note above about needing to physically - remove and re-insert the cable to get the host to - re-initialize the USB link. - </para> - </section> - <section> - <title>ao_usb_init</title> - <programlisting> - void - ao_usb_init(void); - </programlisting> - <para> - This turns the USB controller on, adds a task to handle - the control end point and adds the usb I/O functions to - the stdio system. Call this from main before - ao_start_scheduler. - </para> - </section> - </chapter> - <chapter> - <title>Serial peripherals</title> - <para> - The CC1111 provides two USART peripherals. AltOS uses one for - asynch serial data, generally to communicate with a GPS device, - and the other for a SPI bus. The UART is configured to operate - in 8-bits, no parity, 1 stop bit framing. The default - configuration has clock settings for 4800, 9600 and 57600 baud - operation. Additional speeds can be added by computing - appropriate clock values. - </para> - <para> - To prevent loss of data, AltOS provides receive and transmit - fifos of 32 characters each. - </para> - <section> - <title>ao_serial_getchar</title> - <programlisting> - char - ao_serial_getchar(void); - </programlisting> - <para> - Returns the next character from the receive fifo, blocking - until a character is received if the fifo is empty. - </para> - </section> - <section> - <title>ao_serial_putchar</title> - <programlisting> - void - ao_serial_putchar(char c); - </programlisting> - <para> - Adds a character to the transmit fifo, blocking if the - fifo is full. Starts transmitting characters. - </para> - </section> - <section> - <title>ao_serial_drain</title> - <programlisting> - void - ao_serial_drain(void); - </programlisting> - <para> - Blocks until the transmit fifo is empty. Used internally - when changing serial speeds. - </para> - </section> - <section> - <title>ao_serial_set_speed</title> - <programlisting> - void - ao_serial_set_speed(uint8_t speed); - </programlisting> - <para> - Changes the serial baud rate to one of - AO_SERIAL_SPEED_4800, AO_SERIAL_SPEED_9600 or - AO_SERIAL_SPEED_57600. This first flushes the transmit - fifo using ao_serial_drain. - </para> - </section> - <section> - <title>ao_serial_init</title> - <programlisting> - void - ao_serial_init(void) - </programlisting> - <para> - Initializes the serial peripheral. Call this from 'main' - before jumping to ao_start_scheduler. The default speed - setting is AO_SERIAL_SPEED_4800. - </para> - </section> - </chapter> - <chapter> - <title>CC1111 Radio peripheral</title> - <section> - <title>Radio Introduction</title> - <para> - The CC1111 radio transceiver sends and receives digital packets - with forward error correction and detection. The AltOS driver is - fairly specific to the needs of the TeleMetrum and TeleDongle - devices, using it for other tasks may require customization of - the driver itself. There are three basic modes of operation: - <orderedlist> - <listitem> - <para> - Telemetry mode. In this mode, TeleMetrum transmits telemetry - frames at a fixed rate. The frames are of fixed size. This - is strictly a one-way communication from TeleMetrum to - TeleDongle. - </para> - </listitem> - <listitem> - <para> - Packet mode. In this mode, the radio is used to create a - reliable duplex byte stream between TeleDongle and - TeleMetrum. This is an asymmetrical protocol with - TeleMetrum only transmitting in response to a packet sent - from TeleDongle. Thus getting data from TeleMetrum to - TeleDongle requires polling. The polling rate is adaptive, - when no data has been received for a while, the rate slows - down. The packets are checked at both ends and invalid - data are ignored. - </para> - <para> - On the TeleMetrum side, the packet link is hooked into the - stdio mechanism, providing an alternate data path for the - command processor. It is enabled when the unit boots up in - 'idle' mode. - </para> - <para> - On the TeleDongle side, the packet link is enabled with a - command; data from the stdio package is forwarded over the - packet link providing a connection from the USB command - stream to the remote TeleMetrum device. - </para> - </listitem> - <listitem> - <para> - Radio Direction Finding mode. In this mode, TeleMetrum - constructs a special packet that sounds like an audio tone - when received by a conventional narrow-band FM - receiver. This is designed to provide a beacon to track - the device when other location mechanisms fail. - </para> - </listitem> - </orderedlist> - </para> - </section> - <section> - <title>ao_radio_set_telemetry</title> - <programlisting> - void - ao_radio_set_telemetry(void); - </programlisting> - <para> - Configures the radio to send or receive telemetry - packets. This includes packet length, modulation scheme and - other RF parameters. It does not include the base frequency - or channel though. Those are set at the time of transmission - or reception, in case the values are changed by the user. - </para> - </section> - <section> - <title>ao_radio_set_packet</title> - <programlisting> - void - ao_radio_set_packet(void); - </programlisting> - <para> - Configures the radio to send or receive packet data. This - includes packet length, modulation scheme and other RF - parameters. It does not include the base frequency or - channel though. Those are set at the time of transmission or - reception, in case the values are changed by the user. - </para> - </section> - <section> - <title>ao_radio_set_rdf</title> - <programlisting> - void - ao_radio_set_rdf(void); - </programlisting> - <para> - Configures the radio to send RDF 'packets'. An RDF 'packet' - is a sequence of hex 0x55 bytes sent at a base bit rate of - 2kbps using a 5kHz deviation. All of the error correction - and data whitening logic is turned off so that the resulting - modulation is received as a 1kHz tone by a conventional 70cm - FM audio receiver. - </para> - </section> - <section> - <title>ao_radio_idle</title> - <programlisting> - void - ao_radio_idle(void); - </programlisting> - <para> - Sets the radio device to idle mode, waiting until it reaches - that state. This will terminate any in-progress transmit or - receive operation. - </para> - </section> - <section> - <title>ao_radio_get</title> - <programlisting> - void - ao_radio_get(void); - </programlisting> - <para> - Acquires the radio mutex and then configures the radio - frequency using the global radio calibration and channel - values. - </para> - </section> - <section> - <title>ao_radio_put</title> - <programlisting> - void - ao_radio_put(void); - </programlisting> - <para> - Releases the radio mutex. - </para> - </section> - <section> - <title>ao_radio_abort</title> - <programlisting> - void - ao_radio_abort(void); - </programlisting> - <para> - Aborts any transmission or reception process by aborting the - associated DMA object and calling ao_radio_idle to terminate - the radio operation. - </para> - </section> - <section> - <title>Radio Telemetry</title> - <para> - In telemetry mode, you can send or receive a telemetry - packet. The data from receiving a packet also includes the RSSI - and status values supplied by the receiver. These are added - after the telemetry data. - </para> - <section> - <title>ao_radio_send</title> - <programlisting> - void - ao_radio_send(__xdata struct ao_telemetry *telemetry); - </programlisting> - <para> - This sends the specific telemetry packet, waiting for the - transmission to complete. The radio must have been set to - telemetry mode. This function calls ao_radio_get() before - sending, and ao_radio_put() afterwards, to correctly - serialize access to the radio device. - </para> - </section> - <section> - <title>ao_radio_recv</title> - <programlisting> - void - ao_radio_recv(__xdata struct ao_radio_recv *radio); - </programlisting> - <para> - This blocks waiting for a telemetry packet to be received. - The radio must have been set to telemetry mode. This - function calls ao_radio_get() before receiving, and - ao_radio_put() afterwards, to correctly serialize access - to the radio device. This returns non-zero if a packet was - received, or zero if the operation was aborted (from some - other task calling ao_radio_abort()). - </para> - </section> - </section> - <section> - <title>Radio Direction Finding</title> - <para> - In radio direction finding mode, there's just one function to - use - </para> - <section> - <title>ao_radio_rdf</title> - <programlisting> - void - ao_radio_rdf(int ms); - </programlisting> - <para> - This sends an RDF packet lasting for the specified amount - of time. The maximum length is 1020 ms. - </para> - </section> - </section> - <section> - <title>Radio Packet Mode</title> - <para> - Packet mode is asymmetrical and is configured at compile time - for either master or slave mode (but not both). The basic I/O - functions look the same at both ends, but the internals are - different, along with the initialization steps. - </para> - <section> - <title>ao_packet_putchar</title> - <programlisting> - void - ao_packet_putchar(char c); - </programlisting> - <para> - If the output queue is full, this first blocks waiting for - that data to be delivered. Then, queues a character for - packet transmission. On the master side, this will - transmit a packet if the output buffer is full. On the - slave side, any pending data will be sent the next time - the master polls for data. - </para> - </section> - <section> - <title>ao_packet_pollchar</title> - <programlisting> - char - ao_packet_pollchar(void); - </programlisting> - <para> - This returns a pending input character if available, - otherwise returns AO_READ_AGAIN. On the master side, if - this empties the buffer, it triggers a poll for more data. - </para> - </section> - <section> - <title>ao_packet_slave_start</title> - <programlisting> - void - ao_packet_slave_start(void); - </programlisting> - <para> - This is available only on the slave side and starts a task - to listen for packet data. - </para> - </section> - <section> - <title>ao_packet_slave_stop</title> - <programlisting> - void - ao_packet_slave_stop(void); - </programlisting> - <para> - Disables the packet slave task, stopping the radio receiver. - </para> - </section> - <section> - <title>ao_packet_slave_init</title> - <programlisting> - void - ao_packet_slave_init(void); - </programlisting> - <para> - Adds the packet stdio functions to the stdio package so - that when packet slave mode is enabled, characters will - get send and received through the stdio functions. - </para> - </section> - <section> - <title>ao_packet_master_init</title> - <programlisting> - void - ao_packet_master_init(void); - </programlisting> - <para> - Adds the 'p' packet forward command to start packet mode. - </para> - </section> - </section> - </chapter> -</book> diff --git a/doc/altosdroid.inc b/doc/altosdroid.inc new file mode 100644 index 00000000..cdf7b96d --- /dev/null +++ b/doc/altosdroid.inc @@ -0,0 +1,369 @@ +== AltosDroid + + AltosDroid provides the same flight monitoring capabilities as + AltosUI, but runs on Android devices. AltosDroid is designed + to connect to a TeleBT receiver over Bluetooth™ and (on + Android devices supporting USB On-the-go) TeleDongle and + TeleBT devices over USB. AltosDroid monitors telemetry data, + logging it to internal storage in the Android device, and + presents that data in a UI similar to the 'Monitor Flight' + window in AltosUI. + + This manual will explain how to configure AltosDroid, connect + to TeleBT or TeleDongle, operate the flight monitoring + interface and describe what the displayed data means. + + === Installing AltosDroid + + AltosDroid is available from the Google Play store. To + install it on your Android device, open the Google + Play Store application and search for + “altosdroid”. Make sure you don't have a space between + “altos” and “droid” or you probably won't find what + you want. That should bring you to the right page from + which you can download and install the application. + + === Charging TeleBT Battery + + Before using TeleBT with AltosDroid, make sure the + internal TeleBT battery is charged. To do this, + attach a micro USB cable from a computer or other USB + power source to TeleBT. A dual LED on the circuit + board should illuminate, showing red while the battery + is charging, green when charging is completed, and + both red and green on at the same time if there is a + battery fault. + + === Connecting to TeleBT over Bluetooth™ + + Press the Android 'Menu' button or soft-key to see the + configuration options available. Select the 'Connect a + device' option and then the 'Scan for devices' entry + at the bottom to look for your TeleBT device. Select + your device, and when it asks for the code, enter + '1234'. + + Subsequent connections will not require you to enter + that code, and your 'paired' device will appear in the + list without scanning. + + === Connecting to TeleDongle or TeleBT over USB + + Get a special USB On-the-go adapter cable. These + cables have a USB micro-B male connector on one end + and a standard A female connector on the other + end. Plug in your TeleDongle or TeleBT device to the + adapter cable and the adapter cable into your phone + and AltosDroid should automatically start up. If it + doesn't, the most likely reason is that your Android + device doesn't support USB On-the-go. + + === Configuring AltosDroid + + There are several configuration and operation + parameters available in the AltosDroid menu. + + Select radio frequency:: + + This selects which frequency to listen on by bringing + up a menu of pre-set radio frequencies. Pick the one + which matches your altimeter. + + Select data rate:: + + Altus Metrum transmitters can be configured to operate + at lower data rates to improve transmission range. If + you have configured your device to do this, this menu + item allows you to change the receiver to match. + + Change units:: + + This toggles between metric and imperial units. + + Load maps:: + + Brings up a dialog allowing you to download offline + map tiles so that you can have maps available even if + you have no network connectivity at the launch site. + + Map type:: + + Displays a menu of map types and lets you select + one. Hybrid maps include satellite images with a + roadmap overlaid. Satellite maps dispense with the + roadmap overlay. Roadmap shows just the roads. Terrain + includes roads along with shadows indicating changes + in elevation, and other geographical features. + + Toggle Online/Offline maps:: + + Switches between online and offline maps. Online maps + will show a 'move to current position' icon in the + upper right corner, while offline maps will have + copyright information all over the map. Otherwise, + they're pretty similar. + + Select Tracker:: + + Switches the information displays to show data for a + different transmitting device. The map will always + show all of the devices in view. Trackers are shown + and selected by serial number, so make sure you note + the serial number of devices in each airframe. + + Delete Track:: + + Deletes all information about a transmitting device. + + === AltosDroid Flight Monitoring + + AltosDroid is designed to mimic the AltosUI flight + monitoring display, providing separate tabs for each + stage of your rocket flight along with a tab + containing a map of the local area with icons marking + the current location of the altimeter and the Android + device. + + === Pad + + The 'Pad' tab shows information used to decide when + the rocket is ready for flight. The first elements + include red/green indicators, if any of these is red, + you'll want to evaluate whether the rocket is ready to + launch. + + When the pad tab is selected, the voice responses will + include status changes to the igniters and GPS + reception, letting you know if the rocket is still + ready for launch. + + Battery:: + + This indicates whether the Li-Po battery powering the + transmitter has sufficient charge to last for the + duration of the flight. A value of more than 3.8V is + required for a 'GO' status. + + Receiver Battery:: + + This indicates whether the Li-Po battery powering the + TeleBT has sufficient charge to last for the duration + of the flight. A value of more than 3.8V is required + for a 'GO' status. + + Data Logging:: + + This indicates whether there is space remaining + on-board to store flight data for the upcoming + flight. If you've downloaded data, but failed to erase + flights, there may not be any space left. TeleMetrum + and TeleMega can store multiple flights, depending on + the configured maximum flight log size. TeleGPS logs + data continuously. TeleMini stores only a single + flight, so it will need to be downloaded and erased + after each flight to capture data. This only affects + on-board flight logging; the altimeter will still + transmit telemetry and fire ejection charges at the + proper times. + + GPS Locked:: + + For a TeleMetrum or TeleMega device, this indicates + whether the GPS receiver is currently able to compute + position information. GPS requires at least 4 + satellites to compute an accurate position. + + GPS Ready:: + + For a TeleMetrum or TeleMega device, this indicates + whether GPS has reported at least 10 consecutive + positions without losing lock. This ensures that the + GPS receiver has reliable reception from the + satellites. + + Apogee Igniter:: + + This indicates whether the apogee igniter has + continuity. If the igniter has a low resistance, then + the voltage measured here will be close to the Li-Po + battery voltage. A value greater than 3.2V is required + for a 'GO' status. + + Main Igniter:: + + This indicates whether the main igniter has + continuity. If the igniter has a low resistance, then + the voltage measured here will be close to the Li-Po + battery voltage. A value greater than 3.2V is required + for a 'GO' status. + + Igniter A-D:: + + This indicates whether the indicated additional pyro + channel igniter has continuity. If the igniter has a + low resistance, then the voltage measured here will be + close to the Li-Po battery voltage. A value greater + than 3.2V is required for a 'GO' status. + + The Pad tab also shows the location of the Android + device. + + === Flight + + The 'Flight' tab shows information used to evaluate + and spot a rocket while in flight. It displays speed + and height data to monitor the health of the rocket, + along with elevation, range and bearing to help locate + the rocket in the sky. + + While the Flight tab is displayed, the voice + announcements will include current speed, height, + elevation and bearing information. + + Speed:: + + Shows current vertical speed. During descent, the + speed values are averaged over a fairly long time to + try and make them steadier. + + Height:: + + Shows the current height above the launch pad. + + Max Speed:: + + Shows the maximum vertical speed seen during the + flight. + + Max Height:: + + Shows the maximum height above launch pad. + + Elevation:: + + This is the angle above the horizon from the android + devices current position. + + Range:: + + The total distance from the android device to the + rocket, including both ground distance and difference + in altitude. Use this to gauge how large the rocket is + likely to appear in the sky. + + Bearing:: + + This is the aziumuth from true north for the rocket + from the android device. Use this in combination with + the Elevation value to help locate the rocket in the + sky, or at least to help point the antenna in the + general direction. This is provided in both degrees + and a compass point (like West South West). You'll + want to know which direction is true north before + launching your rocket. + + Ground Distance:: + + This shows the distance across the ground to the + lat/lon where the rocket is located. Use this to + estimate what is currently under the rocket. + + Latitude/Longitude:: + + Displays the last known location of the rocket. + + Apogee Igniter:: + + This indicates whether the apogee igniter has + continuity. If the igniter has a low resistance, then + the voltage measured here will be close to the Li-Po + battery voltage. A value greater than 3.2V is required + for a 'GO' status. + + Main Igniter:: + + This indicates whether the main igniter has + continuity. If the igniter has a low resistance, then + the voltage measured here will be close to the Li-Po + battery voltage. A value greater than 3.2V is required + for a 'GO' status. + + === Recover + + The 'Recover' tab shows information used while + recovering the rocket on the ground after flight. + + While the Recover tab is displayed, the voice + announcements will include distance along with either + bearing or direction, depending on whether you are + moving. + + Bearing:: + + This is the aziumuth from true north for the rocket + from the android device. Use this in combination with + the Elevation value to help locate the rocket in the + sky, or at least to help point the antenna in the + general direction. This is provided in both degrees + and a compass point (like West South West). You'll + want to know which direction is true north before + launching your rocket. + + Direction:: + + When you are in motion, this provides the angle from + your current direction of motion towards the rocket. + + Distance:: + + Distance over the ground to the rocket. + + Tar Lat/Tar Lon:: + + Displays the last known location of the rocket. + + My Lat/My Lon:: + + Displays the location of the Android device. + + Max Height:: + + Shows the maximum height above launch pad. + + Max Speed:: + + Shows the maximum vertical speed seen during the + flight. + + Max Accel:: + + Shows the maximum vertical acceleration seen during + the flight. + + === Map + + The 'Map' tab shows a map of the area around the + rocket being tracked along with information needed to + recover it. + + On the map itself, icons showing the location of the + android device along with the last known location of + each tracker. A blue line is drawn from the android + device location to the currently selected tracker. + + Below the map, the distance and either bearing or + direction along with the lat/lon of the target and the + android device are shown + + The Map tab provides the same voice announcements as + the Recover tab. + + === Downloading Flight Logs + + AltosDroid always saves every bit of telemetry data it + receives. To download that to a computer for use with + AltosUI, remove the SD card from your Android device, + or connect your device to your computer's USB port and + browse the files on that device. You will find + '.telem' files in the TeleMetrum directory that will + work with AltosUI directly. diff --git a/doc/altosui.inc b/doc/altosui.inc new file mode 100644 index 00000000..76a24d91 --- /dev/null +++ b/doc/altosui.inc @@ -0,0 +1,682 @@ +== AltosUI + + .AltosUI Main Window + image::altosui.png[width="4.6in"] + + The AltosUI program provides a graphical user interface for + interacting with the Altus Metrum product family. AltosUI can + monitor telemetry data, configure devices and many other + tasks. The primary interface window provides a selection of + buttons, one for each major activity in the system. This + chapter is split into sections, each of which documents one of + the tasks provided from the top-level toolbar. + + ifdef::radio[] + === Monitor Flight + //// + <subtitle>Receive, Record and Display Telemetry Data</subtitle> + //// + + Selecting this item brings up a dialog box listing all + of the connected TeleDongle devices. When you choose + one of these, AltosUI will create a window to display + telemetry data as received by the selected TeleDongle + device. + + .Device Selection Dialog + image::device-selection.png[width="3.1in"] + + All telemetry data received are automatically recorded + in suitable log files. The name of the files includes + the current date and rocket serial and flight numbers. + + The radio frequency being monitored by the TeleDongle + device is displayed at the top of the window. You can + configure the frequency by clicking on the frequency + box and selecting the desired frequency. AltosUI + remembers the last frequency selected for each + TeleDongle and selects that automatically the next + time you use that device. + + Below the TeleDongle frequency selector, the window + contains a few significant pieces of information about + the altimeter providing the telemetry data stream: + + * The configured call-sign + + * The device serial number + + * The flight number. Each altimeter remembers how + many times it has flown. + + * The rocket flight state. Each flight passes through + several states including Pad, Boost, Fast, Coast, + Drogue, Main and Landed. + + * The Received Signal Strength Indicator value. This + lets you know how strong a signal TeleDongle is + receiving. At the default data rate, 38400 bps, in + bench testing, the radio inside TeleDongle v0.2 + operates down to about -106dBm, while the v3 radio + works down to about -111dBm. Weaker signals, or an + environment with radio noise may cause the data to + not be received. The packet link uses error + detection and correction techniques which prevent + incorrect data from being reported. + + * The age of the displayed data, in seconds since the + last successfully received telemetry packet. In + normal operation this will stay in the low single + digits. If the number starts counting up, then you + are no longer receiving data over the radio link + from the flight computer. + + Finally, the largest portion of the window contains a + set of tabs, each of which contain some information + about the rocket. They're arranged in 'flight order' + so that as the flight progresses, the selected tab + automatically switches to display data relevant to the + current state of the flight. You can select other tabs + at any time. The final 'table' tab displays all of the + raw telemetry values in one place in a + spreadsheet-like format. + + ==== Launch Pad + + .Monitor Flight Launch Pad View + image::launch-pad.png[width="5.5in"] + + The 'Launch Pad' tab shows information used to decide when the + rocket is ready for flight. The first elements include red/green + indicators, if any of these is red, you'll want to evaluate + whether the rocket is ready to launch: + + Battery Voltage:: + This indicates whether the Li-Po battery powering the + flight computer has sufficient charge to last for + the duration of the flight. A value of more than + 3.8V is required for a 'GO' status. + + Apogee Igniter Voltage:: + This indicates whether the apogee + igniter has continuity. If the igniter has a low + resistance, then the voltage measured here will be close + to the Li-Po battery voltage. A value greater than 3.2V is + required for a 'GO' status. + + Main Igniter Voltage:: + This indicates whether the main + igniter has continuity. If the igniter has a low + resistance, then the voltage measured here will be close + to the Li-Po battery voltage. A value greater than 3.2V is + required for a 'GO' status. + + On-board Data Logging:: + This indicates whether there is space remaining + on-board to store flight data for the upcoming + flight. If you've downloaded data, but failed to erase + flights, there may not be any space left. Most of our + flight computers can store multiple flights, depending + on the configured maximum flight log size. TeleMini + v1.0 stores only a single flight, so it will need to + be downloaded and erased after each flight to capture + data. This only affects on-board flight logging; the + altimeter will still transmit telemetry and fire + ejection charges at the proper times even if the + flight data storage is full. + + GPS Locked:: + For a TeleMetrum or TeleMega device, this indicates + whether the GPS receiver is currently able to compute + position information. GPS requires at least 4 + satellites to compute an accurate position. + + GPS Ready:: + + For a TeleMetrum or TeleMega device, this indicates + whether GPS has reported at least 10 consecutive + positions without losing lock. This ensures that the + GPS receiver has reliable reception from the + satellites. + + The Launchpad tab also shows the computed launch pad + position and altitude, averaging many reported + positions to improve the accuracy of the fix. + + ==== Ascent + + .Monitor Flight Ascent View + image::ascent.png[width="5.5in"] + + This tab is shown during Boost, Fast and Coast + phases. The information displayed here helps monitor the + rocket as it heads towards apogee. + + The height, speed, acceleration and tilt are shown along + with the maximum values for each of them. This allows you to + quickly answer the most commonly asked questions you'll hear + during flight. + + The current latitude and longitude reported by the GPS are + also shown. Note that under high acceleration, these values + may not get updated as the GPS receiver loses position + fix. Once the rocket starts coasting, the receiver should + start reporting position again. + + Finally, the current igniter voltages are reported as in the + Launch Pad tab. This can help diagnose deployment failures + caused by wiring which comes loose under high acceleration. + + ==== Descent + + .Monitor Flight Descent View + image::descent.png[width="5.5in"] + + Once the rocket has reached apogee and (we hope) + activated the apogee charge, attention switches to + tracking the rocket on the way back to the ground, and + for dual-deploy flights, waiting for the main charge + to fire. + + To monitor whether the apogee charge operated + correctly, the current descent rate is reported along + with the current height. Good descent rates vary based + on the choice of recovery components, but generally + range from 15-30m/s on drogue and should be below + 10m/s when under the main parachute in a dual-deploy + flight. + + With GPS-equipped flight computers, you can locate the + rocket in the sky using the elevation and bearing + information to figure out where to look. Elevation is + in degrees above the horizon. Bearing is reported in + degrees relative to true north. Range can help figure + out how big the rocket will appear. Ground Distance + shows how far it is to a point directly under the + rocket and can help figure out where the rocket is + likely to land. Note that all of these values are + relative to the pad location. If the elevation is near + 90°, the rocket is over the pad, not over you. + + Finally, the igniter voltages are reported in this tab + as well, both to monitor the main charge as well as to + see what the status of the apogee charge is. Note + that some commercial e-matches are designed to retain + continuity even after being fired, and will continue + to show as green or return from red to green after + firing. + + ==== Landed + + .Monitor Flight Landed View + image::landed.png[width="5.5in"] + + Once the rocket is on the ground, attention switches + to recovery. While the radio signal is often lost once + the rocket is on the ground, the last reported GPS + position is generally within a short distance of the + actual landing location. + + The last reported GPS position is reported both by + latitude and longitude as well as a bearing and + distance from the launch pad. The distance should give + you a good idea of whether to walk or hitch a ride. + Take the reported latitude and longitude and enter + them into your hand-held GPS unit and have that + compute a track to the landing location. + + Our flight computers will continue to transmit RDF + tones after landing, allowing you to locate the rocket + by following the radio signal if necessary. You may + need to get away from the clutter of the flight line, + or even get up on a hill (or your neighbor's RV roof) + to receive the RDF signal. + + The maximum height, speed and acceleration reported + during the flight are displayed for your admiring + observers. The accuracy of these immediate values + depends on the quality of your radio link and how many + packets were received. Recovering the on-board data + after flight may yield more precise results. + + To get more detailed information about the flight, you + can click on the 'Graph Flight' button which will + bring up a graph window for the current flight. + + ==== Table + + .Monitor Flight Table View + image::table.png[width="5.5in"] + + The table view shows all of the data available from the + flight computer. Probably the most useful data on + this tab is the detailed GPS information, which includes + horizontal dilution of precision information, and + information about the signal being received from the satellites. + + ==== Site Map + + .Monitor Flight Site Map View + image::site-map.png[width="5.5in"] + + When the TeleMetrum has a GPS fix, the Site Map tab + will map the rocket's position to make it easier for + you to locate the rocket, both while it is in the air, + and when it has landed. The rocket's state is + indicated by color: white for pad, red for boost, pink + for fast, yellow for coast, light blue for drogue, + dark blue for main, and black for landed. + + The map's default scale is approximately 3m (10ft) per + pixel. The map can be dragged using the left mouse + button. The map will attempt to keep the rocket + roughly centered while data is being received. + + You can adjust the style of map and the zoom level + with buttons on the right side of the map window. You + can draw a line on the map by moving the mouse over + the map with a button other than the left one pressed, + or by pressing the left button while also holding down + the shift key. The length of the line in real-world + units will be shown at the start of the line. + + Images are fetched automatically via the Google Maps + Static API, and cached on disk for reuse. If map + images cannot be downloaded, the rocket's path will be + traced on a dark gray background instead. + + You can pre-load images for your favorite launch sites + before you leave home; check out <<_load_maps>>. + + ==== Igniter + + .Monitor Flight Additional Igniter View + image::ignitor.png[width="5.5in"] + + TeleMega includes four additional programmable pyro + channels. The Ignitor tab shows whether each of them has + continuity. If an ignitor has a low resistance, then the + voltage measured here will be close to the pyro battery + voltage. A value greater than 3.2V is required for a 'GO' + status. + endif::radio[] + + + === Save Flight Data + + The altimeter records flight data to its internal + flash memory. + ifdef::radio[] + Data logged on board is recorded at a much + higher rate than the telemetry system can handle, and + is not subject to radio drop-outs. As such, it + provides a more complete and precise record of the + flight. + endif::radio[] + The 'Save Flight Data' button allows you to + read the flash memory and write it to disk. + + Clicking on the 'Save Flight Data' button brings up a + list of connected flight computers and TeleDongle + devices. If you select a flight computer, the flight + data will be downloaded from that device directly. + ifdef::radio[] + If you select a TeleDongle device, flight data will be + downloaded from a flight computer over radio link via + the specified TeleDongle. See + <<_controlling_an_altimeter_over_the_radio_link>> for + more information. + endif::radio[] + + After the device has been selected, a dialog showing + the flight data saved in the device will be shown + allowing you to select which flights to download and + which to delete. With version 0.9 or newer firmware, + you must erase flights in order for the space they + consume to be reused by another flight. This prevents + accidentally losing flight data if you neglect to + download data before flying again. Note that if there + is no more space available in the device, then no data + will be recorded during the next flight. + + The file name for each flight log is computed + automatically from the recorded flight date, altimeter + serial number and flight number information. + + === Replay Flight + + Select this button and you are prompted to select a flight + record file, either a .telem file recording telemetry data or a + .eeprom file containing flight data saved from the altimeter + flash memory. + + Once a flight record is selected, the flight monitor interface + is displayed and the flight is re-enacted in real + time. + ifdef::radio[] + Check + <<_monitor_flight>> to learn how this window operates. + endif::radio[] + + === Graph Data + + Select this button and you are prompted to select a flight + record file, either a .telem file recording telemetry data or a + .eeprom file containing flight data saved from + flash memory. + + Note that telemetry files will generally produce poor graphs + due to the lower sampling rate and missed telemetry packets. + Use saved flight data in .eeprom files for graphing where possible. + + Once a flight record is selected, a window with multiple tabs is + opened. + + ==== Flight Graph + + .Flight Data Graph + image::graph.png[width="5.5in"] + + By default, the graph contains acceleration (blue), + velocity (green) and altitude (red). + + The graph can be zoomed into a particular area by + clicking and dragging down and to the right. Once + zoomed, the graph can be reset by clicking and + dragging up and to the left. Holding down control and + clicking and dragging allows the graph to be panned. + The right mouse button causes a pop-up menu to be + displayed, giving you the option save or print the + plot. + + ==== Configure Graph + + .Flight Graph Configuration + image::graph-configure.png[width="5.5in"] + + This selects which graph elements to show, and, at the + very bottom, lets you switch between metric and + imperial units + + ==== Flight Statistics + + .Flight Statistics + image::graph-stats.png[width="5.5in"] + + Shows overall data computed from the flight. + + ifdef::gps[] + ==== Map + + .Flight Map + image::graph-map.png[width="5.5in"] + + Shows a satellite image of the flight area overlaid + with the path of the flight. The red concentric + circles mark the launch pad, the black concentric + circles mark the landing location. + endif::gps[] + + === Export Data + + This tool takes the raw data files and makes them + available for external analysis. When you select this + button, you are prompted to select a flight data file, + which can be either a .eeprom or .telem. The .eeprom + files contain higher resolution and more continuous + data, while .telem files contain receiver signal + strength information. Next, a second dialog appears + which is used to select where to write the resulting + file. + ifdef::gps[] + It has a selector to choose between CSV and KML + file formats. + endif::gps[] + + ==== Comma Separated Value Format + + This is a text file containing the data in a form + suitable for import into a spreadsheet or other + external data analysis tool. The first few lines of + the file contain the version and configuration + information from the altimeter, then there is a single + header line which labels all of the fields. All of + these lines start with a '#' character which many + tools can be configured to skip over. + + The remaining lines of the file contain the data, with + each field separated by a comma and at least one + space. All of the sensor values are converted to + standard units, with the barometric data reported in + both pressure, altitude and height above pad units. + + ifdef::gps[] + ==== Keyhole Markup Language (for Google Earth) + + This is the format used by Google Earth to provide an + overlay within that application. With this, you can + use Google Earth to see the whole flight path + in 3D. + endif::gps[] + + === Configure Altimeter + + .Altimeter Configuration + image::configure-altimeter.png[width="3.6in"] + + ifdef::radio[] + Select this button and then select either an altimeter or + TeleDongle Device from the list provided. Selecting a TeleDongle + device will use the radio link to configure a remote + altimeter. + endif::radio[] + ifndef::radio[] + Select this button and then select an altimeter. + endif::radio[] + + The first few lines of the dialog provide information about the + connected device, including the product name, + software version and hardware serial number. Below that are the + individual configuration entries. + + At the bottom of the dialog, there are four buttons: + + Save:: + This writes any changes to the configuration parameter + block in flash memory. If you don't press this button, + any changes you make will be lost. + + Reset:: + This resets the dialog to the most recently saved + values, erasing any changes you have made. + + Reboot:: + + This reboots the device. Use this to switch from idle + to pad mode by rebooting once the rocket is oriented + for flight, or to confirm changes you think you saved + are really saved. + + Close:: + + This closes the dialog. Any unsaved changes will be + lost. + + The rest of the dialog contains the parameters to be configured. + + include::config-device.raw[] + + + === Configure AltosUI + + .Configure AltosUI Dialog + image::configure-altosui.png[width="2.4in"] + + This button presents a dialog so that you can + configure the AltosUI global settings. + + include::config-ui.raw[] + + ifdef::radio[] + === Configure Groundstation + + .Configure Groundstation Dialog + image::configure-groundstation.png[width="3.1in"] + + Select this button and then select a TeleDongle or + TeleBT Device from the list provided. + + The first few lines of the dialog provide information + about the connected device, including the product + name, software version and hardware serial + number. Below that are the individual configuration + entries. + + Note that TeleDongle and TeleBT don't save any + configuration data, the settings here are recorded on + the local machine in the Java preferences + database. Moving the device to another machine, or + using a different user account on the same machine + will cause settings made here to have no effect. + + At the bottom of the dialog, there are three + buttons: + + Save:: + This writes any changes to the local Java + preferences file. If you don't press this + button, any changes you make will be lost. + + Reset:: + This resets the dialog to the most recently + saved values, erasing any changes you have + made. + + Close:: + This closes the dialog. Any unsaved changes + will be lost. + + The rest of the dialog contains the parameters + to be configured. + + ==== Frequency + + This configures the frequency to use for both + telemetry and packet command mode. Set this + before starting any operation involving packet + command mode so that it will use the right + frequency. Telemetry monitoring mode also + provides a menu to change the frequency, and + that menu also sets the same Java preference + value used here. + + ==== RF Calibration + + The radios in every Altus Metrum device are + calibrated at the factory to ensure that they + transmit and receive on the specified + frequency. To change a TeleDongle or TeleBT's + calibration, you must reprogram the unit + completely, so this entry simply shows the + current value and doesn't allow any changes. + + ==== Telemetry Rate + + This lets you match the telemetry and packet + link rate from the transmitter. If they don't + match, the device won't receive any data. + endif::radio[] + + === Flash Image + + This reprograms Altus Metrum devices with new + firmware. + ifdef::telemetrum,telemini[] + TeleMetrum v1.x, TeleDongle v0.2, TeleMini + and TeleBT are all reprogrammed by using another + similar unit as a programming dongle (pair + programming). + endif::telemetrum,telemini[] + ifdef::telemega,easymega,telemetrum[] + TeleMega, EasyMega, TeleMetrum v2, + EasyMini and TeleDongle v3 are all + endif::telemega,easymega,telemetrum[] + ifndef::telemega,easymega,telemetrum[] + EasyMini is + endif::telemega,easymega,telemetrum[] + programmed directly + over USB (self programming). Please read + the directions for flashing devices in + <<_updating_device_firmware>>. + + === Fire Igniter + + .Fire Igniter Window + image::fire-igniter.png[width="1.2in"] + + This activates the igniter circuits in the flight + computer to help test recovery systems + deployment. + ifdef::radio[] + Because this command can operate over the + Packet Command Link, you can prepare the rocket as for + flight and then test the recovery system without + needing to snake wires inside the air-frame. + endif::radio[] + + Selecting the 'Fire Igniter' button brings up the + usual device selection dialog. Pick the desired + device. This brings up another window which shows the + current continuity test status for all of the pyro + channels. + + Next, select the desired igniter to fire. This will + enable the 'Arm' button. + + Select the 'Arm' button. This enables the 'Fire' + button. The word 'Arm' is replaced by a countdown + timer indicating that you have 10 seconds to press the + 'Fire' button or the system will deactivate, at which + point you start over again at selecting the desired + igniter. + + ifdef::radio[] + === Scan Channels + + .Scan Channels Window + image::scan-channels.png[width="3.2in"] + + This listens for telemetry packets on all of the + configured frequencies, displaying information about + each device it receives a packet from. You can select + which of the baud rates and telemetry formats should + be tried; by default, it only listens at 38400 baud + with the standard telemetry format used in v1.0 and + later firmware. + endif::radio[] + + ifdef::gps[] + include::load-maps.raw[] + endif::gps[] + + ifdef::radio[] + === Monitor Idle + + .Monitor Idle Window + image::monitor-idle.png[width="5.2in"] + + This brings up a dialog similar to the Monitor Flight + UI, except it works with the altimeter in “idle” mode + by sending query commands to discover the current + state rather than listening for telemetry + packets. Because this uses command mode, it needs to + have the TeleDongle and flight computer callsigns + match exactly. If you can receive telemetry, but + cannot manage to run Monitor Idle, then it's very + likely that your callsigns are different in some way. + + You can change the frequency and callsign used to + communicate with the flight computer; they must both + match the configuration in the flight computer + exactly. + endif::radio[] diff --git a/doc/altusmetrum-docinfo.xml b/doc/altusmetrum-docinfo.xml new file mode 100644 index 00000000..63c1e035 --- /dev/null +++ b/doc/altusmetrum-docinfo.xml @@ -0,0 +1,184 @@ +<subtitle>An Owner's Manual for Altus Metrum Rocketry Electronics</subtitle> +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<author> + <firstname>Bob</firstname> + <surname>Finch</surname> +</author> +<author> + <firstname>Anthony</firstname> + <surname>Towns</surname> +</author> +<copyright> + <year>2016</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="../themes/background.png" width="6.0in"/> + </imageobject> +</mediaobject> + +<corpauthor> + <inlinemediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="4in"/> + </imageobject> + </inlinemediaobject> +</corpauthor> + +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> +<revhistory> + <?dbhtml filename="altusmetrum-revhistory.html"?> + <revision> + <revnumber>1.6.2</revnumber> + <date>10 January 2016</date> + <revremark> + Minor release adding TeleMega v2.0 support. + </revremark> + </revision> + <revision> + <revnumber>1.6.1</revnumber> + <date>15 July 2015</date> + <revremark> + Minor release adding TeleBT v3.0 support. + </revremark> + </revision> + <revision> + <revnumber>1.6</revnumber> + <date>8 January 2015</date> + <revremark> + Major release adding TeleDongle v3.0 support. + </revremark> + </revision> + <revision> + <revnumber>1.5</revnumber> + <date>6 September 2014</date> + <revremark> + Major release adding EasyMega support. + </revremark> + </revision> + <revision> + <revnumber>1.4.2</revnumber> + <date>17 August 2014</date> + <revremark> + Minor release fixing some Windows installation bugs. + </revremark> + </revision> + <revision> + <revnumber>1.4.1</revnumber> + <date>20 June 2014</date> + <revremark> + Minor release fixing some installation bugs. + </revremark> + </revision> + <revision> + <revnumber>1.4</revnumber> + <date>15 June 2014</date> + <revremark> + Major release adding TeleGPS support. + </revremark> + </revision> + <revision> + <revnumber>1.3.2</revnumber> + <date>24 January 2014</date> + <revremark> + Bug fixes for TeleMega and AltosUI. + </revremark> + </revision> + <revision> + <revnumber>1.3.1</revnumber> + <date>21 January 2014</date> + <revremark> + Bug fixes for TeleMega and TeleMetrum v2.0 along with a few + small UI improvements. + </revremark> + </revision> + <revision> + <revnumber>1.3</revnumber> + <date>12 November 2013</date> + <revremark> + Updated for software version 1.3. Version 1.3 adds support + for TeleMega, TeleMetrum v2.0 and EasyMini + and fixes bugs in AltosUI and the AltOS firmware. + </revremark> + </revision> + <revision> + <revnumber>1.2.1</revnumber> + <date>21 May 2013</date> + <revremark> + Updated for software version 1.2. Version 1.2 adds support + for TeleBT and AltosDroid. It also adds a few minor features + and fixes bugs in AltosUI and the AltOS firmware. + </revremark> + </revision> + <revision> + <revnumber>1.2</revnumber> + <date>18 April 2013</date> + <revremark> + Updated for software version 1.2. Version 1.2 adds support + for MicroPeak and the MicroPeak USB interface. + </revremark> + </revision> + <revision> + <revnumber>1.1.1</revnumber> + <date>16 September 2012</date> + <revremark> + Updated for software version 1.1.1 Version 1.1.1 fixes a few + bugs found in version 1.1. + </revremark> + </revision> + <revision> + <revnumber>1.1</revnumber> + <date>13 September 2012</date> + <revremark> + Updated for software version 1.1. Version 1.1 has new + features but is otherwise compatible with version 1.0. + </revremark> + </revision> + <revision> + <revnumber>1.0</revnumber> + <date>24 August 2011</date> + <revremark> + Updated for software version 1.0. Note that 1.0 represents a + telemetry format change, meaning both ends of a link + (TeleMetrum/TeleMini and TeleDongle) must be updated or + communications will fail. + </revremark> + </revision> + <revision> + <revnumber>0.9</revnumber> + <date>18 January 2011</date> + <revremark> + Updated for software version 0.9. Note that 0.9 represents a + telemetry format change, meaning both ends of a link (TeleMetrum and + TeleDongle) must be updated or communications will fail. + </revremark> + </revision> + <revision> + <revnumber>0.8</revnumber> + <date>24 November 2010</date> + <revremark>Updated for software version 0.8 </revremark> + </revision> + <revision> + <revnumber>0.7.1</revnumber> + <date>29 September 2010</date> + <revremark>Added AltosUI</revremark> + </revision> +</revhistory> diff --git a/doc/altusmetrum-oneline.svg b/doc/altusmetrum-oneline.svg new file mode 100644 index 00000000..0ed7b6cd --- /dev/null +++ b/doc/altusmetrum-oneline.svg @@ -0,0 +1,354 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + id="svg2" + width="444" + height="98" + version="1.0" + sodipodi:version="0.32" + inkscape:version="0.91 r13725" + sodipodi:docname="altusmetrum-oneline.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/keithp/src/cc1111/altus-logo/bottom.png" + inkscape:export-xdpi="119.89881" + inkscape:export-ydpi="119.89881"> + <metadata + id="metadata14"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs12"> + <linearGradient + id="linearGradient4171"> + <stop + id="stop4173" + offset="0" + style="stop-color:#da7000;stop-opacity:1;" /> + <stop + style="stop-color:#a63852;stop-opacity:1;" + offset="0.24528302" + id="stop4175" /> + <stop + id="stop4177" + offset="1" + style="stop-color:#7200a4;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient3165"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3167" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3169" /> + </linearGradient> + <linearGradient + id="linearGradient3177"> + <stop + style="stop-color:#da7000;stop-opacity:1;" + offset="0" + id="stop3179" /> + <stop + id="stop3447" + offset="0.24528302" + style="stop-color:#a63852;stop-opacity:1;" /> + <stop + style="stop-color:#7200a4;stop-opacity:1;" + offset="1" + id="stop3181" /> + </linearGradient> + <linearGradient + id="linearGradient3169"> + <stop + style="stop-color:#ff8a00;stop-opacity:1;" + offset="0" + id="stop3171" /> + <stop + id="stop3445" + offset="0.71698111" + style="stop-color:#c24573;stop-opacity:0.98039216;" /> + <stop + style="stop-color:#8500e7;stop-opacity:0.96078432;" + offset="1" + id="stop3173" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 121 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="191 : 121 : 1" + inkscape:persp3d-origin="95.5 : 80.666667 : 1" + id="perspective16" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient3175" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3177" + id="linearGradient3183" + x1="170.6575" + y1="110.17125" + x2="614.24878" + y2="110.17125" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient3171" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3177" + id="linearGradient3781" + x1="193.16029" + y1="121.50799" + x2="589.83154" + y2="121.50799" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient3008" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient3010" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient3012" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient3014" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient3016" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient3018" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4171" + id="linearGradient4229" + x1="47.299" + y1="31.709364" + x2="129.17451" + y2="31.709364" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4171" + id="linearGradient4176" + gradientUnits="userSpaceOnUse" + x1="47.299" + y1="31.709364" + x2="129.17451" + y2="31.709364" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4171" + id="linearGradient4178" + gradientUnits="userSpaceOnUse" + x1="47.299" + y1="31.709364" + x2="129.17451" + y2="31.709364" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4171" + id="linearGradient4180" + gradientUnits="userSpaceOnUse" + x1="47.299" + y1="31.709364" + x2="129.17451" + y2="31.709364" /> + </defs> + <sodipodi:namedview + inkscape:cy="-41.854765" + inkscape:cx="115.51489" + inkscape:zoom="1.7366335" + inkscape:window-height="1404" + inkscape:window-width="1799" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + guidetolerance="10.0" + gridtolerance="10.0" + objecttolerance="10.0" + borderopacity="1.0" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + showgrid="false" + inkscape:window-x="343" + inkscape:window-y="171" + inkscape:current-layer="svg2" + inkscape:window-maximized="0" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + units="px" /> + <g + id="g4218" + style="fill:url(#linearGradient4229);fill-opacity:1" + transform="translate(20.153936,16.360317)"> + <path + d="m 59.744607,35.548307 c 6.934865,0 15.789201,4.210453 17.399081,13.126708 0.619184,3.343596 1.362205,5.139231 4.458127,5.139231 2.167146,0 3.715107,-1.733717 3.715107,-4.953475 0,-1.919472 -1.671798,-13.064791 -9.783114,-28.358645 -3.529351,-6.687191 -5.634578,-9.845031 -9.225847,-9.845031 -4.334291,0 -6.315681,3.15784 -9.845032,9.845031 -8.111315,15.293854 -9.163928,26.439173 -9.163928,28.358645 0,2.972085 0.681102,4.953475 4.024698,4.953475 2.229064,0 3.529351,-1.362206 3.777025,-3.653188 0.433429,-4.148535 1.362205,-10.092705 3.034003,-14.612751 l 1.60988,0 z m 0.247673,-6.191844 c 1.60988,-3.838943 3.653188,-7.55405 6.129926,-11.269156 3.034003,4.829638 5.386904,10.030787 7.244457,15.355773 l -0.123837,0.123837 C 69.156209,30.223321 63.831224,29.356463 60.79722,29.356463 l -0.80494,0 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient4176);fill-opacity:1;stroke:none" + id="path3362" + inkscape:connector-curvature="0" /> + <path + d="m 99.370471,13.62918 c 0,-2.229064 -1.17645,-4.0246989 -3.715106,-4.0246989 -2.538656,0 -3.715106,1.7956349 -3.715106,4.0246989 l 0,36.160367 c 0,2.229064 1.17645,4.024699 3.715106,4.024699 2.538656,0 3.715106,-1.795635 3.715106,-4.024699 l 0,-36.160367 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient4178);fill-opacity:1;stroke:none" + id="path3364" + inkscape:connector-curvature="0" /> + <path + d="m 123.29227,28.861115 c 1.98139,0 3.59127,-1.052613 3.59127,-3.343595 0,-2.290983 -1.60988,-3.343596 -3.59127,-3.343596 l -5.44882,0 0,-5.263067 c 0,-2.229064 -1.17645,-4.024699 -3.71511,-4.024699 -2.53865,0 -3.7151,1.795635 -3.7151,4.024699 l 0,5.263067 -2.10523,0 c -2.04331,0 -3.65319,1.052613 -3.65319,3.343596 0,2.290982 1.60988,3.343595 3.65319,3.343595 l 2.10523,0 0,13.374383 c 0,11.392992 4.33429,11.392992 13.74589,11.392992 3.3436,0 5.01539,-1.114531 5.01539,-3.529351 0,-2.414819 -1.67179,-3.52935 -3.77702,-3.52935 l -3.96278,0 c -2.84825,0 -3.59127,-1.733717 -3.59127,-5.448823 l 0,-12.259851 5.44882,0 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient4180);fill-opacity:1;stroke:none" + id="path3366" + inkscape:connector-curvature="0" /> + </g> + <g + id="g4231" + style="fill:#78079a;fill-opacity:1" + transform="translate(20.153936,16.360317)"> + <path + d="m 158.87506,25.827112 c 0,-2.229064 -1.17645,-4.024699 -3.71511,-4.024699 -2.53865,0 -3.7151,1.795635 -3.7151,4.024699 l 0,12.817116 c 0,5.758415 -2.72442,8.668582 -6.93487,8.668582 -3.3436,0 -5.01539,-2.105227 -5.01539,-6.439518 l 0,-15.04618 c 0,-2.229064 -1.17645,-4.024699 -3.71511,-4.024699 -2.53866,0 -3.71511,1.795635 -3.71511,4.024699 l 0,17.02757 c 0,6.315681 4.3343,11.145319 11.02149,11.145319 3.40551,0 5.88225,-0.990695 8.35899,-3.343596 0,1.547961 1.17645,3.343596 3.7151,3.343596 2.53866,0 3.71511,-1.795635 3.71511,-4.024698 l 0,-24.148191 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + id="path3368" + inkscape:connector-curvature="0" /> + <path + d="m 179.78124,53.62849 c 6.99678,0 12.19793,-3.15784 12.19793,-10.649971 0,-13.06479 -19.50431,-8.297071 -19.50431,-12.569443 0,-1.486042 1.54796,-1.547961 2.66249,-1.547961 l 10.83573,0 c 1.98139,0 3.59127,-1.052613 3.59127,-3.343595 0,-2.290983 -1.60988,-3.343596 -3.59127,-3.343596 l -10.4023,0 c -6.81103,0 -10.52613,2.538656 -10.52613,8.173234 0,12.940953 19.50431,6.191844 19.50431,12.569443 0,3.343595 -2.3529,4.024698 -5.32499,4.024698 l -11.14532,0 c -2.04331,0 -3.65319,1.052614 -3.65319,3.343596 0,2.290982 1.60988,3.343595 3.65319,3.343595 l 11.70259,0 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + id="path3370" + inkscape:connector-curvature="0" /> + <path + d="m 216.06544,26.446296 c -2.53866,-3.095922 -4.0247,-7.058702 -6.12993,-12.197932 -0.9907,-2.414819 -2.47674,-3.405514 -4.95348,-3.405514 -4.76771,0 -4.95347,3.653188 -5.94417,9.597358 -1.17645,6.996783 -2.22906,19.132797 -2.22906,26.191499 0,4.334291 0.30959,7.182539 3.83894,7.182539 3.46744,0 3.96278,-2.352901 3.96278,-5.263067 l 0,-9.783114 c 0,-5.386904 0.61919,-10.959563 1.48605,-16.656059 l 0.12383,0 c 0.9907,3.15784 5.51074,13.498219 9.84504,13.498219 4.33429,0 8.85433,-10.340379 9.84503,-13.498219 l 0.12383,0 c 0.86686,5.696496 1.48605,11.269155 1.48605,16.656059 l 0,9.783114 c 0,2.910166 0.49534,5.263067 3.96278,5.263067 3.52935,0 3.83894,-2.848248 3.83894,-7.182539 0,-7.058702 -1.05261,-19.194716 -2.22906,-26.191499 -0.9907,-5.94417 -1.17645,-9.597358 -5.94417,-9.597358 -2.47674,0 -3.96278,0.990695 -4.95348,3.405514 -2.10523,5.13923 -3.59127,9.10201 -6.12992,12.197932 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + id="path3372" + inkscape:connector-curvature="0" /> + <path + d="m 266.81728,53.62849 c 1.98139,0 3.59127,-1.052613 3.59127,-3.343595 0,-2.290982 -1.60988,-3.343596 -3.59127,-3.343596 l -7.98748,0 c -5.20115,0 -9.59735,-1.547961 -10.0927,-7.368294 l 18.94704,0 c 2.60057,0 3.034,-1.547961 3.034,-3.653188 0,-7.244457 -4.27237,-14.117404 -14.61275,-14.117404 -9.47352,0 -15.54153,7.244458 -15.54153,16.532223 0,9.225848 6.19185,15.293854 17.21333,15.293854 l 9.04009,0 z M 249.23245,34.000346 c 0.86685,-3.715107 3.96278,-6.006089 6.87294,-6.006089 2.91017,0 6.00609,2.290982 6.81103,6.006089 l -13.68397,0 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + id="path3374" + inkscape:connector-curvature="0" /> + <path + d="m 291.99582,28.861115 c 1.98139,0 3.59127,-1.052613 3.59127,-3.343595 0,-2.290983 -1.60988,-3.343596 -3.59127,-3.343596 l -5.44882,0 0,-5.263067 c 0,-2.229064 -1.17645,-4.024699 -3.7151,-4.024699 -2.53866,0 -3.71511,1.795635 -3.71511,4.024699 l 0,5.263067 -2.10523,0 c -2.04331,0 -3.65319,1.052613 -3.65319,3.343596 0,2.290982 1.60988,3.343595 3.65319,3.343595 l 2.10523,0 0,13.374383 c 0,11.392992 4.33429,11.392992 13.74589,11.392992 3.3436,0 5.0154,-1.114531 5.0154,-3.529351 0,-2.414819 -1.6718,-3.52935 -3.77703,-3.52935 l -3.96278,0 c -2.84825,0 -3.59127,-1.733717 -3.59127,-5.448823 l 0,-12.259851 5.44882,0 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + id="path3376" + inkscape:connector-curvature="0" /> + <path + d="m 301.26328,49.603792 c 0,2.414819 1.36221,4.210454 3.71511,4.210454 2.3529,0 3.7151,-1.795635 3.7151,-4.210454 l 0,-13.560138 c 0,-5.696496 1.79564,-7.182539 5.44883,-7.182539 2.66249,0 4.27237,-1.114532 4.27237,-3.467432 0,-2.105227 -1.11453,-3.59127 -3.83894,-3.59127 -3.46744,0 -5.82034,1.486043 -6.31568,4.891557 l -0.12384,0 -0.12384,-1.919472 c -0.24767,-2.786329 -1.98139,-2.972085 -3.34359,-2.972085 -2.16715,0 -3.40552,1.238369 -3.40552,3.777025 l 0,24.024354 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + id="path3378" + inkscape:connector-curvature="0" /> + <path + d="m 348.2584,25.827112 c 0,-2.229064 -1.17645,-4.024699 -3.71511,-4.024699 -2.53866,0 -3.71511,1.795635 -3.71511,4.024699 l 0,12.817116 c 0,5.758415 -2.72441,8.668582 -6.93486,8.668582 -3.3436,0 -5.01539,-2.105227 -5.01539,-6.439518 l 0,-15.04618 c 0,-2.229064 -1.17645,-4.024699 -3.71511,-4.024699 -2.53866,0 -3.71511,1.795635 -3.71511,4.024699 l 0,17.02757 c 0,6.315681 4.33429,11.145319 11.02149,11.145319 3.40551,0 5.88225,-0.990695 8.35898,-3.343596 0,1.547961 1.17645,3.343596 3.71511,3.343596 2.53866,0 3.71511,-1.795635 3.71511,-4.024698 l 0,-24.148191 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + id="path3380" + inkscape:connector-curvature="0" /> + <path + d="m 355.79019,49.789547 c 0,2.229064 1.17645,4.024699 3.7151,4.024699 2.53866,0 3.71511,-1.795635 3.71511,-4.024699 l 0,-12.631361 c 0,-5.820333 2.66249,-8.668581 5.94417,-8.668581 4.14853,0 5.01539,3.281677 5.01539,7.554049 l 0,13.745893 c 0,2.229064 1.17645,4.024699 3.71511,4.024699 2.53865,0 3.7151,-1.795635 3.7151,-4.024699 l 0,-12.631361 c 0,-5.820333 2.6625,-8.668581 5.94417,-8.668581 4.14854,0 5.0154,3.281677 5.0154,7.554049 l 0,13.745893 c 0,2.229064 1.17645,4.024699 3.7151,4.024699 2.53866,0 3.71511,-1.795635 3.71511,-4.024699 l 0,-16.841815 c 0,-6.315681 -4.33429,-11.145319 -11.02148,-11.145319 -4.08662,0 -7.30638,2.167146 -9.96887,4.643883 -2.84825,-3.529351 -5.07731,-4.643883 -8.66858,-4.643883 -3.03401,0 -5.6965,1.238369 -7.86364,3.343596 0,-1.733716 -1.05262,-3.343596 -3.3436,-3.343596 -2.29098,0 -3.34359,1.60988 -3.34359,3.59127 l 0,24.395864 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:61.91843796px;line-height:100%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + id="path3382" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(0.02211373,0,0,0.02211373,20.216433,16.77932)" + id="g3" + style="fill:url(#radialGradient3175);fill-opacity:1;stroke:url(#radialGradient3171);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"> + <g + transform="translate(20.61545,-27.69425)" + style="fill:url(#radialGradient3016);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3018);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" + id="g5"> + <path + d="m 931.07168,1164.597 248.86992,-331.80265 416.1687,1338.32935 286.6484,267.1042 -520.4224,0 -270.2797,-262.2181 0,-1033.0627 -160.98492,106.6818 -160.98492,-106.6818 0,1033.0627 -270.2797,262.2181 -520.4224,0 286.6484,-267.1042 416.1687,-1338.32935 248.86992,331.80265 z" + id="path7" + style="fill:url(#radialGradient3008);fill-opacity:1;stroke:url(#radialGradient3010);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:connector-curvature="0" /> + <path + d="m 931.07168,27.69425 224.03682,720.46517 -63.341,76.00913 L 931.07168,486.3269 770.37586,824.16855 707.03486,748.15942 931.07168,27.69425 Z" + id="path9" + style="fill:url(#radialGradient3012);fill-opacity:1;stroke:url(#radialGradient3014);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:connector-curvature="0" /> + </g> + </g> +</svg> diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt new file mode 100644 index 00000000..15fc28fc --- /dev/null +++ b/doc/altusmetrum.txt @@ -0,0 +1,51 @@ += The Altus Metrum System +:doctype: book +:numbered: +:altusmetrum: 1 +:radio: 1 +:gps: 1 +:telemetrum: 1 +:telemini: 1 +:easymini: 1 +:telemega: 1 +:easymega: 1 +:telegps: 1 +:application: AltosUI + + include::dedication.raw[] + + include::intro.raw[] + + include::getting-started.raw[] + + include::usage.raw[] + + include::telemetrum.raw[] + + include::telemini-v1.0.raw[] + + include::easymini-device.raw[] + + include::telemega.raw[] + + include::easymega.raw[] + + include::installation.raw[] + + include::using-am-products.raw[] + + include::altosui.raw[] + + include::altosdroid.raw[] + + include::system-operation.raw[] + + include::handling.raw[] + + include::updating-firmware.raw[] + + include::flight-data-recording.raw[] + + include::specs.raw[] + + include::release-notes.raw[] diff --git a/doc/altusmetrum.xsl b/doc/altusmetrum.xsl deleted file mode 100644 index d1328abf..00000000 --- a/doc/altusmetrum.xsl +++ /dev/null @@ -1,6413 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" - "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> -<book> - <title>The Altus Metrum System</title> - <subtitle>An Owner's Manual for Altus Metrum Rocketry Electronics</subtitle> - <bookinfo> - <author> - <firstname>Bdale</firstname> - <surname>Garbee</surname> - </author> - <author> - <firstname>Keith</firstname> - <surname>Packard</surname> - </author> - <author> - <firstname>Bob</firstname> - <surname>Finch</surname> - </author> - <author> - <firstname>Anthony</firstname> - <surname>Towns</surname> - </author> - <copyright> - <year>2015</year> - <holder>Bdale Garbee and Keith Packard</holder> - </copyright> - <mediaobject> - <imageobject> - <imagedata fileref="../themes/background.png" width="6.0in"/> - </imageobject> - </mediaobject> - <legalnotice> - <para> - This document is released under the terms of the - <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> - Creative Commons ShareAlike 3.0 - </ulink> - license. - </para> - </legalnotice> - <revhistory> - <revision> - <revnumber>1.6.1</revnumber> - <date>15 July 2015</date> - <revremark> - Minor release adding TeleBT v3.0 support. - </revremark> - </revision> - <revision> - <revnumber>1.6</revnumber> - <date>8 January 2015</date> - <revremark> - Major release adding TeleDongle v3.0 support. - </revremark> - </revision> - <revision> - <revnumber>1.5</revnumber> - <date>6 September 2014</date> - <revremark> - Major release adding EasyMega support. - </revremark> - </revision> - <revision> - <revnumber>1.4.1</revnumber> - <date>20 June 2014</date> - <revremark> - Minor release fixing some installation bugs. - </revremark> - </revision> - <revision> - <revnumber>1.4</revnumber> - <date>15 June 2014</date> - <revremark> - Major release adding TeleGPS support. - </revremark> - </revision> - <revision> - <revnumber>1.3.2</revnumber> - <date>24 January 2014</date> - <revremark> - Bug fixes for TeleMega and AltosUI. - </revremark> - </revision> - <revision> - <revnumber>1.3.1</revnumber> - <date>21 January 2014</date> - <revremark> - Bug fixes for TeleMega and TeleMetrum v2.0 along with a few - small UI improvements. - </revremark> - </revision> - <revision> - <revnumber>1.3</revnumber> - <date>12 November 2013</date> - <revremark> - Updated for software version 1.3. Version 1.3 adds support - for TeleMega, TeleMetrum v2.0, TeleMini v2.0 and EasyMini - and fixes bugs in AltosUI and the AltOS firmware. - </revremark> - </revision> - <revision> - <revnumber>1.2.1</revnumber> - <date>21 May 2013</date> - <revremark> - Updated for software version 1.2. Version 1.2 adds support - for TeleBT and AltosDroid. It also adds a few minor features - and fixes bugs in AltosUI and the AltOS firmware. - </revremark> - </revision> - <revision> - <revnumber>1.2</revnumber> - <date>18 April 2013</date> - <revremark> - Updated for software version 1.2. Version 1.2 adds support - for MicroPeak and the MicroPeak USB interface. - </revremark> - </revision> - <revision> - <revnumber>1.1.1</revnumber> - <date>16 September 2012</date> - <revremark> - Updated for software version 1.1.1 Version 1.1.1 fixes a few - bugs found in version 1.1. - </revremark> - </revision> - <revision> - <revnumber>1.1</revnumber> - <date>13 September 2012</date> - <revremark> - Updated for software version 1.1. Version 1.1 has new - features but is otherwise compatible with version 1.0. - </revremark> - </revision> - <revision> - <revnumber>1.0</revnumber> - <date>24 August 2011</date> - <revremark> - Updated for software version 1.0. Note that 1.0 represents a - telemetry format change, meaning both ends of a link - (TeleMetrum/TeleMini and TeleDongle) must be updated or - communications will fail. - </revremark> - </revision> - <revision> - <revnumber>0.9</revnumber> - <date>18 January 2011</date> - <revremark> - Updated for software version 0.9. Note that 0.9 represents a - telemetry format change, meaning both ends of a link (TeleMetrum and - TeleDongle) must be updated or communications will fail. - </revremark> - </revision> - <revision> - <revnumber>0.8</revnumber> - <date>24 November 2010</date> - <revremark>Updated for software version 0.8 </revremark> - </revision> - </revhistory> - </bookinfo> - <dedication> - <title>Acknowledgments</title> - <para> - Thanks to Bob Finch, W9YA, NAR 12965, TRA 12350 for writing “The - Mere-Mortals Quick Start/Usage Guide to the Altus Metrum Starter - Kit” which formed the basis of the original Getting Started chapter - in this manual. Bob was one of our first customers for a production - TeleMetrum, and his continued enthusiasm and contributions - are immensely gratifying and highly appreciated! - </para> - <para> - And thanks to Anthony (AJ) Towns for major contributions including - the AltosUI graphing and site map code and associated documentation. - Free software means that our customers and friends can become our - collaborators, and we certainly appreciate this level of - contribution! - </para> - <para> - Have fun using these products, and we hope to meet all of you - out on the rocket flight line somewhere. - <literallayout> -Bdale Garbee, KB0G -NAR #87103, TRA #12201 - -Keith Packard, KD7SQG -NAR #88757, TRA #12200 - </literallayout> - </para> - </dedication> - <chapter> - <title>Introduction and Overview</title> - <para> - Welcome to the Altus Metrum community! Our circuits and software reflect - our passion for both hobby rocketry and Free Software. We hope their - capabilities and performance will delight you in every way, but by - releasing all of our hardware and software designs under open licenses, - we also hope to empower you to take as active a role in our collective - future as you wish! - </para> - <para> - The first device created for our community was TeleMetrum, a dual - deploy altimeter with fully integrated GPS and radio telemetry - as standard features, and a “companion interface” that will - support optional capabilities in the future. The latest version - of TeleMetrum, v2.0, has all of the same features but with - improved sensors and radio to offer increased performance. - </para> - <para> - Our second device was TeleMini, a dual deploy altimeter with - radio telemetry and radio direction finding. The first version - of this device was only 13mm by 38mm (½ inch by 1½ inches) and - could fit easily in an 18mm air-frame. The latest version, v2.0, - includes a beeper, USB data download and extended on-board - flight logging, along with an improved barometric sensor. - </para> - <para> - TeleMega is our most sophisticated device, including six pyro - channels (four of which are fully programmable), integrated GPS, - integrated gyroscopes for staging/air-start inhibit and high - performance telemetry. - </para> - <para> - EasyMini is a dual-deploy altimeter with logging and built-in - USB data download. - </para> - <para> - EasyMega is essentially a TeleMega board with the GPS receiver - and telemetry transmitter removed. It offers the same 6 pyro - channels and integrated gyroscopes for staging/air-start inhibit. - </para> - <para> - TeleDongle v0.2 was our first ground station, providing a USB to RF - interfaces for communicating with the altimeters. Combined with - your choice of antenna and notebook computer, TeleDongle and our - associated user interface software form a complete ground - station capable of logging and displaying in-flight telemetry, - aiding rocket recovery, then processing and archiving flight - data for analysis and review. The latest version, TeleDongle - v3, has all new electronics with a higher performance radio - for improved range. - </para> - <para> - For a slightly more portable ground station experience that also - provides direct rocket recovery support, TeleBT offers flight - monitoring and data logging using a Bluetooth™ connection between - the receiver and an Android device that has the AltosDroid - application installed from the Google Play store. - </para> - <para> - More products will be added to the Altus Metrum family over time, and - we currently envision that this will be a single, comprehensive manual - for the entire product family. - </para> - </chapter> - <chapter> - <title>Getting Started</title> - <para> - The first thing to do after you check the inventory of parts in your - “starter kit” is to charge the battery. - </para> - <para> - For TeleMetrum, TeleMega and EasyMega, the battery can be charged by plugging it into the - corresponding socket of the device and then using the USB - cable to plug the flight computer into your computer's USB socket. The - on-board circuitry will charge the battery whenever it is plugged - in, because the on-off switch does NOT control the - charging circuitry. - </para> - <para> - On TeleMetrum v1 boards, when the GPS chip is initially - searching for satellites, TeleMetrum will consume more current - than it pulls from the USB port, so the battery must be - attached in order to get satellite lock. Once GPS is locked, - the current consumption goes back down enough to enable charging - while running. So it's a good idea to fully charge the battery - as your first item of business so there is no issue getting and - maintaining satellite lock. The yellow charge indicator led - will go out when the battery is nearly full and the charger goes - to trickle charge. It can take several hours to fully recharge a - deeply discharged battery. - </para> - <para> - TeleMetrum v2.0, TeleMega and EasyMega use a higher power battery charger, - allowing them to charge the battery while running the board at - maximum power. When the battery is charging, or when the board - is consuming a lot of power, the red LED will be lit. When the - battery is fully charged, the green LED will be lit. When the - battery is damaged or missing, both LEDs will be lit, which - appears yellow. - </para> - <para> - The Lithium Polymer TeleMini and EasyMini battery can be charged by - disconnecting it from the board and plugging it into a - standalone battery charger such as the LipoCharger product - included in TeleMini Starter Kits, and connecting that via a USB - cable to a laptop or other USB power source. - </para> - <para> - You can also choose to use another battery with TeleMini v2.0 - and EasyMini, anything supplying between 4 and 12 volts should - work fine (like a standard 9V battery), but if you are planning - to fire pyro charges, ground testing is required to verify that - the battery supplies enough current to fire your chosen e-matches. - </para> - <para> - The other active device in the starter kit is the TeleDongle USB to - RF interface. If you plug it in to your Mac or Linux computer it should - “just work”, showing up as a serial port device. Windows systems need - driver information that is part of the AltOS download to know that the - existing USB modem driver will work. We therefore recommend installing - our software before plugging in TeleDongle if you are using a Windows - computer. If you are using an older version of Linux and are having - problems, try moving to a fresher kernel (2.6.33 or newer). - </para> - <para> - Next you should obtain and install the AltOS software. The AltOS - distribution includes the AltosUI ground station program, current - firmware - images for all of the hardware, and a number of standalone - utilities that are rarely needed. Pre-built binary packages are - available for Linux, Microsoft Windows, and recent MacOSX - versions. Full source code and build instructions are also - available. The latest version may always be downloaded from - <ulink url="http://altusmetrum.org/AltOS"/>. - </para> - <para> - If you're using a TeleBT instead of the TeleDongle, you'll want to - install the AltosDroid application from the Google Play store on an - Android device. You don't need a data plan to use AltosDroid, but - without network access, the Map view will be less useful as it - won't contain any map data. You can also use TeleBT connected - over USB with your laptop computer; it acts exactly like a - TeleDongle. Anywhere this manual talks about TeleDongle, you can - also read that as 'and TeleBT when connected via USB'. - </para> - </chapter> - <chapter> - <title>Handling Precautions</title> - <para> - All Altus Metrum products are sophisticated electronic devices. - When handled gently and properly installed in an air-frame, they - will deliver impressive results. However, as with all electronic - devices, there are some precautions you must take. - </para> - <para> - The Lithium Polymer rechargeable batteries have an - extraordinary power density. This is great because we can fly with - much less battery mass than if we used alkaline batteries or previous - generation rechargeable batteries... but if they are punctured - or their leads are allowed to short, they can and will release their - energy very rapidly! - Thus we recommend that you take some care when handling our batteries - and consider giving them some extra protection in your air-frame. We - often wrap them in suitable scraps of closed-cell packing foam before - strapping them down, for example. - </para> - <para> - The barometric sensors used on all of our flight computers are - sensitive to sunlight. In normal mounting situations, the baro sensor - and all of the other surface mount components - are “down” towards whatever the underlying mounting surface is, so - this is not normally a problem. Please consider this when designing an - installation in an air-frame with a see-through plastic payload bay. It - is particularly important to - consider this with TeleMini v1.0, both because the baro sensor is on the - “top” of the board, and because many model rockets with payload bays - use clear plastic for the payload bay! Replacing these with an opaque - cardboard tube, painting them, or wrapping them with a layer of masking - tape are all reasonable approaches to keep the sensor out of direct - sunlight. - </para> - <para> - The barometric sensor sampling port must be able to “breathe”, - both by not being covered by foam or tape or other materials that might - directly block the hole on the top of the sensor, and also by having a - suitable static vent to outside air. - </para> - <para> - As with all other rocketry electronics, Altus Metrum altimeters must - be protected from exposure to corrosive motor exhaust and ejection - charge gasses. - </para> - </chapter> - <chapter> - <title>Altus Metrum Hardware</title> - <section> - <title>General Usage Instructions</title> - <para> - Here are general instructions for hooking up an Altus Metrum - flight computer. Instructions specific to each model will be - found in the section devoted to that model below. - </para> - <para> - To prevent electrical interference from affecting the - operation of the flight computer, it's important to always - twist pairs of wires connected to the board. Twist the switch - leads, the pyro leads and the battery leads. This reduces - interference through a mechanism called common mode rejection. - </para> - <section> - <title>Hooking Up Lithium Polymer Batteries</title> - <para> - All Altus Metrum flight computers have a two pin JST PH - series connector to connect up a single-cell Lithium Polymer - cell (3.7V nominal). You can purchase matching batteries - from the Altus Metrum store, or other vendors, or you can - make your own. Pin 1 of the connector is positive, pin 2 is - negative. Spark Fun sells a cable with the connector - attached, which they call a <ulink - url="https://www.sparkfun.com/products/9914">JST Jumper 2 - Wire Assembly</ulink>. - </para> - <para> - Many RC vendors also sell lithium polymer batteries with - this same connector. All that we have found use the opposite - polarity, and if you use them that way, you will damage or - destroy the flight computer. - </para> - </section> - <section> - <title>Hooking Up Pyro Charges</title> - <para> - Altus Metrum flight computers always have two screws for - each pyro charge. This means you shouldn't need to put two - wires into a screw terminal or connect leads from pyro - charges together externally. - </para> - <para> - On the flight computer, one lead from each charge is hooked - to the positive battery terminal through the power switch. - The other lead is connected through the pyro circuit, which - is connected to the negative battery terminal when the pyro - circuit is fired. - </para> - </section> - <section> - <title>Hooking Up a Power Switch</title> - <para> - Altus Metrum flight computers need an external power switch - to turn them on. This disconnects both the computer and the - pyro charges from the battery, preventing the charges from - firing when in the Off position. The switch is in-line with - the positive battery terminal. - </para> - <section> - <title>Using an External Active Switch Circuit</title> - <para> - You can use an active switch circuit, such as the - Featherweight Magnetic Switch, with any Altus Metrum - flight computer. These require three connections, one to - the battery, one to the positive power input on the flight - computer and one to ground. Find instructions on how to - hook these up for each flight computer below. The follow - the instructions that come with your active switch to - connect it up. - </para> - </section> - </section> - <section> - <title>Using a Separate Pyro Battery</title> - <para> - As mentioned above in the section on hooking up pyro - charges, one lead for each of the pyro charges is connected - through the power switch directly to the positive battery - terminal. The other lead is connected to the pyro circuit, - which connects it to the negative battery terminal when the - pyro circuit is fired. The pyro circuit on all of the flight - computers is designed to handle up to 16V. - </para> - <para> - To use a separate pyro battery, connect the negative pyro - battery terminal to the flight computer ground terminal, - the positive battery terminal to the igniter and the other - igniter lead to the negative pyro terminal on the flight - computer. When the pyro channel fires, it will complete the - circuit between the negative pyro terminal and the ground - terminal, firing the igniter. Specific instructions on how - to hook this up will be found in each section below. - </para> - </section> - <section> - <title>Using a Different Kind of Battery</title> - <para> - EasyMini and TeleMini v2 are designed to use either a - lithium polymer battery or any other battery producing - between 4 and 12 volts, such as a rectangular 9V - battery. TeleMega, EasyMega and TeleMetrum are not designed for this, - and must only be powered by a lithium polymer battery. Find - instructions on how to use other batteries in the EasyMini - and TeleMini sections below. - </para> - </section> - </section> - <section> - <title>Specifications</title> - <para> - Here's the full set of Altus Metrum products, both in - production and retired. - </para> - <table frame='all'> - <title>Altus Metrum Electronics</title> - <?dbfo keep-together="always"?> - <tgroup cols='8' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Device'/> - <colspec align='center' colwidth='*' colname='Barometer'/> - <colspec align='center' colwidth='*' colname='Z-axis accelerometer'/> - <colspec align='center' colwidth='*' colname='GPS'/> - <colspec align='center' colwidth='*' colname='3D sensors'/> - <colspec align='center' colwidth='*' colname='Storage'/> - <colspec align='center' colwidth='*' colname='RF'/> - <colspec align='center' colwidth='*' colname='Battery'/> - <thead> - <row> - <entry align='center'>Device</entry> - <entry align='center'>Barometer</entry> - <entry align='center'>Z-axis accelerometer</entry> - <entry align='center'>GPS</entry> - <entry align='center'>3D sensors</entry> - <entry align='center'>Storage</entry> - <entry align='center'>RF Output</entry> - <entry align='center'>Battery</entry> - </row> - </thead> - <tbody> - <row> - <entry>TeleMetrum v1.0</entry> - <entry><para>MP3H6115 10km (33k')</para></entry> - <entry><para>MMA2202 50g</para></entry> - <entry>SkyTraq</entry> - <entry>-</entry> - <entry>1MB</entry> - <entry>10mW</entry> - <entry>3.7V</entry> - </row> - <row> - <entry>TeleMetrum v1.1</entry> - <entry><para>MP3H6115 10km (33k')</para></entry> - <entry><para>MMA2202 50g</para></entry> - <entry>SkyTraq</entry> - <entry>-</entry> - <entry>2MB</entry> - <entry>10mW</entry> - <entry>3.7V</entry> - </row> - <row> - <entry>TeleMetrum v1.2</entry> - <entry><para>MP3H6115 10km (33k')</para></entry> - <entry><para>ADXL78 70g</para></entry> - <entry>SkyTraq</entry> - <entry>-</entry> - <entry>2MB</entry> - <entry>10mW</entry> - <entry>3.7V</entry> - </row> - <row> - <entry>TeleMetrum v2.0</entry> - <entry><para>MS5607 30km (100k')</para></entry> - <entry><para>MMA6555 102g</para></entry> - <entry>uBlox Max-7Q</entry> - <entry>-</entry> - <entry>8MB</entry> - <entry>40mW</entry> - <entry>3.7V</entry> - </row> - <row> - <entry><para>TeleMini <?linebreak?>v1.0</para></entry> - <entry><para>MP3H6115 10km (33k')</para></entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>5kB</entry> - <entry>10mW</entry> - <entry>3.7V</entry> - </row> - <row> - <entry>TeleMini <?linebreak?>v2.0</entry> - <entry><para>MS5607 30km (100k')</para></entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>1MB</entry> - <entry>10mW</entry> - <entry>3.7-12V</entry> - </row> - <row> - <entry>EasyMini <?linebreak?>v1.0</entry> - <entry><para>MS5607 30km (100k')</para></entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>1MB</entry> - <entry>-</entry> - <entry>3.7-12V</entry> - </row> - <row> - <entry>TeleMega <?linebreak?>v1.0</entry> - <entry><para>MS5607 30km (100k')</para></entry> - <entry><para>MMA6555 102g</para></entry> - <entry>uBlox Max-7Q</entry> - <entry><para>MPU6000 HMC5883</para></entry> - <entry>8MB</entry> - <entry>40mW</entry> - <entry>3.7V</entry> - </row> - <row> - <entry>EasyMega <?linebreak?>v1.0</entry> - <entry><para>MS5607 30km (100k')</para></entry> - <entry><para>MMA6555 102g</para></entry> - <entry>-</entry> - <entry><para>MPU6000 HMC5883</para></entry> - <entry>8MB</entry> - <entry>-</entry> - <entry>3.7V</entry> - </row> - </tbody> - </tgroup> - </table> - <table frame='all'> - <title>Altus Metrum Boards</title> - <?dbfo keep-together="always"?> - <tgroup cols='6' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Device'/> - <colspec align='center' colwidth='*' colname='Connectors'/> - <colspec align='center' colwidth='*' colname='Screw Terminals'/> - <colspec align='center' colwidth='*' colname='Width'/> - <colspec align='center' colwidth='*' colname='Length'/> - <colspec align='center' colwidth='*' colname='Tube Size'/> - <thead> - <row> - <entry align='center'>Device</entry> - <entry align='center'>Connectors</entry> - <entry align='center'>Screw Terminals</entry> - <entry align='center'>Width</entry> - <entry align='center'>Length</entry> - <entry align='center'>Tube Size</entry> - </row> - </thead> - <tbody> - <row> - <entry>TeleMetrum</entry> - <entry><para> - Antenna<?linebreak?> - Debug<?linebreak?> - Companion<?linebreak?> - USB<?linebreak?> - Battery - </para></entry> - <entry><para>Apogee pyro <?linebreak?>Main pyro <?linebreak?>Switch</para></entry> - <entry>1 inch (2.54cm)</entry> - <entry>2 ¾ inch (6.99cm)</entry> - <entry>29mm coupler</entry> - </row> - <row> - <entry><para>TeleMini <?linebreak?>v1.0</para></entry> - <entry><para> - Antenna<?linebreak?> - Debug<?linebreak?> - Battery - </para></entry> - <entry><para> - Apogee pyro <?linebreak?> - Main pyro - </para></entry> - <entry>½ inch (1.27cm)</entry> - <entry>1½ inch (3.81cm)</entry> - <entry>18mm coupler</entry> - </row> - <row> - <entry>TeleMini <?linebreak?>v2.0</entry> - <entry><para> - Antenna<?linebreak?> - Debug<?linebreak?> - USB<?linebreak?> - Battery - </para></entry> - <entry><para> - Apogee pyro <?linebreak?> - Main pyro <?linebreak?> - Battery <?linebreak?> - Switch - </para></entry> - <entry>0.8 inch (2.03cm)</entry> - <entry>1½ inch (3.81cm)</entry> - <entry>24mm coupler</entry> - </row> - <row> - <entry>EasyMini</entry> - <entry><para> - Debug<?linebreak?> - USB<?linebreak?> - Battery - </para></entry> - <entry><para> - Apogee pyro <?linebreak?> - Main pyro <?linebreak?> - Battery <?linebreak?> - Switch - </para></entry> - <entry>0.8 inch (2.03cm)</entry> - <entry>1½ inch (3.81cm)</entry> - <entry>24mm coupler</entry> - </row> - <row> - <entry>TeleMega</entry> - <entry><para> - Antenna<?linebreak?> - Debug<?linebreak?> - Companion<?linebreak?> - USB<?linebreak?> - Battery - </para></entry> - <entry><para> - Apogee pyro <?linebreak?> - Main pyro<?linebreak?> - Pyro A-D<?linebreak?> - Switch<?linebreak?> - Pyro battery - </para></entry> - <entry>1¼ inch (3.18cm)</entry> - <entry>3¼ inch (8.26cm)</entry> - <entry>38mm coupler</entry> - </row> - <row> - <entry>EasyMega</entry> - <entry><para> - Debug<?linebreak?> - Companion<?linebreak?> - USB<?linebreak?> - Battery - </para></entry> - <entry><para> - Apogee pyro <?linebreak?> - Main pyro<?linebreak?> - Pyro A-D<?linebreak?> - Switch<?linebreak?> - Pyro battery - </para></entry> - <entry>1¼ inch (3.18cm)</entry> - <entry>2¼ inch (5.62cm)</entry> - <entry>38mm coupler</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>TeleMetrum</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telemetrum-v1.1-thside.jpg" width="5.5in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - TeleMetrum is a 1 inch by 2¾ inch circuit board. It was designed to - fit inside coupler for 29mm air-frame tubing, but using it in a tube that - small in diameter may require some creativity in mounting and wiring - to succeed! The presence of an accelerometer means TeleMetrum should - be aligned along the flight axis of the airframe, and by default the ¼ - wave UHF wire antenna should be on the nose-cone end of the board. The - antenna wire is about 7 inches long, and wiring for a power switch and - the e-matches for apogee and main ejection charges depart from the - fin can end of the board, meaning an ideal “simple” avionics - bay for TeleMetrum should have at least 10 inches of interior length. - </para> - <section> - <title>TeleMetrum Screw Terminals</title> - <para> - TeleMetrum has six screw terminals on the end of the board - opposite the telemetry antenna. Two are for the power - switch, and two each for the apogee and main igniter - circuits. Using the picture above and starting from the top, - the terminals are as follows: - </para> - <table frame='all'> - <title>TeleMetrum Screw Terminals</title> - <?dbfo keep-together="always"?> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Pin #'/> - <colspec align='center' colwidth='2*' colname='Pin Name'/> - <colspec align='left' colwidth='5*' colname='Description'/> - <thead> - <row> - <entry align='center'>Terminal #</entry> - <entry align='center'>Terminal Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>1</entry> - <entry>Switch Output</entry> - <entry>Switch connection to flight computer</entry> - </row> - <row> - <entry>2</entry> - <entry>Switch Input</entry> - <entry>Switch connection to positive battery terminal</entry> - </row> - <row> - <entry>3</entry> - <entry>Main +</entry> - <entry>Main pyro channel common connection to battery +</entry> - </row> - <row> - <entry>4</entry> - <entry>Main -</entry> - <entry>Main pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>5</entry> - <entry>Apogee +</entry> - <entry>Apogee pyro channel common connection to battery +</entry> - </row> - <row> - <entry>6</entry> - <entry>Apogee -</entry> - <entry>Apogee pyro channel connection to pyro circuit</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>Using a Separate Pyro Battery with TeleMetrum</title> - <para> - As described above, using an external pyro battery involves - connecting the negative battery terminal to the flight - computer ground, connecting the positive battery terminal to - one of the igniter leads and connecting the other igniter - lead to the per-channel pyro circuit connection. - </para> - <para> - To connect the negative battery terminal to the TeleMetrum - ground, insert a small piece of wire, 24 to 28 gauge - stranded, into the GND hole just above the screw terminal - strip and solder it in place. - </para> - <para> - Connecting the positive battery terminal to the pyro - charges must be done separate from TeleMetrum, by soldering - them together or using some other connector. - </para> - <para> - The other lead from each pyro charge is then inserted into - the appropriate per-pyro channel screw terminal (terminal 4 for the - Main charge, terminal 6 for the Apogee charge). - </para> - </section> - <section> - <title>Using an Active Switch with TeleMetrum</title> - <para> - As explained above, an external active switch requires three - connections, one to the positive battery terminal, one to - the flight computer positive input and one to ground. - </para> - <para> - The positive battery terminal is available on screw terminal - 2, the positive flight computer input is on terminal 1. To - hook a lead to ground, solder a piece of wire, 24 to 28 - gauge stranded, to the GND hole just above terminal 1. - </para> - </section> - </section> - <section> - <title>TeleMini v1.0</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telemini-v1-top.jpg" width="5.5in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - TeleMini v1.0 is ½ inches by 1½ inches. It was - designed to fit inside an 18mm air-frame tube, but using it in - a tube that small in diameter may require some creativity in - mounting and wiring to succeed! Since there is no - accelerometer, TeleMini can be mounted in any convenient - orientation. The default ¼ wave UHF wire antenna attached to - the center of one end of the board is about 7 inches long. Two - wires for the power switch are connected to holes in the - middle of the board. Screw terminals for the e-matches for - apogee and main ejection charges depart from the other end of - the board, meaning an ideal “simple” avionics bay for TeleMini - should have at least 9 inches of interior length. - </para> - <section> - <title>TeleMini v1.0 Screw Terminals</title> - <para> - TeleMini v1.0 has four screw terminals on the end of the - board opposite the telemetry antenna. Two are for the apogee - and two are for main igniter circuits. There are also wires - soldered to the board for the power switch. Using the - picture above and starting from the top for the terminals - and from the left for the power switch wires, the - connections are as follows: - </para> - <table frame='all'> - <title>TeleMini v1.0 Connections</title> - <?dbfo keep-together="always"?> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Pin #'/> - <colspec align='center' colwidth='2*' colname='Pin Name'/> - <colspec align='left' colwidth='5*' colname='Description'/> - <thead> - <row> - <entry align='center'>Terminal #</entry> - <entry align='center'>Terminal Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>1</entry> - <entry>Apogee -</entry> - <entry>Apogee pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>2</entry> - <entry>Apogee +</entry> - <entry>Apogee pyro channel common connection to battery +</entry> - </row> - <row> - <entry>3</entry> - <entry>Main -</entry> - <entry>Main pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>4</entry> - <entry>Main +</entry> - <entry>Main pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Left</entry> - <entry>Switch Output</entry> - <entry>Switch connection to flight computer</entry> - </row> - <row> - <entry>Right</entry> - <entry>Switch Input</entry> - <entry>Switch connection to positive battery terminal</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>Using a Separate Pyro Battery with TeleMini v1.0</title> - <para> - As described above, using an external pyro battery involves - connecting the negative battery terminal to the flight - computer ground, connecting the positive battery terminal to - one of the igniter leads and connecting the other igniter - lead to the per-channel pyro circuit connection. Because - there is no solid ground connection to use on TeleMini, this - is not recommended. - </para> - <para> - The only available ground connection on TeleMini v1.0 are - the two mounting holes next to the telemetry - antenna. Somehow connect a small piece of wire to one of - those holes and hook it to the negative pyro battery terminal. - </para> - <para> - Connecting the positive battery terminal to the pyro - charges must be done separate from TeleMini v1.0, by soldering - them together or using some other connector. - </para> - <para> - The other lead from each pyro charge is then inserted into - the appropriate per-pyro channel screw terminal (terminal 3 for the - Main charge, terminal 1 for the Apogee charge). - </para> - </section> - <section> - <title>Using an Active Switch with TeleMini v1.0</title> - <para> - As explained above, an external active switch requires three - connections, one to the positive battery terminal, one to - the flight computer positive input and one to ground. Again, - because TeleMini doesn't have any good ground connection, - this is not recommended. - </para> - <para> - The positive battery terminal is available on the Right - power switch wire, the positive flight computer input is on - the left power switch wire. Hook a lead to either of the - mounting holes for a ground connection. - </para> - </section> - </section> - <section> - <title>TeleMini v2.0</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telemini-v2-top.jpg" width="5.5in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - TeleMini v2.0 is 0.8 inches by 1½ inches. It adds more - on-board data logging memory, a built-in USB connector and - screw terminals for the battery and power switch. The larger - board fits in a 24mm coupler. There's also a battery connector - for a LiPo battery if you want to use one of those. - </para> - <section> - <title>TeleMini v2.0 Screw Terminals</title> - <para> - TeleMini v2.0 has two sets of four screw terminals on the end of the - board opposite the telemetry antenna. Using the picture - above, the top four have connections for the main pyro - circuit and an external battery and the bottom four have - connections for the apogee pyro circuit and the power - switch. Counting from the left, the connections are as follows: - </para> - <table frame='all'> - <title>TeleMini v2.0 Connections</title> - <?dbfo keep-together="always"?> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Pin #'/> - <colspec align='center' colwidth='2*' colname='Pin Name'/> - <colspec align='left' colwidth='5*' colname='Description'/> - <thead> - <row> - <entry align='center'>Terminal #</entry> - <entry align='center'>Terminal Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>Top 1</entry> - <entry>Main -</entry> - <entry>Main pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Top 2</entry> - <entry>Main +</entry> - <entry>Main pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Top 3</entry> - <entry>Battery +</entry> - <entry>Positive external battery terminal</entry> - </row> - <row> - <entry>Top 4</entry> - <entry>Battery -</entry> - <entry>Negative external battery terminal</entry> - </row> - <row> - <entry>Bottom 1</entry> - <entry>Apogee -</entry> - <entry>Apogee pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Bottom 2</entry> - <entry>Apogee +</entry> - <entry>Apogee pyro channel common connection to - battery +</entry> - </row> - <row> - <entry>Bottom 3</entry> - <entry>Switch Output</entry> - <entry>Switch connection to flight computer</entry> - </row> - <row> - <entry>Bottom 4</entry> - <entry>Switch Input</entry> - <entry>Switch connection to positive battery terminal</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>Using a Separate Pyro Battery with TeleMini v2.0</title> - <para> - As described above, using an external pyro battery involves - connecting the negative battery terminal to the flight - computer ground, connecting the positive battery terminal to - one of the igniter leads and connecting the other igniter - lead to the per-channel pyro circuit connection. - </para> - <para> - To connect the negative pyro battery terminal to TeleMini - ground, connect it to the negative external battery - connection, top terminal 4. - </para> - <para> - Connecting the positive battery terminal to the pyro - charges must be done separate from TeleMini v2.0, by soldering - them together or using some other connector. - </para> - <para> - The other lead from each pyro charge is then inserted into - the appropriate per-pyro channel screw terminal (top - terminal 1 for the Main charge, bottom terminal 1 for the - Apogee charge). - </para> - </section> - <section> - <title>Using an Active Switch with TeleMini v2.0</title> - <para> - As explained above, an external active switch requires three - connections, one to the positive battery terminal, one to - the flight computer positive input and one to ground. Use - the negative external battery connection, top terminal 4 for - ground. - </para> - <para> - The positive battery terminal is available on bottom - terminal 4, the positive flight computer input is on the - bottom terminal 3. - </para> - </section> - </section> - <section> - <title>EasyMini</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="easymini-top.jpg" width="5.5in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - EasyMini is built on a 0.8 inch by 1½ inch circuit board. It's - designed to fit in a 24mm coupler tube. The connectors and - screw terminals match TeleMini v2.0, so you can easily swap between - EasyMini and TeleMini. - </para> - <section> - <title>EasyMini Screw Terminals</title> - <para> - EasyMini has two sets of four screw terminals on the end of the - board opposite the telemetry antenna. Using the picture - above, the top four have connections for the main pyro - circuit and an external battery and the bottom four have - connections for the apogee pyro circuit and the power - switch. Counting from the left, the connections are as follows: - </para> - <table frame='all'> - <title>EasyMini Connections</title> - <?dbfo keep-together="always"?> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Pin #'/> - <colspec align='center' colwidth='2*' colname='Pin Name'/> - <colspec align='left' colwidth='5*' colname='Description'/> - <thead> - <row> - <entry align='center'>Terminal #</entry> - <entry align='center'>Terminal Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>Top 1</entry> - <entry>Main -</entry> - <entry>Main pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Top 2</entry> - <entry>Main +</entry> - <entry>Main pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Top 3</entry> - <entry>Battery +</entry> - <entry>Positive external battery terminal</entry> - </row> - <row> - <entry>Top 4</entry> - <entry>Battery -</entry> - <entry>Negative external battery terminal</entry> - </row> - <row> - <entry>Bottom 1</entry> - <entry>Apogee -</entry> - <entry>Apogee pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Bottom 2</entry> - <entry>Apogee +</entry> - <entry>Apogee pyro channel common connection to - battery +</entry> - </row> - <row> - <entry>Bottom 3</entry> - <entry>Switch Output</entry> - <entry>Switch connection to flight computer</entry> - </row> - <row> - <entry>Bottom 4</entry> - <entry>Switch Input</entry> - <entry>Switch connection to positive battery terminal</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>Using a Separate Pyro Battery with EasyMini</title> - <para> - As described above, using an external pyro battery involves - connecting the negative battery terminal to the flight - computer ground, connecting the positive battery terminal to - one of the igniter leads and connecting the other igniter - lead to the per-channel pyro circuit connection. - </para> - <para> - To connect the negative pyro battery terminal to TeleMini - ground, connect it to the negative external battery - connection, top terminal 4. - </para> - <para> - Connecting the positive battery terminal to the pyro - charges must be done separate from EasyMini, by soldering - them together or using some other connector. - </para> - <para> - The other lead from each pyro charge is then inserted into - the appropriate per-pyro channel screw terminal (top - terminal 1 for the Main charge, bottom terminal 1 for the - Apogee charge). - </para> - </section> - <section> - <title>Using an Active Switch with EasyMini</title> - <para> - As explained above, an external active switch requires three - connections, one to the positive battery terminal, one to - the flight computer positive input and one to ground. Use - the negative external battery connection, top terminal 4 for - ground. - </para> - <para> - The positive battery terminal is available on bottom - terminal 4, the positive flight computer input is on the - bottom terminal 3. - </para> - </section> - </section> - <section> - <title>TeleMega</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telemega-v1.0-top.jpg" width="5.5in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - TeleMega is a 1¼ inch by 3¼ inch circuit board. It was - designed to easily fit in a 38mm coupler. Like TeleMetrum, - TeleMega has an accelerometer and so it must be mounted so that - the board is aligned with the flight axis. It can be mounted - either antenna up or down. - </para> - <section> - <title>TeleMega Screw Terminals</title> - <para> - TeleMega has two sets of nine screw terminals on the end of - the board opposite the telemetry antenna. They are as follows: - </para> - <table frame='all'> - <title>TeleMega Screw Terminals</title> - <?dbfo keep-together="always"?> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Pin #'/> - <colspec align='center' colwidth='2*' colname='Pin Name'/> - <colspec align='left' colwidth='5*' colname='Description'/> - <thead> - <row> - <entry align='center'>Terminal #</entry> - <entry align='center'>Terminal Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>Top 1</entry> - <entry>Switch Input</entry> - <entry>Switch connection to positive battery terminal</entry> - </row> - <row> - <entry>Top 2</entry> - <entry>Switch Output</entry> - <entry>Switch connection to flight computer</entry> - </row> - <row> - <entry>Top 3</entry> - <entry>GND</entry> - <entry>Ground connection for use with external active switch</entry> - </row> - <row> - <entry>Top 4</entry> - <entry>Main -</entry> - <entry>Main pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Top 5</entry> - <entry>Main +</entry> - <entry>Main pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Top 6</entry> - <entry>Apogee -</entry> - <entry>Apogee pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Top 7</entry> - <entry>Apogee +</entry> - <entry>Apogee pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Top 8</entry> - <entry>D -</entry> - <entry>D pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Top 9</entry> - <entry>D +</entry> - <entry>D pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Bottom 1</entry> - <entry>GND</entry> - <entry>Ground connection for negative pyro battery terminal</entry> - </row> - <row> - <entry>Bottom 2</entry> - <entry>Pyro</entry> - <entry>Positive pyro battery terminal</entry> - </row> - <row> - <entry>Bottom 3</entry> - <entry>Lipo</entry> - <entry> - Power switch output. Use to connect main battery to - pyro battery input - </entry> - </row> - <row> - <entry>Bottom 4</entry> - <entry>A -</entry> - <entry>A pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Bottom 5</entry> - <entry>A +</entry> - <entry>A pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Bottom 6</entry> - <entry>B -</entry> - <entry>B pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Bottom 7</entry> - <entry>B +</entry> - <entry>B pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Bottom 8</entry> - <entry>C -</entry> - <entry>C pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Bottom 9</entry> - <entry>C +</entry> - <entry>C pyro channel common connection to battery +</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>Using a Separate Pyro Battery with TeleMega</title> - <para> - TeleMega provides explicit support for an external pyro - battery. All that is required is to remove the jumper - between the lipo terminal (Bottom 3) and the pyro terminal - (Bottom 2). Then hook the negative pyro battery terminal to ground - (Bottom 1) and the positive pyro battery to the pyro battery - input (Bottom 2). You can then use the existing pyro screw - terminals to hook up all of the pyro charges. - </para> - </section> - <section> - <title>Using Only One Battery With TeleMega</title> - <para> - Because TeleMega has built-in support for a separate pyro - battery, if you want to fly with just one battery running - both the computer and firing the charges, you need to - connect the flight computer battery to the pyro - circuit. TeleMega has two screw terminals for this—hook a - wire from the Lipo terminal (Bottom 3) to the Pyro terminal - (Bottom 2). - </para> - </section> - <section> - <title>Using an Active Switch with TeleMega</title> - <para> - As explained above, an external active switch requires three - connections, one to the positive battery terminal, one to - the flight computer positive input and one to ground. - </para> - <para> - The positive battery terminal is available on Top terminal - 1, the positive flight computer input is on Top terminal - 2. Ground is on Top terminal 3. - </para> - </section> - </section> - <section> - <title>EasyMega</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="easymega-v1.0-top.jpg" width="4.5in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - EasyMega is a 1¼ inch by 2¼ inch circuit board. It was - designed to easily fit in a 38mm coupler. Like TeleMetrum, - EasyMega has an accelerometer and so it must be mounted so that - the board is aligned with the flight axis. It can be mounted - either antenna up or down. - </para> - <section> - <title>EasyMega Screw Terminals</title> - <para> - EasyMega has two sets of nine screw terminals on the end of - the board opposite the telemetry antenna. They are as follows: - </para> - <table frame='all'> - <title>EasyMega Screw Terminals</title> - <?dbfo keep-together="always"?> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Pin #'/> - <colspec align='center' colwidth='2*' colname='Pin Name'/> - <colspec align='left' colwidth='5*' colname='Description'/> - <thead> - <row> - <entry align='center'>Terminal #</entry> - <entry align='center'>Terminal Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>Top 1</entry> - <entry>Switch Input</entry> - <entry>Switch connection to positive battery terminal</entry> - </row> - <row> - <entry>Top 2</entry> - <entry>Switch Output</entry> - <entry>Switch connection to flight computer</entry> - </row> - <row> - <entry>Top 3</entry> - <entry>GND</entry> - <entry>Ground connection for use with external active switch</entry> - </row> - <row> - <entry>Top 4</entry> - <entry>Main -</entry> - <entry>Main pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Top 5</entry> - <entry>Main +</entry> - <entry>Main pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Top 6</entry> - <entry>Apogee -</entry> - <entry>Apogee pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Top 7</entry> - <entry>Apogee +</entry> - <entry>Apogee pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Top 8</entry> - <entry>D -</entry> - <entry>D pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Top 9</entry> - <entry>D +</entry> - <entry>D pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Bottom 1</entry> - <entry>GND</entry> - <entry>Ground connection for negative pyro battery terminal</entry> - </row> - <row> - <entry>Bottom 2</entry> - <entry>Pyro</entry> - <entry>Positive pyro battery terminal</entry> - </row> - <row> - <entry>Bottom 3</entry> - <entry>Lipo</entry> - <entry> - Power switch output. Use to connect main battery to - pyro battery input - </entry> - </row> - <row> - <entry>Bottom 4</entry> - <entry>A -</entry> - <entry>A pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Bottom 5</entry> - <entry>A +</entry> - <entry>A pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Bottom 6</entry> - <entry>B -</entry> - <entry>B pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Bottom 7</entry> - <entry>B +</entry> - <entry>B pyro channel common connection to battery +</entry> - </row> - <row> - <entry>Bottom 8</entry> - <entry>C -</entry> - <entry>C pyro channel connection to pyro circuit</entry> - </row> - <row> - <entry>Bottom 9</entry> - <entry>C +</entry> - <entry>C pyro channel common connection to battery +</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>Using a Separate Pyro Battery with EasyMega</title> - <para> - EasyMega provides explicit support for an external pyro - battery. All that is required is to remove the jumper - between the lipo terminal (Bottom 3) and the pyro terminal - (Bottom 2). Then hook the negative pyro battery terminal to ground - (Bottom 1) and the positive pyro battery to the pyro battery - input (Bottom 2). You can then use the existing pyro screw - terminals to hook up all of the pyro charges. - </para> - </section> - <section> - <title>Using Only One Battery With EasyMega</title> - <para> - Because EasyMega has built-in support for a separate pyro - battery, if you want to fly with just one battery running - both the computer and firing the charges, you need to - connect the flight computer battery to the pyro - circuit. EasyMega has two screw terminals for this—hook a - wire from the Lipo terminal (Bottom 3) to the Pyro terminal - (Bottom 2). - </para> - </section> - <section> - <title>Using an Active Switch with EasyMega</title> - <para> - As explained above, an external active switch requires three - connections, one to the positive battery terminal, one to - the flight computer positive input and one to ground. - </para> - <para> - The positive battery terminal is available on Top terminal - 1, the positive flight computer input is on Top terminal - 2. Ground is on Top terminal 3. - </para> - </section> - </section> - <section> - <title>Flight Data Recording</title> - <para> - Each flight computer logs data at 100 samples per second - during ascent and 10 samples per second during descent, except - for TeleMini v1.0, which records ascent at 10 samples per - second and descent at 1 sample per second. Data are logged to - an on-board flash memory part, which can be partitioned into - several equal-sized blocks, one for each flight. - </para> - <table frame='all'> - <title>Data Storage on Altus Metrum altimeters</title> - <?dbfo keep-together="always"?> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Device'/> - <colspec align='center' colwidth='*' colname='Bytes per sample'/> - <colspec align='center' colwidth='*' colname='Total storage'/> - <colspec align='center' colwidth='*' colname='Minutes of - full-rate'/> - <thead> - <row> - <entry align='center'>Device</entry> - <entry align='center'>Bytes per Sample</entry> - <entry align='center'>Total Storage</entry> - <entry align='center'>Minutes at Full Rate</entry> - </row> - </thead> - <tbody> - <row> - <entry>TeleMetrum v1.0</entry> - <entry>8</entry> - <entry>1MB</entry> - <entry>20</entry> - </row> - <row> - <entry>TeleMetrum v1.1 v1.2</entry> - <entry>8</entry> - <entry>2MB</entry> - <entry>40</entry> - </row> - <row> - <entry>TeleMetrum v2.0</entry> - <entry>16</entry> - <entry>8MB</entry> - <entry>80</entry> - </row> - <row> - <entry>TeleMini v1.0</entry> - <entry>2</entry> - <entry>5kB</entry> - <entry>4</entry> - </row> - <row> - <entry>TeleMini v2.0</entry> - <entry>16</entry> - <entry>1MB</entry> - <entry>10</entry> - </row> - <row> - <entry>EasyMini</entry> - <entry>16</entry> - <entry>1MB</entry> - <entry>10</entry> - </row> - <row> - <entry>TeleMega</entry> - <entry>32</entry> - <entry>8MB</entry> - <entry>40</entry> - </row> - <row> - <entry>EasyMega</entry> - <entry>32</entry> - <entry>8MB</entry> - <entry>40</entry> - </row> - </tbody> - </tgroup> - </table> - <para> - The on-board flash is partitioned into separate flight logs, - each of a fixed maximum size. Increase the maximum size of - each log and you reduce the number of flights that can be - stored. Decrease the size and you can store more flights. - </para> - <para> - Configuration data is also stored in the flash memory on - TeleMetrum v1.x, TeleMini and EasyMini. This consumes 64kB - of flash space. This configuration space is not available - for storing flight log data. TeleMetrum v2.0, TeleMega and EasyMega - store configuration data in a bit of eeprom available within - the processor chip, leaving that space available in flash for - more flight data. - </para> - <para> - To compute the amount of space needed for a single flight, you - can multiply the expected ascent time (in seconds) by 100 - times bytes-per-sample, multiply the expected descent time (in - seconds) by 10 times the bytes per sample and add the two - together. That will slightly under-estimate the storage (in - bytes) needed for the flight. For instance, a TeleMetrum v2.0 flight spending - 20 seconds in ascent and 150 seconds in descent will take - about (20 * 1600) + (150 * 160) = 56000 bytes of storage. You - could store dozens of these flights in the on-board flash. - </para> - <para> - The default size allows for several flights on each flight - computer, except for TeleMini v1.0, which only holds data for a - single flight. You can adjust the size. - </para> - <para> - Altus Metrum flight computers will not overwrite existing - flight data, so be sure to download flight data and erase it - from the flight computer before it fills up. The flight - computer will still successfully control the flight even if it - cannot log data, so the only thing you will lose is the data. - </para> - </section> - <section> - <title>Installation</title> - <para> - A typical installation involves attaching - only a suitable battery, a single pole switch for - power on/off, and two pairs of wires connecting e-matches for the - apogee and main ejection charges. All Altus Metrum products are - designed for use with single-cell batteries with 3.7 volts - nominal. TeleMini v2.0 and EasyMini may also be used with other - batteries as long as they supply between 4 and 12 volts. - </para> - <para> - The battery connectors are a standard 2-pin JST connector and - match batteries sold by Spark Fun. These batteries are - single-cell Lithium Polymer batteries that nominally provide 3.7 - volts. Other vendors sell similar batteries for RC aircraft - using mating connectors, however the polarity for those is - generally reversed from the batteries used by Altus Metrum - products. In particular, the Tenergy batteries supplied for use - in Featherweight flight computers are not compatible with Altus - Metrum flight computers or battery chargers. <emphasis>Check - polarity and voltage before connecting any battery not purchased - from Altus Metrum or Spark Fun.</emphasis> - </para> - <para> - By default, we use the unregulated output of the battery directly - to fire ejection charges. This works marvelously with standard - low-current e-matches like the J-Tek from MJG Technologies, and with - Quest Q2G2 igniters. However, if you want or need to use a separate - pyro battery, check out the “External Pyro Battery” section in this - manual for instructions on how to wire that up. The altimeters are - designed to work with an external pyro battery of no more than 15 volts. - </para> - <para> - Ejection charges are wired directly to the screw terminal block - at the aft end of the altimeter. You'll need a very small straight - blade screwdriver for these screws, such as you might find in a - jeweler's screwdriver set. - </para> - <para> - Except for TeleMini v1.0, the flight computers also use the - screw terminal block for the power switch leads. On TeleMini v1.0, - the power switch leads are soldered directly to the board and - can be connected directly to a switch. - </para> - <para> - For most air-frames, the integrated antennas are more than - adequate. However, if you are installing in a carbon-fiber or - metal electronics bay which is opaque to RF signals, you may need to - use off-board external antennas instead. In this case, you can - replace the stock UHF antenna wire with an edge-launched SMA connector, - and, on TeleMetrum v1, you can unplug the integrated GPS - antenna and select an appropriate off-board GPS antenna with - cable terminating in a U.FL connector. - </para> - </section> - </chapter> - <chapter> - <title>System Operation</title> - <section> - <title>Firmware Modes </title> - <para> - The AltOS firmware build for the altimeters has two - fundamental modes, “idle” and “flight”. Which of these modes - the firmware operates in is determined at start up time. For - TeleMetrum, TeleMega and EasyMega, which have accelerometers, the mode is - controlled by the orientation of the - rocket (well, actually the board, of course...) at the time - power is switched on. If the rocket is “nose up”, then - the flight computer assumes it's on a rail or rod being prepared for - launch, so the firmware chooses flight mode. However, if the - rocket is more or less horizontal, the firmware instead enters - idle mode. Since TeleMini v2.0 and EasyMini don't have an - accelerometer we can use to determine orientation, “idle” mode - is selected if the board is connected via USB to a computer, - otherwise the board enters “flight” mode. TeleMini v1.0 - selects “idle” mode if it receives a command packet within the - first five seconds of operation. - </para> - <para> - At power on, the altimeter will beep out the battery voltage - to the nearest tenth of a volt. Each digit is represented by - a sequence of short “dit” beeps, with a pause between - digits. A zero digit is represented with one long “dah” - beep. Then there will be a short pause while the altimeter - completes initialization and self test, and decides which mode - to enter next. - </para> - <para> - Here's a short summary of all of the modes and the beeping (or - flashing, in the case of TeleMini v1) that accompanies each - mode. In the description of the beeping pattern, “dit” means a - short beep while "dah" means a long beep (three times as - long). “Brap” means a long dissonant tone. - <table frame='all'> - <title>AltOS Modes</title> - <?dbfo keep-together="always"?> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Mode Name'/> - <colspec align='center' colwidth='*' colname='Letter'/> - <colspec align='center' colwidth='*' colname='Beeps'/> - <colspec align='center' colwidth='*' colname='Description'/> - <thead> - <row> - <entry>Mode Name</entry> - <entry>Abbreviation</entry> - <entry>Beeps</entry> - <entry>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>Startup</entry> - <entry>S</entry> - <entry>battery voltage in decivolts</entry> - <entry> - <para> - Calibrating sensors, detecting orientation. - </para> - </entry> - </row> - <row> - <entry>Idle</entry> - <entry>I</entry> - <entry>dit dit</entry> - <entry> - <para> - Ready to accept commands over USB or radio link. - </para> - </entry> - </row> - <row> - <entry>Pad</entry> - <entry>P</entry> - <entry>dit dah dah dit</entry> - <entry> - <para> - Waiting for launch. Not listening for commands. - </para> - </entry> - </row> - <row> - <entry>Boost</entry> - <entry>B</entry> - <entry>dah dit dit dit</entry> - <entry> - <para> - Accelerating upwards. - </para> - </entry> - </row> - <row> - <entry>Fast</entry> - <entry>F</entry> - <entry>dit dit dah dit</entry> - <entry> - <para> - Decelerating, but moving faster than 200m/s. - </para> - </entry> - </row> - <row> - <entry>Coast</entry> - <entry>C</entry> - <entry>dah dit dah dit</entry> - <entry> - <para> - Decelerating, moving slower than 200m/s - </para> - </entry> - </row> - <row> - <entry>Drogue</entry> - <entry>D</entry> - <entry>dah dit dit</entry> - <entry> - <para> - Descending after apogee. Above main height. - </para> - </entry> - </row> - <row> - <entry>Main</entry> - <entry>M</entry> - <entry>dah dah</entry> - <entry> - <para> - Descending. Below main height. - </para> - </entry> - </row> - <row> - <entry>Landed</entry> - <entry>L</entry> - <entry>dit dah dit dit</entry> - <entry> - <para> - Stable altitude for at least ten seconds. - </para> - </entry> - </row> - <row> - <entry>Sensor error</entry> - <entry>X</entry> - <entry>dah dit dit dah</entry> - <entry> - <para> - Error detected during sensor calibration. - </para> - </entry> - </row> - </tbody> - </tgroup> - </table> - </para> - <para> - In flight or “pad” mode, the altimeter engages the flight - state machine, goes into transmit-only mode to send telemetry, - and waits for launch to be detected. Flight mode is indicated - by an “di-dah-dah-dit” (“P” for pad) on the beeper or lights, - followed by beeps or flashes indicating the state of the - pyrotechnic igniter continuity. One beep/flash indicates - apogee continuity, two beeps/flashes indicate main continuity, - three beeps/flashes indicate both apogee and main continuity, - and one longer “brap” sound which is made by rapidly - alternating between two tones indicates no continuity. For a - dual deploy flight, make sure you're getting three beeps or - flashes before launching! For apogee-only or motor eject - flights, do what makes sense. - </para> - <para> - If idle mode is entered, you will hear an audible “di-dit” or - see two short flashes (“I” for idle), and the flight state - machine is disengaged, thus no ejection charges will fire. - The altimeters also listen for the radio link when in idle - mode for requests sent via TeleDongle. Commands can be issued - in idle mode over either USB or the radio link - equivalently. TeleMini v1.0 only has the radio link. Idle - mode is useful for configuring the altimeter, for extracting - data from the on-board storage chip after flight, and for - ground testing pyro charges. - </para> - <para> - In “Idle” and “Pad” modes, once the mode indication - beeps/flashes and continuity indication has been sent, if - there is no space available to log the flight in on-board - memory, the flight computer will emit a warbling tone (much - slower than the “no continuity tone”) - </para> - <para> - Here's a summary of all of the “pad” and “idle” mode indications. - <table frame='all'> - <title>Pad/Idle Indications</title> - <?dbfo keep-together="always"?> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Name'/> - <colspec align='center' colwidth='*' colname='Beeps'/> - <colspec align='center' colwidth='*' colname='Description'/> - <thead> - <row> - <entry>Name</entry> - <entry>Beeps</entry> - <entry>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>Neither</entry> - <entry>brap</entry> - <entry> - <para> - No continuity detected on either apogee or main - igniters. - </para> - </entry> - </row> - <row> - <entry>Apogee</entry> - <entry>dit</entry> - <entry> - <para> - Continuity detected only on apogee igniter. - </para> - </entry> - </row> - <row> - <entry>Main</entry> - <entry>dit dit</entry> - <entry> - <para> - Continuity detected only on main igniter. - </para> - </entry> - </row> - <row> - <entry>Both</entry> - <entry>dit dit dit</entry> - <entry> - <para> - Continuity detected on both igniters. - </para> - </entry> - </row> - <row> - <entry>Storage Full</entry> - <entry>warble</entry> - <entry> - <para> - On-board data logging storage is full. This will - not prevent the flight computer from safely - controlling the flight or transmitting telemetry - signals, but no record of the flight will be - stored in on-board flash. - </para> - </entry> - </row> - </tbody> - </tgroup> - </table> - </para> - <para> - Once landed, the flight computer will signal that by emitting - the “Landed” sound described above, after which it will beep - out the apogee height (in meters). Each digit is represented - by a sequence of short “dit” beeps, with a pause between - digits. A zero digit is represented with one long “dah” - beep. The flight computer will continue to report landed mode - and beep out the maximum height until turned off. - </para> - <para> - One “neat trick” of particular value when TeleMetrum, TeleMega - or EasyMega are used with - very large air-frames, is that you can power the board up while the - rocket is horizontal, such that it comes up in idle mode. Then you can - raise the air-frame to launch position, and issue a 'reset' command - via TeleDongle over the radio link to cause the altimeter to reboot and - come up in flight mode. This is much safer than standing on the top - step of a rickety step-ladder or hanging off the side of a launch - tower with a screw-driver trying to turn on your avionics before - installing igniters! - </para> - <para> - TeleMini v1.0 is configured solely via the radio link. Of course, that - means you need to know the TeleMini radio configuration values - or you won't be able to communicate with it. For situations - when you don't have the radio configuration values, TeleMini v1.0 - offers an 'emergency recovery' mode. In this mode, TeleMini is - configured as follows: - <itemizedlist> - <listitem> - <para> - Sets the radio frequency to 434.550MHz - </para> - </listitem> - <listitem> - <para> - Sets the radio calibration back to the factory value. - </para> - </listitem> - <listitem> - <para> - Sets the callsign to N0CALL - </para> - </listitem> - <listitem> - <para> - Does not go to 'pad' mode after five seconds. - </para> - </listitem> - </itemizedlist> - </para> - <para> - To get into 'emergency recovery' mode, first find the row of - four small holes opposite the switch wiring. Using a short - piece of small gauge wire, connect the outer two holes - together, then power TeleMini up. Once the red LED is lit, - disconnect the wire and the board should signal that it's in - 'idle' mode after the initial five second startup period. - </para> - </section> - <section> - <title>GPS </title> - <para> - TeleMetrum and TeleMega include a complete GPS receiver. A - complete explanation of how GPS works is beyond the scope of - this manual, but the bottom line is that the GPS receiver - needs to lock onto at least four satellites to obtain a solid - 3 dimensional position fix and know what time it is. - </para> - <para> - The flight computers provide backup power to the GPS chip any time a - battery is connected. This allows the receiver to “warm start” on - the launch rail much faster than if every power-on were a GPS - “cold start”. In typical operations, powering up - on the flight line in idle mode while performing final air-frame - preparation will be sufficient to allow the GPS receiver to cold - start and acquire lock. Then the board can be powered down during - RSO review and installation on a launch rod or rail. When the board - is turned back on, the GPS system should lock very quickly, typically - long before igniter installation and return to the flight line are - complete. - </para> - </section> - <section> - <title>Controlling An Altimeter Over The Radio Link</title> - <para> - One of the unique features of the Altus Metrum system is the - ability to create a two way command link between TeleDongle - and an altimeter using the digital radio transceivers - built into each device. This allows you to interact with the - altimeter from afar, as if it were directly connected to the - computer. - </para> - <para> - Any operation which can be performed with a flight computer can - either be done with the device directly connected to the - computer via the USB cable, or through the radio - link. TeleMini v1.0 doesn't provide a USB connector and so it is - always communicated with over radio. Select the appropriate - TeleDongle device when the list of devices is presented and - AltosUI will interact with an altimeter over the radio link. - </para> - <para> - One oddity in the current interface is how AltosUI selects the - frequency for radio communications. Instead of providing - an interface to specifically configure the frequency, it uses - whatever frequency was most recently selected for the target - TeleDongle device in Monitor Flight mode. If you haven't ever - used that mode with the TeleDongle in question, select the - Monitor Flight button from the top level UI, and pick the - appropriate TeleDongle device. Once the flight monitoring - window is open, select the desired frequency and then close it - down again. All radio communications will now use that frequency. - </para> - <itemizedlist> - <listitem> - <para> - Save Flight Data—Recover flight data from the rocket without - opening it up. - </para> - </listitem> - <listitem> - <para> - Configure altimeter apogee delays, main deploy heights - and additional pyro event conditions - to respond to changing launch conditions. You can also - 'reboot' the altimeter. Use this to remotely enable the - flight computer by turning TeleMetrum or TeleMega on in “idle” mode, - then once the air-frame is oriented for launch, you can - reboot the altimeter and have it restart in pad mode - without having to climb the scary ladder. - </para> - </listitem> - <listitem> - <para> - Fire Igniters—Test your deployment charges without snaking - wires out through holes in the air-frame. Simply assemble the - rocket as if for flight with the apogee and main charges - loaded, then remotely command the altimeter to fire the - igniters. - </para> - </listitem> - </itemizedlist> - <para> - Operation over the radio link for configuring an altimeter, ground - testing igniters, and so forth uses the same RF frequencies as flight - telemetry. To configure the desired TeleDongle frequency, select - the monitor flight tab, then use the frequency selector and - close the window before performing other desired radio operations. - </para> - <para> - The flight computers only enable radio commanding in 'idle' mode. - TeleMetrum and TeleMega use the accelerometer to detect which orientation they - start up in, so make sure you have the flight computer lying horizontally when you turn - it on. Otherwise, it will start in 'pad' mode ready for - flight, and will not be listening for command packets from TeleDongle. - </para> - <para> - TeleMini listens for a command packet for five seconds after - first being turned on, if it doesn't hear anything, it enters - 'pad' mode, ready for flight and will no longer listen for - command packets. The easiest way to connect to TeleMini is to - initiate the command and select the TeleDongle device. At this - point, the TeleDongle will be attempting to communicate with - the TeleMini. Now turn TeleMini on, and it should immediately - start communicating with the TeleDongle and the desired - operation can be performed. - </para> - <para> - You can monitor the operation of the radio link by watching the - lights on the devices. The red LED will flash each time a packet - is transmitted, while the green LED will light up on TeleDongle when - it is waiting to receive a packet from the altimeter. - </para> - </section> - <section> - <title>Ground Testing </title> - <para> - An important aspect of preparing a rocket using electronic deployment - for flight is ground testing the recovery system. Thanks - to the bi-directional radio link central to the Altus Metrum system, - this can be accomplished in a TeleMega, TeleMetrum or TeleMini equipped rocket - with less work than you may be accustomed to with other systems. It - can even be fun! - </para> - <para> - Just prep the rocket for flight, then power up the altimeter - in “idle” mode (placing air-frame horizontal for TeleMetrum or TeleMega, or - selecting the Configure Altimeter tab for TeleMini). This will cause - the firmware to go into “idle” mode, in which the normal flight - state machine is disabled and charges will not fire without - manual command. You can now command the altimeter to fire the apogee - or main charges from a safe distance using your computer and - TeleDongle and the Fire Igniter tab to complete ejection testing. - </para> - </section> - <section> - <title>Radio Link </title> - <para> - Our flight computers all incorporate an RF transceiver, but - it's not a full duplex system... each end can only be transmitting or - receiving at any given moment. So we had to decide how to manage the - link. - </para> - <para> - By design, the altimeter firmware listens for the radio link when - it's in “idle mode”, which - allows us to use the radio link to configure the rocket, do things like - ejection tests, and extract data after a flight without having to - crack open the air-frame. However, when the board is in “flight - mode”, the altimeter only - transmits and doesn't listen at all. That's because we want to put - ultimate priority on event detection and getting telemetry out of - the rocket through - the radio in case the rocket crashes and we aren't able to extract - data later... - </para> - <para> - We don't generally use a 'normal packet radio' mode like APRS - because they're just too inefficient. The GFSK modulation we - use is FSK with the base-band pulses passed through a Gaussian - filter before they go into the modulator to limit the - transmitted bandwidth. When combined with forward error - correction and interleaving, this allows us to have a very - robust 19.2 kilobit data link with only 10-40 milliwatts of - transmit power, a whip antenna in the rocket, and a hand-held - Yagi on the ground. We've had flights to above 21k feet AGL - with great reception, and calculations suggest we should be - good to well over 40k feet AGL with a 5-element yagi on the - ground with our 10mW units and over 100k feet AGL with the - 40mW devices. We hope to fly boards to higher altitudes over - time, and would of course appreciate customer feedback on - performance in higher altitude flights! - </para> - </section> - <section> - <title>APRS</title> - <para> - TeleMetrum v2.0 and TeleMega can send APRS if desired, and the - interval between APRS packets can be configured. As each APRS - packet takes a full second to transmit, we recommend an - interval of at least 5 seconds to avoid consuming too much - battery power or radio channel bandwidth. You can configure - the APRS interval using AltosUI; that process is described in - the Configure Altimeter section of the AltosUI chapter. - </para> - <para> - AltOS uses the APRS compressed position report data format, - which provides for higher position precision and shorter - packets than the original APRS format. It also includes - altitude data, which is invaluable when tracking rockets. We - haven't found a receiver which doesn't handle compressed - positions, but it's just possible that you have one, so if you - have an older device that can receive the raw packets but - isn't displaying position information, it's possible that this - is the cause. - </para> - <para> - APRS packets include an SSID (Secondary Station Identifier) - field that allows one operator to have multiple - transmitters. AltOS allows you to set this to a single digit - from 0 to 9, allowing you to fly multiple transmitters at the - same time while keeping the identify of each one separate in - the receiver. By default, the SSID is set to the last digit of - the device serial number. - </para> - <para> - The APRS packet format includes a comment field that can have - arbitrary text in it. AltOS uses this to send status - information about the flight computer. It sends four fields as - shown in the following table. - </para> - <table frame='all'> - <title>Altus Metrum APRS Comments</title> - <?dbfo keep-together="always"?> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Field'/> - <colspec align='center' colwidth='*' colname='Example'/> - <colspec align='center' colwidth='4*' colname='Description'/> - <thead> - <row> - <entry align='center'>Field</entry> - <entry align='center'>Example</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>1</entry> - <entry>L</entry> - <entry>GPS Status U for unlocked, L for locked</entry> - </row> - <row> - <entry>2</entry> - <entry>6</entry> - <entry>Number of Satellites in View</entry> - </row> - <row> - <entry>3</entry> - <entry>B4.0</entry> - <entry>Altimeter Battery Voltage</entry> - </row> - <row> - <entry>4</entry> - <entry>A3.7</entry> - <entry>Apogee Igniter Voltage</entry> - </row> - <row> - <entry>5</entry> - <entry>M3.7</entry> - <entry>Main Igniter Voltage</entry> - </row> - <row> - <entry>6</entry> - <entry>1286</entry> - <entry>Device Serial Number</entry> - </row> - </tbody> - </tgroup> - </table> - <para> - Here's an example of an APRS comment showing GPS lock with 6 - satellites in view, a primary battery at 4.0V, and - apogee and main igniters both at 3.7V from device 1286. - <screen> - L6 B4.0 A3.7 M3.7 1286 - </screen> - </para> - <para> - Make sure your primary battery is above 3.8V, any connected - igniters are above 3.5V and GPS is locked with at least 5 or 6 - satellites in view before flying. If GPS is switching between - L and U regularly, then it doesn't have a good lock and you - should wait until it becomes stable. - </para> - <para> - If the GPS receiver loses lock, the APRS data transmitted will - contain the last position for which GPS lock was - available. You can tell that this has happened by noticing - that the GPS status character switches from 'L' to 'U'. Before - GPS has locked, APRS will transmit zero for latitude, - longitude and altitude. - </para> - </section> - <section> - <title>Configurable Parameters</title> - <para> - Configuring an Altus Metrum altimeter for flight is very - simple. Even on our baro-only TeleMini and EasyMini boards, - the use of a Kalman filter means there is no need to set a - “mach delay”. The few configurable parameters can all be set - using AltosUI over USB or or radio link via TeleDongle. Read - the Configure Altimeter section in the AltosUI chapter below - for more information. - </para> - <section> - <title>Radio Frequency</title> - <para> - Altus Metrum boards support radio frequencies in the 70cm - band. By default, the configuration interface provides a - list of 10 “standard” frequencies in 100kHz channels starting at - 434.550MHz. However, the firmware supports use of - any 50kHz multiple within the 70cm band. At any given - launch, we highly recommend coordinating when and by whom each - frequency will be used to avoid interference. And of course, both - altimeter and TeleDongle must be configured to the same - frequency to successfully communicate with each other. - </para> - </section> - <section> - <title>Callsign</title> - <para> - This sets the callsign used for telemetry, APRS and the - packet link. For telemetry and APRS, this is used to - identify the device. For the packet link, the callsign must - match that configured in AltosUI or the link will not - work. This is to prevent accidental configuration of another - Altus Metrum flight computer operating on the same frequency nearby. - </para> - </section> - <section> - <title>Telemetry/RDF/APRS Enable</title> - <para> - You can completely disable the radio while in flight, if - necessary. This doesn't disable the packet link in idle - mode. - </para> - </section> - <section> - <title>Telemetry baud rate</title> - <para> - This sets the modulation bit rate for data transmission for - both telemetry and packet link mode. Lower bit - rates will increase range while reducing the amount of data - that can be sent and increasing battery consumption. All - telemetry is done using a rate 1/2 constraint 4 convolution - code, so the actual data transmission rate is 1/2 of the - modulation bit rate specified here. - </para> - </section> - <section> - <title>APRS Interval</title> - <para> - This selects how often APRS packets are transmitted. Set - this to zero to disable APRS without also disabling the - regular telemetry and RDF transmissions. As APRS takes a - full second to transmit a single position report, we - recommend sending packets no more than once every 5 seconds. - </para> - </section> - <section> - <title>APRS SSID</title> - <para> - This selects the SSID reported in APRS packets. By default, - it is set to the last digit of the serial number, but you - can change this to any value from 0 to 9. - </para> - </section> - <section> - <title>Apogee Delay</title> - <para> - Apogee delay is the number of seconds after the altimeter detects flight - apogee that the drogue charge should be fired. In most cases, this - should be left at the default of 0. However, if you are flying - redundant electronics such as for an L3 certification, you may wish - to set one of your altimeters to a positive delay so that both - primary and backup pyrotechnic charges do not fire simultaneously. - </para> - <para> - The Altus Metrum apogee detection algorithm fires exactly at - apogee. If you are also flying an altimeter like the - PerfectFlite MAWD, which only supports selecting 0 or 1 - seconds of apogee delay, you may wish to set the MAWD to 0 - seconds delay and set the TeleMetrum to fire your backup 2 - or 3 seconds later to avoid any chance of both charges - firing simultaneously. We've flown several air-frames this - way quite happily, including Keith's successful L3 cert. - </para> - </section> - <section> - <title>Apogee Lockout</title> - <para> - Apogee lockout is the number of seconds after boost where - the flight computer will not fire the apogee charge, even if - the rocket appears to be at apogee. This is often called - 'Mach Delay', as it is intended to prevent a flight computer - from unintentionally firing apogee charges due to the pressure - spike that occurrs across a mach transition. Altus Metrum - flight computers include a Kalman filter which is not fooled - by this sharp pressure increase, and so this setting should - be left at the default value of zero to disable it. - </para> - </section> - <section> - <title>Main Deployment Altitude</title> - <para> - By default, the altimeter will fire the main deployment charge at an - elevation of 250 meters (about 820 feet) above ground. We think this - is a good elevation for most air-frames, but feel free to change this - to suit. In particular, if you are flying two altimeters, you may - wish to set the - deployment elevation for the backup altimeter to be something lower - than the primary so that both pyrotechnic charges don't fire - simultaneously. - </para> - </section> - <section> - <title>Maximum Flight Log</title> - <para> - Changing this value will set the maximum amount of flight - log storage that an individual flight will use. The - available storage is divided into as many flights of the - specified size as can fit in the available space. You can - download and erase individual flight logs. If you fill up - the available storage, future flights will not get logged - until you erase some of the stored ones. - </para> - <para> - Even though our flight computers (except TeleMini v1.0) can store - multiple flights, we strongly recommend downloading and saving - flight data after each flight. - </para> - </section> - <section> - <title>Ignite Mode</title> - <para> - Instead of firing one charge at apogee and another charge at - a fixed height above the ground, you can configure the - altimeter to fire both at apogee or both during - descent. This was added to support an airframe Bdale designed that - had two altimeters, one in the fin can and one in the nose. - </para> - <para> - Providing the ability to use both igniters for apogee or - main allows some level of redundancy without needing two - flight computers. In Redundant Apogee or Redundant Main - mode, the two charges will be fired two seconds apart. - </para> - </section> - <section> - <title>Pad Orientation</title> - <para> - TeleMetrum, TeleMega and EasyMega measure acceleration along the axis - of the board. Which way the board is oriented affects the - sign of the acceleration value. Instead of trying to guess - which way the board is mounted in the air frame, the - altimeter must be explicitly configured for either Antenna - Up or Antenna Down. The default, Antenna Up, expects the end - of the board connected to the 70cm antenna to be nearest the - nose of the rocket, with the end containing the screw - terminals nearest the tail. - </para> - </section> - <section> - <title>Configurable Pyro Channels</title> - <para> - In addition to the usual Apogee and Main pyro channels, - TeleMega and EasyMega have four additional channels that can be configured - to activate when various flight conditions are - satisfied. You can select as many conditions as necessary; - all of them must be met in order to activate the - channel. The conditions available are: - </para> - <itemizedlist> - <listitem> - <para> - Acceleration away from the ground. Select a value, and - then choose whether acceleration should be above or - below that value. Acceleration is positive upwards, so - accelerating towards the ground would produce negative - numbers. Acceleration during descent is noisy and - inaccurate, so be careful when using it during these - phases of the flight. - </para> - </listitem> - <listitem> - <para> - Vertical speed. Select a value, and then choose whether - vertical speed should be above or below that - value. Speed is positive upwards, so moving towards the - ground would produce negative numbers. Speed during - descent is a bit noisy and so be careful when using it - during these phases of the flight. - </para> - </listitem> - <listitem> - <para> - Height. Select a value, and then choose whether the - height above the launch pad should be above or below - that value. - </para> - </listitem> - <listitem> - <para> - Orientation. TeleMega and EasyMega contain a 3-axis gyroscope and - accelerometer which is used to measure the current - angle. Note that this angle is not the change in angle - from the launch pad, but rather absolute relative to - gravity; the 3-axis accelerometer is used to compute the - angle of the rocket on the launch pad and initialize the - system. Because this value is computed by integrating - rate gyros, it gets progressively less accurate as the - flight goes on. It should have an accumulated error of - less than 0.2°/second (after 10 seconds of flight, the - error should be less than 2°). - </para> - <para> - The usual use of the orientation configuration is to - ensure that the rocket is traveling mostly upwards when - deciding whether to ignite air starts or additional - stages. For that, choose a reasonable maximum angle - (like 20°) and set the motor igniter to require an angle - of less than that value. - </para> - </listitem> - <listitem> - <para> - Flight Time. Time since boost was detected. Select a - value and choose whether to activate the pyro channel - before or after that amount of time. - </para> - </listitem> - <listitem> - <para> - Ascending. A simple test saying whether the rocket is - going up or not. This is exactly equivalent to testing - whether the speed is > 0. - </para> - </listitem> - <listitem> - <para> - Descending. A simple test saying whether the rocket is - going down or not. This is exactly equivalent to testing - whether the speed is < 0. - </para> - </listitem> - <listitem> - <para> - After Motor. The flight software counts each time the - rocket starts accelerating and then decelerating - (presumably due to a motor or motors burning). Use this - value for multi-staged or multi-airstart launches. - </para> - </listitem> - <listitem> - <para> - Delay. This value doesn't perform any checks, instead it - inserts a delay between the time when the other - parameters become true and when the pyro channel is - activated. - </para> - </listitem> - <listitem> - <para> - Flight State. The flight software tracks the flight - through a sequence of states: - <orderedlist> - <listitem> - <para> - Boost. The motor has lit and the rocket is - accelerating upwards. - </para> - </listitem> - <listitem> - <para> - Fast. The motor has burned out and the rocket is - decelerating, but it is going faster than 200m/s. - </para> - </listitem> - <listitem> - <para> - Coast. The rocket is still moving upwards and - decelerating, but the speed is less than 200m/s. - </para> - </listitem> - <listitem> - <para> - Drogue. The rocket has reached apogee and is heading - back down, but is above the configured Main - altitude. - </para> - </listitem> - <listitem> - <para> - Main. The rocket is still descending, and is below - the Main altitude - </para> - </listitem> - <listitem> - <para> - Landed. The rocket is no longer moving. - </para> - </listitem> - </orderedlist> - </para> - <para> - You can select a state to limit when the pyro channel - may activate; note that the check is based on when the - rocket transitions <emphasis>into</emphasis> the state, and so checking for - “greater than Boost” means that the rocket is currently - in boost or some later state. - </para> - <para> - When a motor burns out, the rocket enters either Fast or - Coast state (depending on how fast it is moving). If the - computer detects upwards acceleration again, it will - move back to Boost state. - </para> - </listitem> - </itemizedlist> - </section> - </section> - - </chapter> - <chapter> - <title>AltosUI</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="altosui.png" width="4.6in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - The AltosUI program provides a graphical user interface for - interacting with the Altus Metrum product family. AltosUI can - monitor telemetry data, configure devices and many other - tasks. The primary interface window provides a selection of - buttons, one for each major activity in the system. This chapter - is split into sections, each of which documents one of the tasks - provided from the top-level toolbar. - </para> - <section> - <title>Monitor Flight</title> - <subtitle>Receive, Record and Display Telemetry Data</subtitle> - <para> - Selecting this item brings up a dialog box listing all of the - connected TeleDongle devices. When you choose one of these, - AltosUI will create a window to display telemetry data as - received by the selected TeleDongle device. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="device-selection.png" width="3.1in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - All telemetry data received are automatically recorded in - suitable log files. The name of the files includes the current - date and rocket serial and flight numbers. - </para> - <para> - The radio frequency being monitored by the TeleDongle device is - displayed at the top of the window. You can configure the - frequency by clicking on the frequency box and selecting the desired - frequency. AltosUI remembers the last frequency selected for each - TeleDongle and selects that automatically the next time you use - that device. - </para> - <para> - Below the TeleDongle frequency selector, the window contains a few - significant pieces of information about the altimeter providing - the telemetry data stream: - </para> - <itemizedlist> - <listitem> - <para>The configured call-sign</para> - </listitem> - <listitem> - <para>The device serial number</para> - </listitem> - <listitem> - <para>The flight number. Each altimeter remembers how many - times it has flown. - </para> - </listitem> - <listitem> - <para> - The rocket flight state. Each flight passes through several - states including Pad, Boost, Fast, Coast, Drogue, Main and - Landed. - </para> - </listitem> - <listitem> - <para> - The Received Signal Strength Indicator value. This lets - you know how strong a signal TeleDongle is receiving. At - the default data rate, 38400 bps, in bench testing, the - radio inside TeleDongle v0.2 operates down to about - -106dBm, while the v3 radio works down to about -111dBm. - Weaker signals, or an environment with radio noise may - cause the data to not be received. The packet link uses - error detection and correction techniques which prevent - incorrect data from being reported. - </para> - </listitem> - <listitem> - <para> - The age of the displayed data, in seconds since the last - successfully received telemetry packet. In normal operation - this will stay in the low single digits. If the number starts - counting up, then you are no longer receiving data over the radio - link from the flight computer. - </para> - </listitem> - </itemizedlist> - <para> - Finally, the largest portion of the window contains a set of - tabs, each of which contain some information about the rocket. - They're arranged in 'flight order' so that as the flight - progresses, the selected tab automatically switches to display - data relevant to the current state of the flight. You can select - other tabs at any time. The final 'table' tab displays all of - the raw telemetry values in one place in a spreadsheet-like format. - </para> - <section> - <title>Launch Pad</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="launch-pad.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - The 'Launch Pad' tab shows information used to decide when the - rocket is ready for flight. The first elements include red/green - indicators, if any of these is red, you'll want to evaluate - whether the rocket is ready to launch: - <variablelist> - <varlistentry> - <term>Battery Voltage</term> - <listitem> - <para> - This indicates whether the Li-Po battery powering the - flight computer has sufficient charge to last for - the duration of the flight. A value of more than - 3.8V is required for a 'GO' status. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Apogee Igniter Voltage</term> - <listitem> - <para> - This indicates whether the apogee - igniter has continuity. If the igniter has a low - resistance, then the voltage measured here will be close - to the Li-Po battery voltage. A value greater than 3.2V is - required for a 'GO' status. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Main Igniter Voltage</term> - <listitem> - <para> - This indicates whether the main - igniter has continuity. If the igniter has a low - resistance, then the voltage measured here will be close - to the Li-Po battery voltage. A value greater than 3.2V is - required for a 'GO' status. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>On-board Data Logging</term> - <listitem> - <para> - This indicates whether there is - space remaining on-board to store flight data for the - upcoming flight. If you've downloaded data, but failed - to erase flights, there may not be any space - left. Most of our flight computers can store multiple - flights, depending on the configured maximum flight log - size. TeleMini v1.0 stores only a single flight, so it - will need to be - downloaded and erased after each flight to capture - data. This only affects on-board flight logging; the - altimeter will still transmit telemetry and fire - ejection charges at the proper times even if the flight - data storage is full. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>GPS Locked</term> - <listitem> - <para> - For a TeleMetrum or TeleMega device, this indicates whether the GPS receiver is - currently able to compute position information. GPS requires - at least 4 satellites to compute an accurate position. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>GPS Ready</term> - <listitem> - <para> - For a TeleMetrum or TeleMega device, this indicates whether GPS has reported at least - 10 consecutive positions without losing lock. This ensures - that the GPS receiver has reliable reception from the - satellites. - </para> - </listitem> - </varlistentry> - </variablelist> - </para> - <para> - The Launchpad tab also shows the computed launch pad position - and altitude, averaging many reported positions to improve the - accuracy of the fix. - </para> - </section> - <section> - <title>Ascent</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="ascent.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - This tab is shown during Boost, Fast and Coast - phases. The information displayed here helps monitor the - rocket as it heads towards apogee. - </para> - <para> - The height, speed, acceleration and tilt are shown along - with the maximum values for each of them. This allows you to - quickly answer the most commonly asked questions you'll hear - during flight. - </para> - <para> - The current latitude and longitude reported by the GPS are - also shown. Note that under high acceleration, these values - may not get updated as the GPS receiver loses position - fix. Once the rocket starts coasting, the receiver should - start reporting position again. - </para> - <para> - Finally, the current igniter voltages are reported as in the - Launch Pad tab. This can help diagnose deployment failures - caused by wiring which comes loose under high acceleration. - </para> - </section> - <section> - <title>Descent</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="descent.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Once the rocket has reached apogee and (we hope) activated the - apogee charge, attention switches to tracking the rocket on - the way back to the ground, and for dual-deploy flights, - waiting for the main charge to fire. - </para> - <para> - To monitor whether the apogee charge operated correctly, the - current descent rate is reported along with the current - height. Good descent rates vary based on the choice of recovery - components, but generally range from 15-30m/s on drogue and should - be below 10m/s when under the main parachute in a dual-deploy flight. - </para> - <para> - With GPS-equipped flight computers, you can locate the rocket in the - sky using the elevation and bearing information to figure - out where to look. Elevation is in degrees above the - horizon. Bearing is reported in degrees relative to true - north. Range can help figure out how big the rocket will - appear. Ground Distance shows how far it is to a point - directly under the rocket and can help figure out where the - rocket is likely to land. Note that all of these values are - relative to the pad location. If the elevation is near 90°, - the rocket is over the pad, not over you. - </para> - <para> - Finally, the igniter voltages are reported in this tab as - well, both to monitor the main charge as well as to see what - the status of the apogee charge is. Note that some commercial - e-matches are designed to retain continuity even after being - fired, and will continue to show as green or return from red to - green after firing. - </para> - </section> - <section> - <title>Landed</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="landed.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Once the rocket is on the ground, attention switches to - recovery. While the radio signal is often lost once the - rocket is on the ground, the last reported GPS position is - generally within a short distance of the actual landing location. - </para> - <para> - The last reported GPS position is reported both by - latitude and longitude as well as a bearing and distance from - the launch pad. The distance should give you a good idea of - whether to walk or hitch a ride. Take the reported - latitude and longitude and enter them into your hand-held GPS - unit and have that compute a track to the landing location. - </para> - <para> - Our flight computers will continue to transmit RDF - tones after landing, allowing you to locate the rocket by - following the radio signal if necessary. You may need to get - away from the clutter of the flight line, or even get up on - a hill (or your neighbor's RV roof) to receive the RDF signal. - </para> - <para> - The maximum height, speed and acceleration reported - during the flight are displayed for your admiring observers. - The accuracy of these immediate values depends on the quality - of your radio link and how many packets were received. - Recovering the on-board data after flight may yield - more precise results. - </para> - <para> - To get more detailed information about the flight, you can - click on the 'Graph Flight' button which will bring up a - graph window for the current flight. - </para> - </section> - <section> - <title>Table</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="table.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - The table view shows all of the data available from the - flight computer. Probably the most useful data on - this tab is the detailed GPS information, which includes - horizontal dilution of precision information, and - information about the signal being received from the satellites. - </para> - </section> - <section> - <title>Site Map</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="site-map.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - When the TeleMetrum has a GPS fix, the Site Map tab will map - the rocket's position to make it easier for you to locate the - rocket, both while it is in the air, and when it has landed. The - rocket's state is indicated by color: white for pad, red for - boost, pink for fast, yellow for coast, light blue for drogue, - dark blue for main, and black for landed. - </para> - <para> - The map's default scale is approximately 3m (10ft) per pixel. The map - can be dragged using the left mouse button. The map will attempt - to keep the rocket roughly centered while data is being received. - </para> - <para> - You can adjust the style of map and the zoom level with - buttons on the right side of the map window. You can draw a - line on the map by moving the mouse over the map with a - button other than the left one pressed, or by pressing the - left button while also holding down the shift key. The - length of the line in real-world units will be shown at the - start of the line. - </para> - <para> - Images are fetched automatically via the Google Maps Static API, - and cached on disk for reuse. If map images cannot be downloaded, - the rocket's path will be traced on a dark gray background - instead. - </para> - <para> - You can pre-load images for your favorite launch sites - before you leave home; check out the 'Preload Maps' section below. - </para> - </section> - <section> - <title>Ignitor</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="ignitor.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - TeleMega includes four additional programmable pyro - channels. The Ignitor tab shows whether each of them has - continuity. If an ignitor has a low resistance, then the - voltage measured here will be close to the pyro battery - voltage. A value greater than 3.2V is required for a 'GO' - status. - </para> - </section> - </section> - <section> - <title>Save Flight Data</title> - <para> - The altimeter records flight data to its internal flash memory. - TeleMetrum data is recorded at a much higher rate than the telemetry - system can handle, and is not subject to radio drop-outs. As - such, it provides a more complete and precise record of the - flight. The 'Save Flight Data' button allows you to read the - flash memory and write it to disk. - </para> - <para> - Clicking on the 'Save Flight Data' button brings up a list of - connected flight computers and TeleDongle devices. If you select a - flight computer, the flight data will be downloaded from that - device directly. If you select a TeleDongle device, flight data - will be downloaded from a flight computer over radio link via the - specified TeleDongle. See the chapter on Controlling An Altimeter - Over The Radio Link for more information. - </para> - <para> - After the device has been selected, a dialog showing the - flight data saved in the device will be shown allowing you to - select which flights to download and which to delete. With - version 0.9 or newer firmware, you must erase flights in order - for the space they consume to be reused by another - flight. This prevents accidentally losing flight data - if you neglect to download data before flying again. Note that - if there is no more space available in the device, then no - data will be recorded during the next flight. - </para> - <para> - The file name for each flight log is computed automatically - from the recorded flight date, altimeter serial number and - flight number information. - </para> - </section> - <section> - <title>Replay Flight</title> - <para> - Select this button and you are prompted to select a flight - record file, either a .telem file recording telemetry data or a - .eeprom file containing flight data saved from the altimeter - flash memory. - </para> - <para> - Once a flight record is selected, the flight monitor interface - is displayed and the flight is re-enacted in real time. Check - the Monitor Flight chapter above to learn how this window operates. - </para> - </section> - <section> - <title>Graph Data</title> - <para> - Select this button and you are prompted to select a flight - record file, either a .telem file recording telemetry data or a - .eeprom file containing flight data saved from - flash memory. - </para> - <para> - Note that telemetry files will generally produce poor graphs - due to the lower sampling rate and missed telemetry packets. - Use saved flight data in .eeprom files for graphing where possible. - </para> - <para> - Once a flight record is selected, a window with multiple tabs is - opened. - </para> - <section> - <title>Flight Graph</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="graph.png" width="6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - By default, the graph contains acceleration (blue), - velocity (green) and altitude (red). - </para> - <para> - The graph can be zoomed into a particular area by clicking and - dragging down and to the right. Once zoomed, the graph can be - reset by clicking and dragging up and to the left. Holding down - control and clicking and dragging allows the graph to be panned. - The right mouse button causes a pop-up menu to be displayed, giving - you the option save or print the plot. - </para> - </section> - <section> - <title>Configure Graph</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="graph-configure.png" width="6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - This selects which graph elements to show, and, at the - very bottom, lets you switch between metric and - imperial units - </para> - </section> - <section> - <title>Flight Statistics</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="graph-stats.png" width="6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Shows overall data computed from the flight. - </para> - </section> - <section> - <title>Map</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="graph-map.png" width="6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Shows a satellite image of the flight area overlaid - with the path of the flight. The red concentric - circles mark the launch pad, the black concentric - circles mark the landing location. - </para> - </section> - </section> - <section> - <title>Export Data</title> - <para> - This tool takes the raw data files and makes them available for - external analysis. When you select this button, you are prompted to - select a flight data file, which can be either a .eeprom or .telem. - The .eeprom files contain higher resolution and more continuous data, - while .telem files contain receiver signal strength information. - Next, a second dialog appears which is used to select - where to write the resulting file. It has a selector to choose - between CSV and KML file formats. - </para> - <section> - <title>Comma Separated Value Format</title> - <para> - This is a text file containing the data in a form suitable for - import into a spreadsheet or other external data analysis - tool. The first few lines of the file contain the version and - configuration information from the altimeter, then - there is a single header line which labels all of the - fields. All of these lines start with a '#' character which - many tools can be configured to skip over. - </para> - <para> - The remaining lines of the file contain the data, with each - field separated by a comma and at least one space. All of - the sensor values are converted to standard units, with the - barometric data reported in both pressure, altitude and - height above pad units. - </para> - </section> - <section> - <title>Keyhole Markup Language (for Google Earth)</title> - <para> - This is the format used by Google Earth to provide an overlay - within that application. With this, you can use Google Earth to - see the whole flight path in 3D. - </para> - </section> - </section> - <section> - <title>Configure Altimeter</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="configure-altimeter.png" width="3.6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Select this button and then select either an altimeter or - TeleDongle Device from the list provided. Selecting a TeleDongle - device will use the radio link to configure a remote altimeter. - </para> - <para> - The first few lines of the dialog provide information about the - connected device, including the product name, - software version and hardware serial number. Below that are the - individual configuration entries. - </para> - <para> - At the bottom of the dialog, there are four buttons: - </para> - <variablelist> - <varlistentry> - <term>Save</term> - <listitem> - <para> - This writes any changes to the - configuration parameter block in flash memory. If you don't - press this button, any changes you make will be lost. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Reset</term> - <listitem> - <para> - This resets the dialog to the most recently saved values, - erasing any changes you have made. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Reboot</term> - <listitem> - <para> - This reboots the device. Use this to - switch from idle to pad mode by rebooting once the rocket is - oriented for flight, or to confirm changes you think you saved - are really saved. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Close</term> - <listitem> - <para> - This closes the dialog. Any unsaved changes will be - lost. - </para> - </listitem> - </varlistentry> - </variablelist> - <para> - The rest of the dialog contains the parameters to be configured. - </para> - <section> - <title>Main Deploy Altitude</title> - <para> - This sets the altitude (above the recorded pad altitude) at - which the 'main' igniter will fire. The drop-down menu shows - some common values, but you can edit the text directly and - choose whatever you like. If the apogee charge fires below - this altitude, then the main charge will fire two seconds - after the apogee charge fires. - </para> - </section> - <section> - <title>Apogee Delay</title> - <para> - When flying redundant electronics, it's often important to - ensure that multiple apogee charges don't fire at precisely - the same time, as that can over pressurize the apogee deployment - bay and cause a structural failure of the air-frame. The Apogee - Delay parameter tells the flight computer to fire the apogee - charge a certain number of seconds after apogee has been - detected. - </para> - </section> - <section> - <title>Apogee Lockoug</title> - <para> - Apogee lockout is the number of seconds after boost where - the flight computer will not fire the apogee charge, even if - the rocket appears to be at apogee. This is often called - 'Mach Delay', as it is intended to prevent a flight computer - from unintentionally firing apogee charges due to the pressure - spike that occurrs across a mach transition. Altus Metrum - flight computers include a Kalman filter which is not fooled - by this sharp pressure increase, and so this setting should - be left at the default value of zero to disable it. - </para> - </section> - <section> - <title>Frequency</title> - <para> - This configures which of the frequencies to use for both - telemetry and packet command mode. Note that if you set this - value via packet command mode, the TeleDongle frequency will - also be automatically reconfigured to match so that - communication will continue afterwards. - </para> - </section> - <section> - <title>RF Calibration</title> - <para> - The radios in every Altus Metrum device are calibrated at the - factory to ensure that they transmit and receive on the - specified frequency. If you need to you can adjust the calibration - by changing this value. Do not do this without understanding what - the value means, read the appendix on calibration and/or the source - code for more information. To change a TeleDongle's calibration, - you must reprogram the unit completely. - </para> - </section> - <section> - <title>Telemetry/RDF/APRS Enable</title> - <para> - Enables the radio for transmission during flight. When - disabled, the radio will not transmit anything during flight - at all. - </para> - </section> - <section> - <title>Telemetry baud rate</title> - <para> - This sets the modulation bit rate for data transmission for - both telemetry and packet link mode. Lower bit - rates will increase range while reducing the amount of data - that can be sent and increasing battery consumption. All - telemetry is done using a rate 1/2 constraint 4 convolution - code, so the actual data transmission rate is 1/2 of the - modulation bit rate specified here. - </para> - </section> - <section> - <title>APRS Interval</title> - <para> - How often to transmit GPS information via APRS (in - seconds). When set to zero, APRS transmission is - disabled. This option is available on TeleMetrum v2 and - TeleMega boards. TeleMetrum v1 boards cannot transmit APRS - packets. Note that a single APRS packet takes nearly a full - second to transmit, so enabling this option will prevent - sending any other telemetry during that time. - </para> - </section> - <section> - <title>APRS SSID</title> - <para> - Which SSID to report in APRS packets. By default, this is - set to the last digit of the serial number, but can be - configured to any value from 0 to 9. - </para> - </section> - <section> - <title>Callsign</title> - <para> - This sets the call sign included in each telemetry packet. Set this - as needed to conform to your local radio regulations. - </para> - </section> - <section> - <title>Maximum Flight Log Size</title> - <para> - This sets the space (in kilobytes) allocated for each flight - log. The available space will be divided into chunks of this - size. A smaller value will allow more flights to be stored, - a larger value will record data from longer flights. - </para> - </section> - <section> - <title>Ignitor Firing Mode</title> - <para> - This configuration parameter allows the two standard ignitor - channels (Apogee and Main) to be used in different - configurations. - </para> - <variablelist> - <varlistentry> - <term>Dual Deploy</term> - <listitem> - <para> - This is the usual mode of operation; the - 'apogee' channel is fired at apogee and the 'main' - channel at the height above ground specified by the - 'Main Deploy Altitude' during descent. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Redundant Apogee</term> - <listitem> - <para> - This fires both channels at - apogee, the 'apogee' channel first followed after a two second - delay by the 'main' channel. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Redundant Main</term> - <listitem> - <para> - This fires both channels at the - height above ground specified by the Main Deploy - Altitude setting during descent. The 'apogee' - channel is fired first, followed after a two second - delay by the 'main' channel. - </para> - </listitem> - </varlistentry> - </variablelist> - </section> - <section> - <title>Pad Orientation</title> - <para> - Because they include accelerometers, TeleMetrum, - TeleMega and EasyMega are sensitive to the orientation of the board. By - default, they expect the antenna end to point forward. This - parameter allows that default to be changed, permitting the - board to be mounted with the antenna pointing aft instead. - </para> - <variablelist> - <varlistentry> - <term>Antenna Up</term> - <listitem> - <para> - In this mode, the antenna end of the - flight computer must point forward, in line with the - expected flight path. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Antenna Down</term> - <listitem> - <para> - In this mode, the antenna end of the - flight computer must point aft, in line with the - expected flight path. - </para> - </listitem> - </varlistentry> - </variablelist> - </section> - <section> - <title>Beeper Frequency</title> - <para> - The beeper on all Altus Metrum flight computers works best - at 4000Hz, however if you have more than one flight computer - in a single airframe, having all of them sound at the same - frequency can be confusing. This parameter lets you adjust - the base beeper frequency value. - </para> - </section> - <section> - <title>Configure Pyro Channels</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="configure-pyro.png" width="6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - This opens a separate window to configure the additional - pyro channels available on TeleMega and EasyMega. One column is - presented for each channel. Each row represents a single - parameter, if enabled the parameter must meet the specified - test for the pyro channel to be fired. See the Pyro Channels - section in the System Operation chapter above for a - description of these parameters. - </para> - <para> - Select conditions and set the related value; the pyro - channel will be activated when <emphasis>all</emphasis> of the - conditions are met. Each pyro channel has a separate set of - configuration values, so you can use different values for - the same condition with different channels. - </para> - <para> - At the bottom of the window, the 'Pyro Firing Time' - configuration sets the length of time (in seconds) which - each of these pyro channels will fire for. - </para> - <para> - Once you have selected the appropriate configuration for all - of the necessary pyro channels, you can save the pyro - configuration along with the rest of the flight computer - configuration by pressing the 'Save' button in the main - Configure Flight Computer window. - </para> - </section> - </section> - <section> - <title>Configure AltosUI</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="configure-altosui.png" width="2.4in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - This button presents a dialog so that you can configure the AltosUI global settings. - </para> - <section> - <title>Voice Settings</title> - <para> - AltosUI provides voice announcements during flight so that you - can keep your eyes on the sky and still get information about - the current flight status. However, sometimes you don't want - to hear them. - </para> - <variablelist> - <varlistentry> - <term>Enable</term> - <listitem> - <para>Turns all voice announcements on and off</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Test Voice</term> - <listitem> - <para> - Plays a short message allowing you to verify - that the audio system is working and the volume settings - are reasonable - </para> - </listitem> - </varlistentry> - </variablelist> - </section> - <section> - <title>Log Directory</title> - <para> - AltosUI logs all telemetry data and saves all TeleMetrum flash - data to this directory. This directory is also used as the - staring point when selecting data files for display or export. - </para> - <para> - Click on the directory name to bring up a directory choosing - dialog, select a new directory and click 'Select Directory' to - change where AltosUI reads and writes data files. - </para> - </section> - <section> - <title>Callsign</title> - <para> - This value is transmitted in each command packet sent from - TeleDongle and received from an altimeter. It is not used in - telemetry mode, as the callsign configured in the altimeter board - is included in all telemetry packets. Configure this - with the AltosUI operators call sign as needed to comply with - your local radio regulations. - </para> - <para> - Note that to successfully command a flight computer over the radio - (to configure the altimeter, monitor idle, or fire pyro charges), - the callsign configured here must exactly match the callsign - configured in the flight computer. This matching is case - sensitive. - </para> - </section> - <section> - <title>Imperial Units</title> - <para> - This switches between metric units (meters) and imperial - units (feet and miles). This affects the display of values - use during flight monitoring, configuration, data graphing - and all of the voice announcements. It does not change the - units used when exporting to CSV files, those are always - produced in metric units. - </para> - </section> - <section> - <title>Font Size</title> - <para> - Selects the set of fonts used in the flight monitor - window. Choose between the small, medium and large sets. - </para> - </section> - <section> - <title>Serial Debug</title> - <para> - This causes all communication with a connected device to be - dumped to the console from which AltosUI was started. If - you've started it from an icon or menu entry, the output - will simply be discarded. This mode can be useful to debug - various serial communication issues. - </para> - </section> - <section> - <title>Manage Frequencies</title> - <para> - This brings up a dialog where you can configure the set of - frequencies shown in the various frequency menus. You can - add as many as you like, or even reconfigure the default - set. Changing this list does not affect the frequency - settings of any devices, it only changes the set of - frequencies shown in the menus. - </para> - </section> - </section> - <section> - <title>Configure Groundstation</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="configure-groundstation.png" width="3.1in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Select this button and then select a TeleDongle or TeleBT Device from the list provided. - </para> - <para> - The first few lines of the dialog provide information about the - connected device, including the product name, - software version and hardware serial number. Below that are the - individual configuration entries. - </para> - <para> - Note that TeleDongle and TeleBT don't save any configuration - data, the settings here are recorded on the local machine in - the Java preferences database. Moving the device to - another machine, or using a different user account on the same - machine will cause settings made here to have no effect. - </para> - <para> - At the bottom of the dialog, there are three buttons: - </para> - <variablelist> - <varlistentry> - <term>Save</term> - <listitem> - <para> - This writes any changes to the - local Java preferences file. If you don't - press this button, any changes you make will be lost. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Reset</term> - <listitem> - <para> - This resets the dialog to the most recently saved values, - erasing any changes you have made. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Close</term> - <listitem> - <para> - This closes the dialog. Any unsaved changes will be - lost. - </para> - </listitem> - </varlistentry> - </variablelist> - <para> - The rest of the dialog contains the parameters to be configured. - </para> - <section> - <title>Frequency</title> - <para> - This configures the frequency to use for both telemetry and - packet command mode. Set this before starting any operation - involving packet command mode so that it will use the right - frequency. Telemetry monitoring mode also provides a menu to - change the frequency, and that menu also sets the same Java - preference value used here. - </para> - </section> - <section> - <title>RF Calibration</title> - <para> - The radios in every Altus Metrum device are calibrated at the - factory to ensure that they transmit and receive on the - specified frequency. To change a TeleDongle or TeleBT's calibration, - you must reprogram the unit completely, so this entry simply - shows the current value and doesn't allow any changes. - </para> - </section> - <section> - <title>Telemetry Rate</title> - <para> - This lets you match the telemetry and packet link rate from - the transmitter. If they don't match, the device won't - receive any data. - </para> - </section> - </section> - <section> - <title>Flash Image</title> - <para> - This reprograms Altus Metrum devices with new - firmware. TeleMetrum v1.x, TeleDongle v0.2, TeleMini and - TeleBT are all reprogrammed by using another similar unit as a - programming dongle (pair programming). TeleMega, EasyMega, - TeleMetrum v2, EasyMini and TeleDongle v3 are all programmed - directly over their USB ports (self programming). Please read - the directions for flashing devices in the Updating Device - Firmware chapter below. - </para> - </section> - <section> - <title>Fire Igniter</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="fire-igniter.png" width="1.2in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - This activates the igniter circuits in the flight computer to help - test recovery systems deployment. Because this command can operate - over the Packet Command Link, you can prepare the rocket as - for flight and then test the recovery system without needing - to snake wires inside the air-frame. - </para> - <para> - Selecting the 'Fire Igniter' button brings up the usual device - selection dialog. Pick the desired device. This brings up another - window which shows the current continuity test status for all - of the pyro channels. - </para> - <para> - Next, select the desired igniter to fire. This will enable the - 'Arm' button. - </para> - <para> - Select the 'Arm' button. This enables the 'Fire' button. The - word 'Arm' is replaced by a countdown timer indicating that - you have 10 seconds to press the 'Fire' button or the system - will deactivate, at which point you start over again at - selecting the desired igniter. - </para> - </section> - <section> - <title>Scan Channels</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="scan-channels.png" width="3.2in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - This listens for telemetry packets on all of the configured - frequencies, displaying information about each device it - receives a packet from. You can select which of the baud rates - and telemetry formats should be tried; by default, it only listens - at 38400 baud with the standard telemetry format used in v1.0 and later - firmware. - </para> - </section> - <section> - <title>Load Maps</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="load-maps.png" width="5.2in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Before heading out to a new launch site, you can use this to - load satellite images in case you don't have internet - connectivity at the site. - </para> - <para> - There's a drop-down menu of launch sites we know about; if - your favorites aren't there, please let us know the lat/lon - and name of the site. The contents of this list are actually - downloaded from our server at run-time, so as new sites are sent - in, they'll get automatically added to this list. - If the launch site isn't in the list, you can manually enter the lat/lon values - </para> - <para> - There are four different kinds of maps you can view; you can - select which to download by selecting as many as you like from - the available types: - <variablelist> - <varlistentry> - <term>Hybrid</term> - <listitem> - <para> - A combination of satellite imagery and road data. This - is the default view. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Satellite</term> - <listitem> - <para> - Just the satellite imagery without any annotation. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Roadmap</term> - <listitem> - <para> - Roads, political boundaries and a few geographic features. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Terrain</term> - <listitem> - <para> - Contour intervals and shading that show hills and - valleys. - </para> - </listitem> - </varlistentry> - </variablelist> - </para> - <para> - You can specify the range of zoom levels to download; smaller - numbers show more area with less resolution. The default - level, 0, shows about 3m/pixel. One zoom level change - doubles or halves that number. Larger zoom levels show more - detail, smaller zoom levels less. - </para> - <para> - The Map Radius value sets how large an area around the center - point to download. Select a value large enough to cover any - plausible flight from that site. Be aware that loading a large - area with a high maximum zoom level can attempt to download a - lot of data. Loading hybrid maps with a 10km radius at a - minimum zoom of -2 and a maximum zoom of 2 consumes about - 120MB of space. Terrain and road maps consume about 1/10 as - much space as satellite or hybrid maps. - </para> - <para> - Clicking the 'Load Map' button will fetch images from Google - Maps; note that Google limits how many images you can fetch at - once, so if you load more than one launch site, you may get - some gray areas in the map which indicate that Google is tired - of sending data to you. Try again later. - </para> - </section> - <section> - <title>Monitor Idle</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="monitor-idle.png" width="5.2in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - This brings up a dialog similar to the Monitor Flight UI, - except it works with the altimeter in “idle” mode by sending - query commands to discover the current state rather than - listening for telemetry packets. Because this uses command - mode, it needs to have the TeleDongle and flight computer - callsigns match exactly. If you can receive telemetry, but - cannot manage to run Monitor Idle, then it's very likely that - your callsigns are different in some way. - </para> - <para> - You can change the frequency and callsign used to communicate - with the flight computer; they must both match the - configuration in the flight computer exactly. - </para> - </section> - </chapter> - <chapter> - <title>AltosDroid</title> - <para> - AltosDroid provides the same flight monitoring capabilities as - AltosUI, but runs on Android devices. AltosDroid is designed to connect - to a TeleBT receiver over Bluetooth™ and (on Android devices supporting - USB On-the-go) TeleDongle and TeleBT devices over USB. AltosDroid monitors - telemetry data, logging it to internal storage in the Android - device, and presents that data in a UI similar to the 'Monitor - Flight' window in AltosUI. - </para> - <para> - This manual will explain how to configure AltosDroid, connect to - TeleBT or TeleDongle, operate the flight monitoring interface - and describe what the displayed data means. - </para> - <section> - <title>Installing AltosDroid</title> - <para> - AltosDroid is available from the Google Play store. To install - it on your Android device, open the Google Play Store - application and search for “altosdroid”. Make sure you don't - have a space between “altos” and “droid” or you probably won't - find what you want. That should bring you to the right page - from which you can download and install the application. - </para> - </section> - <section> - <title>Charging TeleBT Battery</title> - <para> - Before using TeleBT with AltosDroid, make sure the internal - TeleBT battery is charged. To do this, attach a micro USB - cable from a computer or other USB power source to TeleBT. - A dual LED on the circuit board should illuminate, showing - red while the battery is charging, green when charging is - completed, and both red and green on at the same time if - there is a battery fault. - </para> - </section> - <section> - <title>Connecting to TeleBT over Bluetooth™</title> - <para> - Press the Android 'Menu' button or soft-key to see the - configuration options available. Select the 'Connect a device' - option and then the 'Scan for devices' entry at the bottom to - look for your TeleBT device. Select your device, and when it - asks for the code, enter '1234'. - </para> - <para> - Subsequent connections will not require you to enter that - code, and your 'paired' device will appear in the list without - scanning. - </para> - </section> - <section> - <title>Connecting to TeleDongle or TeleBT over USB</title> - <para> - Get a special USB On-the-go adapter cable. These cables have a USB - micro-B male connector on one end and a standard A female - connector on the other end. Plug in your TeleDongle or TeleBT - device to the adapter cable and the adapter cable into your - phone and AltosDroid should automatically start up. If it - doesn't, the most likely reason is that your Android device - doesn't support USB On-the-go. - </para> - </section> - <section> - <title>Configuring AltosDroid</title> - <para> - There are several configuration and operation parameters - available in the AltosDroid menu. - </para> - <section> - <title>Select radio frequency</title> - <para> - This selects which frequency to listen on by bringing up a - menu of pre-set radio frequencies. Pick the one which matches - your altimeter. - </para> - </section> - <section> - <title>Select data rate</title> - <para> - Altus Metrum transmitters can be configured to operate at - lower data rates to improve transmission range. If you have - configured your device to do this, this menu item allows you - to change the receiver to match. - </para> - </section> - <section> - <title>Change units</title> - <para> - This toggles between metric and imperial units. - </para> - </section> - <section> - <title>Load maps</title> - <para> - Brings up a dialog allowing you to download offline map - tiles so that you can have maps available even if you have - no network connectivity at the launch site. - </para> - </section> - <section> - <title>Map type</title> - <para> - Displays a menu of map types and lets you select one. Hybrid - maps include satellite images with a roadmap - overlaid. Satellite maps dispense with the roadmap - overlay. Roadmap shows just the roads. Terrain includes - roads along with shadows indicating changes in elevation, - and other geographical features. - </para> - </section> - <section> - <title>Toggle Online/Offline maps</title> - <para> - Switches between online and offline maps. Online maps will - show a 'move to current position' icon in the upper right - corner, while offline maps will have copyright information - all over the map. Otherwise, they're pretty similar. - </para> - </section> - <section> - <title>Select Tracker</title> - <para> - Switches the information displays to show data for a - different transmitting device. The map will always show all - of the devices in view. Trackers are shown and selected by - serial number, so make sure you note the serial number of - devices in each airframe. - </para> - </section> - <section> - <title>Delete Track</title> - <para> - Deletes all information about a transmitting device. - </para> - </section> - </section> - <section> - <title>AltosDroid Flight Monitoring</title> - <para> - AltosDroid is designed to mimic the AltosUI flight monitoring - display, providing separate tabs for each stage of your rocket - flight along with a tab containing a map of the local area - with icons marking the current location of the altimeter and - the Android device. - </para> - <section> - <title>Pad</title> - <para> - The 'Pad' tab shows information used to decide when the - rocket is ready for flight. The first elements include red/green - indicators, if any of these is red, you'll want to evaluate - whether the rocket is ready to launch. - </para> - <para> - When the pad tab is selected, the voice responses will - include status changes to the igniters and GPS reception, - letting you know if the rocket is still ready for launch. - </para> - <variablelist> - <varlistentry> - <term>Battery</term> - <listitem> - <para> - This indicates whether the Li-Po battery - powering the transmitter has sufficient charge to last for - the duration of the flight. A value of more than - 3.8V is required for a 'GO' status. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Receiver Battery</term> - <listitem> - <para> - This indicates whether the Li-Po battery - powering the TeleBT has sufficient charge to last for - the duration of the flight. A value of more than - 3.8V is required for a 'GO' status. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Data Logging</term> - <listitem> - <para> - This indicates whether there is space remaining - on-board to store flight data for the upcoming - flight. If you've downloaded data, but failed to - erase flights, there may not be any space - left. TeleMetrum and TeleMega can store multiple - flights, depending on the configured maximum flight - log size. TeleGPS logs data continuously. TeleMini - stores only a single flight, so it will need to be - downloaded and erased after each flight to capture - data. This only affects on-board flight logging; the - altimeter will still transmit telemetry and fire - ejection charges at the proper times. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>GPS Locked</term> - <listitem> - <para> - For a TeleMetrum or TeleMega device, this indicates whether the GPS receiver is - currently able to compute position information. GPS requires - at least 4 satellites to compute an accurate position. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>GPS Ready</term> - <listitem> - <para> - For a TeleMetrum or TeleMega device, this indicates whether GPS has reported at least - 10 consecutive positions without losing lock. This ensures - that the GPS receiver has reliable reception from the - satellites. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Apogee Igniter</term> - <listitem> - <para> - This indicates whether the apogee - igniter has continuity. If the igniter has a low - resistance, then the voltage measured here will be close - to the Li-Po battery voltage. A value greater than 3.2V is - required for a 'GO' status. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Main Igniter</term> - <listitem> - <para> - This indicates whether the main - igniter has continuity. If the igniter has a low - resistance, then the voltage measured here will be close - to the Li-Po battery voltage. A value greater than 3.2V is - required for a 'GO' status. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Igniter A-D</term> - <listitem> - <para> - This indicates whether the indicated additional pyro - channel igniter has continuity. If the igniter has a - low resistance, then the voltage measured here will - be close to the Li-Po battery voltage. A value - greater than 3.2V is required for a 'GO' status. - </para> - </listitem> - </varlistentry> - </variablelist> - <para> - The Pad tab also shows the location of the Android device. - </para> - </section> - <section> - <title>Flight</title> - <para> - The 'Flight' tab shows information used to evaluate and spot - a rocket while in flight. It displays speed and height data - to monitor the health of the rocket, along with elevation, - range and bearing to help locate the rocket in the sky. - </para> - <para> - While the Flight tab is displayed, the voice announcements - will include current speed, height, elevation and bearing - information. - </para> - <variablelist> - <varlistentry> - <term>Speed</term> - <listitem> - <para> - Shows current vertical speed. During descent, the - speed values are averaged over a fairly long time to - try and make them steadier. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Height</term> - <listitem> - <para> - Shows the current height above the launch pad. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Max Speed</term> - <listitem> - <para> - Shows the maximum vertical speed seen during the flight. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Max Height</term> - <listitem> - <para> - Shows the maximum height above launch pad. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Elevation</term> - <listitem> - <para> - This is the angle above the horizon from the android - devices current position. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Range</term> - <listitem> - <para> - The total distance from the android device to the - rocket, including both ground distance and - difference in altitude. Use this to gauge how large - the rocket is likely to appear in the sky. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Bearing</term> - <listitem> - <para> - This is the aziumuth from true north for the rocket - from the android device. Use this in combination - with the Elevation value to help locate the rocket - in the sky, or at least to help point the antenna in - the general direction. This is provided in both - degrees and a compass point (like West South - West). You'll want to know which direction is true - north before launching your rocket. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Ground Distance</term> - <listitem> - <para> - This shows the distance across the ground to the - lat/lon where the rocket is located. Use this to - estimate what is currently under the rocket. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Latitude/Longitude</term> - <listitem> - <para> - Displays the last known location of the rocket. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Apogee Igniter</term> - <listitem> - <para> - This indicates whether the apogee - igniter has continuity. If the igniter has a low - resistance, then the voltage measured here will be close - to the Li-Po battery voltage. A value greater than 3.2V is - required for a 'GO' status. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Main Igniter</term> - <listitem> - <para> - This indicates whether the main - igniter has continuity. If the igniter has a low - resistance, then the voltage measured here will be close - to the Li-Po battery voltage. A value greater than 3.2V is - required for a 'GO' status. - </para> - </listitem> - </varlistentry> - </variablelist> - </section> - <section> - <title>Recover</title> - <para> - The 'Recover' tab shows information used while recovering the - rocket on the ground after flight. - </para> - <para> - While the Recover tab is displayed, the voice announcements - will include distance along with either bearing or - direction, depending on whether you are moving. - </para> - <variablelist> - <varlistentry> - <term>Bearing</term> - <listitem> - <para> - This is the aziumuth from true north for the rocket - from the android device. Use this in combination - with the Elevation value to help locate the rocket - in the sky, or at least to help point the antenna in - the general direction. This is provided in both - degrees and a compass point (like West South - West). You'll want to know which direction is true - north before launching your rocket. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Direction</term> - <listitem> - <para> - When you are in motion, this provides the angle from - your current direction of motion towards the rocket. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Distance</term> - <listitem> - <para> - Distance over the ground to the rocket. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Tar Lat/Tar Lon</term> - <listitem> - <para> - Displays the last known location of the rocket. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>My Lat/My Lon</term> - <listitem> - <para> - Displays the location of the Android device. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Max Height</term> - <listitem> - <para> - Shows the maximum height above launch pad. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Max Speed</term> - <listitem> - <para> - Shows the maximum vertical speed seen during the flight. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Max Accel</term> - <listitem> - <para> - Shows the maximum vertical acceleration seen during the flight. - </para> - </listitem> - </varlistentry> - </variablelist> - </section> - <section> - <title>Map</title> - <para> - The 'Map' tab shows a map of the area around the rocket - being tracked along with information needed to recover it. - </para> - <para> - On the map itself, icons showing the location of the android - device along with the last known location of each tracker. A - blue line is drawn from the android device location to the - currently selected tracker. - </para> - <para> - Below the map, the distance and either bearing or direction - along with the lat/lon of the target and the android device - are shown - </para> - <para> - The Map tab provides the same voice announcements as the - Recover tab. - </para> - </section> - </section> - <section> - <title>Downloading Flight Logs</title> - <para> - AltosDroid always saves every bit of telemetry data it - receives. To download that to a computer for use with AltosUI, - remove the SD card from your Android device, or connect your - device to your computer's USB port and browse the files on - that device. You will find '.telem' files in the TeleMetrum - directory that will work with AltosUI directly. - </para> - </section> - </chapter> - <chapter> - <title>Using Altus Metrum Products</title> - <section> - <title>Being Legal</title> - <para> - First off, in the US, you need an <ulink url="http://www.altusmetrum.org/Radio/">amateur radio license</ulink> or - other authorization to legally operate the radio transmitters that are part - of our products. - </para> - </section> - <section> - <title>In the Rocket</title> - <para> - In the rocket itself, you just need a flight computer and - a single-cell, 3.7 volt nominal Li-Po rechargeable battery. An - 850mAh battery weighs less than a 9V alkaline battery, and will - run a TeleMetrum, TeleMega or EasyMega for hours. - A 110mAh battery weighs less than a triple A battery and is a good - choice for use with TeleMini or EasyMini. - </para> - <para> - By default, we ship TeleMini, TeleMetrum and TeleMega flight computers with a simple wire antenna. - If your electronics bay or the air-frame it resides within is made - of carbon fiber, which is opaque to RF signals, you may prefer to - install an SMA connector so that you can run a coaxial cable to an - antenna mounted elsewhere in the rocket. However, note that the - GPS antenna is fixed on all current products, so you really want - to install the flight computer in a bay made of RF-transparent - materials if at all possible. - </para> - </section> - <section> - <title>On the Ground</title> - <para> - To receive the data stream from the rocket, you need an antenna and short - feed-line connected to one of our <ulink url="http://www.altusmetrum.org/TeleDongle/">TeleDongle</ulink> units. If possible, use an SMA to BNC - adapter instead of feedline between the antenna feedpoint and - TeleDongle, as this will give you the best performance. The - TeleDongle in turn plugs directly into the USB port on a notebook - computer. Because TeleDongle looks like a simple serial port, your computer - does not require special device drivers... just plug it in. - </para> - <para> - The GUI tool, AltosUI, is written in Java and runs across - Linux, Mac OS and Windows. There's also a suite of C tools - for Linux which can perform most of the same tasks. - </para> - <para> - Alternatively, a TeleBT attached with an SMA to BNC adapter at the - feed point of a hand-held yagi used in conjunction with an Android - device running AltosDroid makes an outstanding ground station. - </para> - <para> - After the flight, you can use the radio link to extract the more detailed data - logged in either TeleMetrum or TeleMini devices, or you can use a mini USB cable to plug into the - TeleMetrum board directly. Pulling out the data without having to open up - the rocket is pretty cool! A USB cable is also how you charge the Li-Po - battery, so you'll want one of those anyway... the same cable used by lots - of digital cameras and other modern electronic stuff will work fine. - </para> - <para> - If your rocket lands out of sight, you may enjoy having a hand-held - GPS receiver, so that you can put in a way-point for the last - reported rocket position before touch-down. This makes looking for - your rocket a lot like Geo-Caching... just go to the way-point and - look around starting from there. AltosDroid on an Android device - with GPS receiver works great for this, too! - </para> - <para> - You may also enjoy having a ham radio “HT” that covers the 70cm band... you - can use that with your antenna to direction-find the rocket on the ground - the same way you can use a Walston or Beeline tracker. This can be handy - if the rocket is hiding in sage brush or a tree, or if the last GPS position - doesn't get you close enough because the rocket dropped into a canyon, or - the wind is blowing it across a dry lake bed, or something like that... Keith - currently uses a Yaesu FT1D, Bdale has a Yaesu VX-7R, which - is a nicer radio in most ways but doesn't support APRS. - </para> - <para> - So, to recap, on the ground the hardware you'll need includes: - <orderedlist inheritnum='inherit' numeration='arabic'> - <listitem> - <para> - an antenna and feed-line or adapter - </para> - </listitem> - <listitem> - <para> - a TeleDongle - </para> - </listitem> - <listitem> - <para> - a notebook computer - </para> - </listitem> - <listitem> - <para> - optionally, a hand-held GPS receiver - </para> - </listitem> - <listitem> - <para> - optionally, an HT or receiver covering 435 MHz - </para> - </listitem> - </orderedlist> - </para> - <para> - The best hand-held commercial directional antennas we've found for radio - direction finding rockets are from - <ulink url="http://www.arrowantennas.com/" > - Arrow Antennas. - </ulink> - The 440-3 and 440-5 are both good choices for finding a - TeleMetrum- or TeleMini- equipped rocket when used with a suitable - 70cm HT. TeleDongle and an SMA to BNC adapter fit perfectly - between the driven element and reflector of Arrow antennas. - </para> - </section> - <section> - <title>Data Analysis</title> - <para> - Our software makes it easy to log the data from each flight, both the - telemetry received during the flight itself, and the more - complete data log recorded in the flash memory on the altimeter - board. Once this data is on your computer, our post-flight tools make it - easy to quickly get to the numbers everyone wants, like apogee altitude, - max acceleration, and max velocity. You can also generate and view a - standard set of plots showing the altitude, acceleration, and - velocity of the rocket during flight. And you can even export a TeleMetrum data file - usable with Google Maps and Google Earth for visualizing the flight path - in two or three dimensions! - </para> - <para> - Our ultimate goal is to emit a set of files for each flight that can be - published as a web page per flight, or just viewed on your local disk with - a web browser. - </para> - </section> - <section> - <title>Future Plans</title> - <para> - We have designed and prototyped several “companion boards” that - can attach to the companion connector on TeleMetrum, - TeleMega and EasyMega - flight computers to collect more data, provide more pyro channels, - and so forth. We do not yet know if or when any of these boards - will be produced in enough quantity to sell. If you have specific - interests for data collection or control of events in your rockets - beyond the capabilities of our existing productions, please let - us know! - </para> - <para> - Because all of our work is open, both the hardware designs and the - software, if you have some great idea for an addition to the current - Altus Metrum family, feel free to dive in and help! Or let us know - what you'd like to see that we aren't already working on, and maybe - we'll get excited about it too... - </para> - <para> - Watch our - <ulink url="http://altusmetrum.org/">web site</ulink> for more news - and information as our family of products evolves! - </para> - </section> - </chapter> - <chapter> - <title>Altimeter Installation Recommendations</title> - <para> - Building high-power rockets that fly safely is hard enough. Mix - in some sophisticated electronics and a bunch of radio energy - and some creativity and/or compromise may be required. This chapter - contains some suggestions about how to install Altus Metrum - products into a rocket air-frame, including how to safely and - reliably mix a variety of electronics into the same air-frame. - </para> - <section> - <title>Mounting the Altimeter</title> - <para> - The first consideration is to ensure that the altimeter is - securely fastened to the air-frame. For most of our products, we - prefer nylon standoffs and nylon screws; they're good to at least 50G - and cannot cause any electrical issues on the board. Metal screws - and standoffs are fine, too, just be careful to avoid electrical - shorts! For TeleMini v1.0, we usually cut small pieces of 1/16 inch - balsa to fit - under the screw holes, and then take 2x56 nylon screws and - screw them through the TeleMini mounting holes, through the - balsa and into the underlying material. - </para> - <orderedlist inheritnum='inherit' numeration='arabic'> - <listitem> - <para> - Make sure accelerometer-equipped products like TeleMetrum, - TeleMega and EasyMega are aligned precisely along the axis of - acceleration so that the accelerometer can accurately - capture data during the flight. - </para> - </listitem> - <listitem> - <para> - Watch for any metal touching components on the - board. Shorting out connections on the bottom of the board - can cause the altimeter to fail during flight. - </para> - </listitem> - </orderedlist> - </section> - <section> - <title>Dealing with the Antenna</title> - <para> - The antenna supplied is just a piece of solid, insulated, - wire. If it gets damaged or broken, it can be easily - replaced. It should be kept straight and not cut; bending or - cutting it will change the resonant frequency and/or - impedance, making it a less efficient radiator and thus - reducing the range of the telemetry signal. - </para> - <para> - Keeping metal away from the antenna will provide better range - and a more even radiation pattern. In most rockets, it's not - entirely possible to isolate the antenna from metal - components; there are often bolts, all-thread and wires from other - electronics to contend with. Just be aware that the more stuff - like this around the antenna, the lower the range. - </para> - <para> - Make sure the antenna is not inside a tube made or covered - with conducting material. Carbon fiber is the most common - culprit here -- CF is a good conductor and will effectively - shield the antenna, dramatically reducing signal strength and - range. Metallic flake paint is another effective shielding - material which should be avoided around any antennas. - </para> - <para> - If the ebay is large enough, it can be convenient to simply - mount the altimeter at one end and stretch the antenna out - inside. Taping the antenna to the sled can keep it straight - under acceleration. If there are metal rods, keep the - antenna as far away as possible. - </para> - <para> - For a shorter ebay, it's quite practical to have the antenna - run through a bulkhead and into an adjacent bay. Drill a small - hole in the bulkhead, pass the antenna wire through it and - then seal it up with glue or clay. We've also used acrylic - tubing to create a cavity for the antenna wire. This works a - bit better in that the antenna is known to stay straight and - not get folded by recovery components in the bay. Angle the - tubing towards the side wall of the rocket and it ends up - consuming very little space. - </para> - <para> - If you need to place the UHF antenna at a distance from the - altimeter, you can replace the antenna with an edge-mounted - SMA connector, and then run 50Ω coax from the board to the - antenna. Building a remote antenna is beyond the scope of this - manual. - </para> - </section> - <section> - <title>Preserving GPS Reception</title> - <para> - The GPS antenna and receiver used in TeleMetrum and TeleMega is - highly sensitive and normally have no trouble tracking enough - satellites to provide accurate position information for - recovering the rocket. However, there are many ways the GPS signal - can end up attenuated, negatively affecting GPS performance. - <orderedlist inheritnum='inherit' numeration='arabic'> - <listitem> - <para> - Conductive tubing or coatings. Carbon fiber and metal - tubing, or metallic paint will all dramatically attenuate the - GPS signal. We've never heard of anyone successfully - receiving GPS from inside these materials. - </para> - </listitem> - <listitem> - <para> - Metal components near the GPS patch antenna. These will - de-tune the patch antenna, changing the resonant frequency - away from the L1 carrier and reduce the effectiveness of the - antenna. You can place as much stuff as you like beneath the - antenna as that's covered with a ground plane. But, keep - wires and metal out from above the patch antenna. - </para> - </listitem> - </orderedlist> - </para> - </section> - <section> - <title>Radio Frequency Interference</title> - <para> - Any altimeter will generate RFI; the digital circuits use - high-frequency clocks that spray radio interference across a - wide band. Altus Metrum altimeters generate intentional radio - signals as well, increasing the amount of RF energy around the board. - </para> - <para> - Rocketry altimeters also use precise sensors measuring air - pressure and acceleration. Tiny changes in voltage can cause - these sensor readings to vary by a huge amount. When the - sensors start mis-reporting data, the altimeter can either - fire the igniters at the wrong time, or not fire them at all. - </para> - <para> - Voltages are induced when radio frequency energy is - transmitted from one circuit to another. Here are things that - influence the induced voltage and current: - </para> - <itemizedlist> - <listitem> - <para> - Keep wires from different circuits apart. Moving circuits - further apart will reduce RFI. - </para> - </listitem> - <listitem> - <para> - Avoid parallel wires from different circuits. The longer two - wires run parallel to one another, the larger the amount of - transferred energy. Cross wires at right angles to reduce - RFI. - </para> - </listitem> - <listitem> - <para> - Twist wires from the same circuits. Two wires the same - distance from the transmitter will get the same amount of - induced energy which will then cancel out. Any time you have - a wire pair running together, twist the pair together to - even out distances and reduce RFI. For altimeters, this - includes battery leads, switch hookups and igniter - circuits. - </para> - </listitem> - <listitem> - <para> - Avoid resonant lengths. Know what frequencies are present - in the environment and avoid having wire lengths near a - natural resonant length. Altus Metrum products transmit on the - 70cm amateur band, so you should avoid lengths that are a - simple ratio of that length; essentially any multiple of ¼ - of the wavelength (17.5cm). - </para> - </listitem> - </itemizedlist> - </section> - <section> - <title>The Barometric Sensor</title> - <para> - Altusmetrum altimeters measure altitude with a barometric - sensor, essentially measuring the amount of air above the - rocket to figure out how high it is. A large number of - measurements are taken as the altimeter initializes itself to - figure out the pad altitude. Subsequent measurements are then - used to compute the height above the pad. - </para> - <para> - To accurately measure atmospheric pressure, the ebay - containing the altimeter must be vented outside the - air-frame. The vent must be placed in a region of linear - airflow, have smooth edges, and away from areas of increasing or - decreasing pressure. - </para> - <para> - All barometric sensors are quite sensitive to chemical damage from - the products of APCP or BP combustion, so make sure the ebay is - carefully sealed from any compartment which contains ejection - charges or motors. - </para> - </section> - <section> - <title>Ground Testing</title> - <para> - The most important aspect of any installation is careful - ground testing. Bringing an air-frame up to the LCO table which - hasn't been ground tested can lead to delays or ejection - charges firing on the pad, or, even worse, a recovery system - failure. - </para> - <para> - Do a 'full systems' test that includes wiring up all igniters - without any BP and turning on all of the electronics in flight - mode. This will catch any mistakes in wiring and any residual - RFI issues that might accidentally fire igniters at the wrong - time. Let the air-frame sit for several minutes, checking for - adequate telemetry signal strength and GPS lock. If any igniters - fire unexpectedly, find and resolve the issue before loading any - BP charges! - </para> - <para> - Ground test the ejection charges. Prepare the rocket for - flight, loading ejection charges and igniters. Completely - assemble the air-frame and then use the 'Fire Igniters' - interface through a TeleDongle to command each charge to - fire. Make sure the charge is sufficient to robustly separate - the air-frame and deploy the recovery system. - </para> - </section> - </chapter> - <chapter> - <title>Updating Device Firmware</title> - <para> - TeleMega, TeleMetrum v2, EasyMega, EasyMini and TeleDongle v3 - are all programmed directly over their USB connectors (self - programming). TeleMetrum v1, TeleMini and TeleDongle v0.2 are - all programmed by using another device as a programmer (pair - programming). It's important to recognize which kind of devices - you have before trying to reprogram them. - </para> - <para> - You may wish to begin by ensuring you have current firmware images. - These are distributed as part of the AltOS software bundle that - also includes the AltosUI ground station program. Newer ground - station versions typically work fine with older firmware versions, - so you don't need to update your devices just to try out new - software features. You can always download the most recent - version from <ulink url="http://www.altusmetrum.org/AltOS/"/>. - </para> - <para> - If you need to update the firmware on a TeleDongle v0.2, we recommend - updating the altimeter first, before updating TeleDongle. However, - note that TeleDongle rarely need to be updated. Any firmware version - 1.0.1 or later will work, version 1.2.1 may have improved receiver - performance slightly. - </para> - <para> - Self-programmable devices (TeleMega, TeleMetrum v2, EasyMega and EasyMini) - are reprogrammed by connecting them to your computer over USB - </para> - <section> - <title> - Updating TeleMega, TeleMetrum v2, EasyMega, EasyMini or - TeleDongle v3 Firmware - </title> - <orderedlist inheritnum='inherit' numeration='arabic'> - <listitem> - <para> - Attach a battery if necessary and power switch to the target - device. Power up the device. - </para> - </listitem> - <listitem> - <para> - Using a Micro USB cable, connect the target device to your - computer's USB socket. - </para> - </listitem> - <listitem> - <para> - Run AltosUI, and select 'Flash Image' from the File menu. - </para> - </listitem> - <listitem> - <para> - Select the target device in the Device Selection dialog. - </para> - </listitem> - <listitem> - <para> - Select the image you want to flash to the device, which - should have a name in the form - <product>-v<product-version>-<software-version>.ihx, such - as TeleMega-v1.0-1.3.0.ihx. - </para> - </listitem> - <listitem> - <para> - Make sure the configuration parameters are reasonable - looking. If the serial number and/or RF configuration - values aren't right, you'll need to change them. - </para> - </listitem> - <listitem> - <para> - Hit the 'OK' button and the software should proceed to flash - the device with new firmware, showing a progress bar. - </para> - </listitem> - <listitem> - <para> - Verify that the device is working by using the 'Configure - Altimeter' or 'Configure Groundstation' item to check over - the configuration. - </para> - </listitem> - </orderedlist> - <section> - <title>Recovering From Self-Flashing Failure</title> - <para> - If the firmware loading fails, it can leave the device - unable to boot. Not to worry, you can force the device to - start the boot loader instead, which will let you try to - flash the device again. - </para> - <para> - On each device, connecting two pins from one of the exposed - connectors will force the boot loader to start, even if the - regular operating system has been corrupted in some way. - </para> - <variablelist> - <varlistentry> - <term>TeleMega</term> - <listitem> - <para> - Connect pin 6 and pin 1 of the companion connector. Pin 1 - can be identified by the square pad around it, and then - the pins could sequentially across the board. Be very - careful to <emphasis>not</emphasis> short pin 8 to - anything as that is connected directly to the battery. Pin - 7 carries 3.3V and the board will crash if that is - connected to pin 1, but shouldn't damage the board. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>EasyMega</term> - <listitem> - <para> - Connect pin 6 and pin 1 of the companion connector. Pin 1 - can be identified by the square pad around it, and then - the pins could sequentially across the board. Be very - careful to <emphasis>not</emphasis> short pin 8 to - anything as that is connected directly to the battery. Pin - 7 carries 3.3V and the board will crash if that is - connected to pin 1, but shouldn't damage the board. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>TeleMetrum v2</term> - <listitem> - <para> - Connect pin 6 and pin 1 of the companion connector. Pin 1 - can be identified by the square pad around it, and then - the pins could sequentially across the board. Be very - careful to <emphasis>not</emphasis> short pin 8 to - anything as that is connected directly to the battery. Pin - 7 carries 3.3V and the board will crash if that is - connected to pin 1, but shouldn't damage the board. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>EasyMini</term> - <listitem> - <para> - Connect pin 6 and pin 1 of the debug connector, which is - the six holes next to the beeper. Pin 1 can be identified - by the square pad around it, and then the pins could - sequentially across the board, making Pin 6 the one on the - other end of the row. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>TeleDongle v3</term> - <listitem> - <para> - Connect pin 32 on the CPU to ground. Pin 32 is closest - to the USB wires on the row of pins towards the center - of the board. Ground is available on the capacitor - next to it, on the end towards the USB wires. - </para> - </listitem> - </varlistentry> - </variablelist> - <para> - Once you've located the right pins: - </para> - <orderedlist inheritnum='inherit' numeration='arabic'> - <listitem> - <para> - Turn the altimeter power off. - </para> - </listitem> - <listitem> - <para> - Connect a battery. - </para> - </listitem> - <listitem> - <para> - Connect the indicated terminals together with a short - piece of wire. Take care not to accidentally connect - anything else. - </para> - </listitem> - <listitem> - <para> - Connect USB - </para> - </listitem> - <listitem> - <para> - Turn the board power on. - </para> - </listitem> - <listitem> - <para> - The board should now be visible over USB as 'AltosFlash' - and be ready to receive firmware. - </para> - </listitem> - <listitem> - <para> - Once the board has been powered up, you can remove the - piece of wire. - </para> - </listitem> - </orderedlist> - </section> - </section> - <section> - <title>Pair Programming</title> - <para> - The big concept to understand is that you have to use a - TeleMetrum v1.0, TeleBT v1.0 or TeleDongle v0.2 as a - programmer to update a pair programmed device. Due to limited - memory resources in the cc1111, we don't support programming - directly over USB for these devices. - </para> - </section> - <section> - <title>Updating TeleMetrum v1.x Firmware</title> - <orderedlist inheritnum='inherit' numeration='arabic'> - <listitem> - <para> - Find the 'programming cable' that you got as part of the starter - kit, that has a red 8-pin MicroMaTch connector on one end and a - red 4-pin MicroMaTch connector on the other end. - </para> - </listitem> - <listitem> - <para> - Take the 2 screws out of the TeleDongle v0.2 or TeleBT v1.0 - case to get access to the circuit board. - </para> - </listitem> - <listitem> - <para> - Plug the 8-pin end of the programming cable to the - matching connector on the TeleDongle v0.2 or TeleBT v1.0, and the 4-pin end to the - matching connector on the TeleMetrum. - Note that each MicroMaTch connector has an alignment pin that - goes through a hole in the PC board when you have the cable - oriented correctly. - </para> - </listitem> - <listitem> - <para> - Attach a battery to the TeleMetrum board. - </para> - </listitem> - <listitem> - <para> - Plug the TeleDongle v0.2 or TeleBT v1.0 into your computer's USB port, and power - up the TeleMetrum. - </para> - </listitem> - <listitem> - <para> - Run AltosUI, and select 'Flash Image' from the File menu. - </para> - </listitem> - <listitem> - <para> - Pick the TeleDongle v0.2 or TeleBT v1.0 device from the list, identifying it as the - programming device. - </para> - </listitem> - <listitem> - <para> - Select the image you want put on the TeleMetrum, which should have a - name in the form telemetrum-v1.2-1.0.0.ihx. It should be visible - in the default directory, if not you may have to poke around - your system to find it. - </para> - </listitem> - <listitem> - <para> - Make sure the configuration parameters are reasonable - looking. If the serial number and/or RF configuration - values aren't right, you'll need to change them. - </para> - </listitem> - <listitem> - <para> - Hit the 'OK' button and the software should proceed to flash - the TeleMetrum with new firmware, showing a progress bar. - </para> - </listitem> - <listitem> - <para> - Confirm that the TeleMetrum board seems to have updated OK, which you - can do by plugging in to it over USB and using a terminal program - to connect to the board and issue the 'v' command to check - the version, etc. - </para> - </listitem> - <listitem> - <para> - If something goes wrong, give it another try. - </para> - </listitem> - </orderedlist> - </section> - <section> - <title>Updating TeleMini Firmware</title> - <orderedlist inheritnum='inherit' numeration='arabic'> - <listitem> -<para> - You'll need a special 'programming cable' to reprogram the - TeleMini. You can make your own using an 8-pin MicroMaTch - connector on one end and a set of four pins on the other. - </para> -</listitem> - <listitem> -<para> - Take the 2 screws out of the TeleDongle v0.2 or TeleBT v1.0 case to get access - to the circuit board. - </para> -</listitem> - <listitem> -<para> - Plug the 8-pin end of the programming cable to the matching - connector on the TeleDongle v0.2 or TeleBT v1.0, and the 4-pins into the holes - in the TeleMini circuit board. Note that the MicroMaTch - connector has an alignment pin that goes through a hole in - the PC board when you have the cable oriented correctly, and - that pin 1 on the TeleMini board is marked with a square pad - while the other pins have round pads. - </para> -</listitem> - <listitem> -<para> - Attach a battery to the TeleMini board. - </para> -</listitem> - <listitem> -<para> - Plug the TeleDongle v0.2 or TeleBT v1.0 into your computer's USB port, and power - up the TeleMini - </para> -</listitem> - <listitem> -<para> - Run AltosUI, and select 'Flash Image' from the File menu. - </para> -</listitem> - <listitem> -<para> - Pick the TeleDongle v0.2 or TeleBT v1.0 device from the list, identifying it as the - programming device. - </para> -</listitem> - <listitem> -<para> - Select the image you want put on the TeleMini, which should have a - name in the form telemini-v1.0-1.0.0.ihx. It should be visible - in the default directory, if not you may have to poke around - your system to find it. - </para> -</listitem> - <listitem> -<para> - Make sure the configuration parameters are reasonable - looking. If the serial number and/or RF configuration - values aren't right, you'll need to change them. - </para> -</listitem> - <listitem> -<para> - Hit the 'OK' button and the software should proceed to flash - the TeleMini with new firmware, showing a progress bar. - </para> -</listitem> - <listitem> -<para> - Confirm that the TeleMini board seems to have updated OK, which you - can do by configuring it over the radio link through the TeleDongle, or - letting it come up in “flight” mode and listening for telemetry. - </para> -</listitem> - <listitem> -<para> - If something goes wrong, give it another try. - </para> -</listitem> - </orderedlist> - </section> - <section> - <title>Updating TeleDongle v0.2 Firmware</title> - <para> - Updating TeleDongle v0.2 firmware is just like updating - TeleMetrum v1.x or TeleMini - firmware, but you use either a TeleMetrum v1.x, TeleDongle - v0.2 or TeleBT v1.0 as the programmer. - </para> - <orderedlist inheritnum='inherit' numeration='arabic'> - <listitem> -<para> - Find the 'programming cable' that you got as part of the starter - kit, that has a red 8-pin MicroMaTch connector on one end and a - red 4-pin MicroMaTch connector on the other end. - </para> -</listitem> - <listitem> -<para> - Find the USB cable that you got as part of the starter kit, and - plug the “mini” end in to the mating connector on TeleMetrum - v1.x, TeleDongle v0.2 or TeleBT v1.0. - </para> -</listitem> - <listitem> -<para> - Take the 2 screws out of the TeleDongle v0.2 or TeleBT v1.0 case to get access - to the circuit board. - </para> -</listitem> - <listitem> -<para> - Plug the 8-pin end of the programming cable to the - matching connector on the programmer, and the 4-pin end to the - matching connector on the TeleDongle v0.2. - Note that each MicroMaTch connector has an alignment pin that - goes through a hole in the PC board when you have the cable - oriented correctly. - </para> -</listitem> - <listitem> -<para> - Attach a battery to the TeleMetrum v1.x board if you're using one. - </para> -</listitem> - <listitem> -<para> - Plug both the programmer and the TeleDongle into your computer's USB - ports, and power up the programmer. - </para> -</listitem> - <listitem> -<para> - Run AltosUI, and select 'Flash Image' from the File menu. - </para> -</listitem> - <listitem> -<para> - Pick the programmer device from the list, identifying it as the - programming device. - </para> -</listitem> - <listitem> -<para> - Select the image you want put on the TeleDongle v0.2, which should have a - name in the form teledongle-v0.2-1.0.0.ihx. It should be visible - in the default directory, if not you may have to poke around - your system to find it. - </para> -</listitem> - <listitem> -<para> - Make sure the configuration parameters are reasonable - looking. If the serial number and/or RF configuration - values aren't right, you'll need to change them. The - TeleDongle v0.2 - serial number is on the “bottom” of the circuit board, and can - usually be read through the translucent blue plastic case without - needing to remove the board from the case. - </para> -</listitem> - <listitem> -<para> - Hit the 'OK' button and the software should proceed to flash - the TeleDongle v0.2 with new firmware, showing a progress bar. - </para> -</listitem> - <listitem> -<para> - Confirm that the TeleDongle v0.2 board seems to have updated OK, which you - can do by plugging in to it over USB and using a terminal program - to connect to the board and issue the 'v' command to check - the version, etc. Once you're happy, remove the programming cable - and put the cover back on the TeleDongle v0.2. - </para> -</listitem> - <listitem> -<para> - If something goes wrong, give it another try. - </para> -</listitem> - </orderedlist> - <para> - Be careful removing the programming cable from the locking 8-pin - connector on TeleMetrum. You'll need a fingernail or perhaps a thin - screwdriver or knife blade to gently pry the locking ears out - slightly to extract the connector. We used a locking connector on - TeleMetrum to help ensure that the cabling to companion boards - used in a rocket don't ever come loose accidentally in flight. - </para> - </section> - </chapter> - <chapter> - <title>Hardware Specifications</title> - <section> - <title> - TeleMega Specifications - </title> - <itemizedlist> - <listitem> - <para> - Recording altimeter for model rocketry. - </para> - </listitem> - <listitem> - <para> - Supports dual deployment and four auxiliary pyro channels - (a total of 6 events). - </para> - </listitem> - <listitem> - <para> - 70cm 40mW ham-band transceiver for telemetry down-link. - </para> - </listitem> - <listitem> - <para> - Barometric pressure sensor good to 100k feet MSL. - </para> - </listitem> - <listitem> - <para> - 1-axis high-g accelerometer for motor characterization, capable of - +/- 102g. - </para> - </listitem> - <listitem> - <para> - 9-axis IMU including integrated 3-axis accelerometer, - 3-axis gyroscope and 3-axis magnetometer. - </para> - </listitem> - <listitem> - <para> - On-board, integrated uBlox Max 7 GPS receiver with 5Hz update rate capability. - </para> - </listitem> - <listitem> - <para> - On-board 8 Megabyte non-volatile memory for flight data storage. - </para> - </listitem> - <listitem> - <para> - USB interface for battery charging, configuration, and data recovery. - </para> - </listitem> - <listitem> - <para> - Fully integrated support for Li-Po rechargeable batteries. - </para> - </listitem> - <listitem> - <para> - Can use either main system Li-Po or optional separate pyro battery - to fire e-matches. - </para> - </listitem> - <listitem> - <para> - 3.25 x 1.25 inch board designed to fit inside 38mm air-frame coupler tube. - </para> - </listitem> - </itemizedlist> - </section> - <section> - <title> - EasyMega Specifications - </title> - <itemizedlist> - <listitem> - <para> - Recording altimeter for model rocketry. - </para> - </listitem> - <listitem> - <para> - Supports dual deployment and four auxiliary pyro channels - (a total of 6 events). - </para> - </listitem> - <listitem> - <para> - Barometric pressure sensor good to 100k feet MSL. - </para> - </listitem> - <listitem> - <para> - 1-axis high-g accelerometer for motor characterization, capable of - +/- 102g. - </para> - </listitem> - <listitem> - <para> - 9-axis IMU including integrated 3-axis accelerometer, - 3-axis gyroscope and 3-axis magnetometer. - </para> - </listitem> - <listitem> - <para> - On-board 8 Megabyte non-volatile memory for flight data storage. - </para> - </listitem> - <listitem> - <para> - USB interface for battery charging, configuration, and data recovery. - </para> - </listitem> - <listitem> - <para> - Fully integrated support for Li-Po rechargeable batteries. - </para> - </listitem> - <listitem> - <para> - Can use either main system Li-Po or optional separate pyro battery - to fire e-matches. - </para> - </listitem> - <listitem> - <para> - 1.25 x 1.25 inch board designed to fit inside 38mm air-frame coupler tube. - </para> - </listitem> - </itemizedlist> - </section> - <section> - <title> - TeleMetrum v2 Specifications - </title> - <itemizedlist> - <listitem> - <para> - Recording altimeter for model rocketry. - </para> - </listitem> - <listitem> - <para> - Supports dual deployment (can fire 2 ejection charges). - </para> - </listitem> - <listitem> - <para> - 70cm, 40mW ham-band transceiver for telemetry down-link. - </para> - </listitem> - <listitem> - <para> - Barometric pressure sensor good to 100k feet MSL. - </para> - </listitem> - <listitem> - <para> - 1-axis high-g accelerometer for motor characterization, capable of - +/- 102g. - </para> - </listitem> - <listitem> - <para> - On-board, integrated uBlox Max 7 GPS receiver with 5Hz update rate capability. - </para> - </listitem> - <listitem> - <para> - On-board 8 Megabyte non-volatile memory for flight data storage. - </para> - </listitem> - <listitem> - <para> - USB interface for battery charging, configuration, and data recovery. - </para> - </listitem> - <listitem> - <para> - Fully integrated support for Li-Po rechargeable batteries. - </para> - </listitem> - <listitem> - <para> - Uses Li-Po to fire e-matches, can be modified to support - optional separate pyro battery if needed. - </para> - </listitem> - <listitem> - <para> - 2.75 x 1 inch board designed to fit inside 29mm air-frame coupler tube. - </para> - </listitem> - </itemizedlist> - </section> - <section> - <title>TeleMetrum v1 Specifications</title> - <itemizedlist> - <listitem> - <para> - Recording altimeter for model rocketry. - </para> - </listitem> - <listitem> - <para> - Supports dual deployment (can fire 2 ejection charges). - </para> - </listitem> - <listitem> - <para> - 70cm, 10mW ham-band transceiver for telemetry down-link. - </para> - </listitem> - <listitem> - <para> - Barometric pressure sensor good to 45k feet MSL. - </para> - </listitem> - <listitem> - <para> - 1-axis high-g accelerometer for motor characterization, capable of - +/- 50g using default part. - </para> - </listitem> - <listitem> - <para> - On-board, integrated GPS receiver with 5Hz update rate capability. - </para> - </listitem> - <listitem> - <para> - On-board 1 megabyte non-volatile memory for flight data storage. - </para> - </listitem> - <listitem> - <para> - USB interface for battery charging, configuration, and data recovery. - </para> - </listitem> - <listitem> - <para> - Fully integrated support for Li-Po rechargeable batteries. - </para> - </listitem> - <listitem> - <para> - Uses Li-Po to fire e-matches, can be modified to support - optional separate pyro battery if needed. - </para> - </listitem> - <listitem> - <para> - 2.75 x 1 inch board designed to fit inside 29mm air-frame coupler tube. - </para> - </listitem> - </itemizedlist> - </section> - <section> - <title> - TeleMini v2.0 Specifications - </title> - <itemizedlist> - <listitem> - <para> - Recording altimeter for model rocketry. - </para> - </listitem> - <listitem> - <para> - Supports dual deployment (can fire 2 ejection charges). - </para> - </listitem> - <listitem> - <para> - 70cm, 10mW ham-band transceiver for telemetry down-link. - </para> - </listitem> - <listitem> - <para> - Barometric pressure sensor good to 100k feet MSL. - </para> - </listitem> - <listitem> - <para> - On-board 1 megabyte non-volatile memory for flight data storage. - </para> - </listitem> - <listitem> - <para> - USB interface for configuration, and data recovery. - </para> - </listitem> - <listitem> - <para> - Support for Li-Po rechargeable batteries (using an - external charger), or any 3.7-15V external battery. - </para> - </listitem> - <listitem> - <para> - Uses Li-Po to fire e-matches, can be modified to support - optional separate pyro battery if needed. - </para> - </listitem> - <listitem> - <para> - 1.5 x .8 inch board designed to fit inside 24mm air-frame coupler tube. - </para> - </listitem> - </itemizedlist> - </section> - <section> - <title> - TeleMini v1.0 Specifications - </title> - <itemizedlist> - <listitem> - <para> - Recording altimeter for model rocketry. - </para> - </listitem> - <listitem> - <para> - Supports dual deployment (can fire 2 ejection charges). - </para> - </listitem> - <listitem> - <para> - 70cm, 10mW ham-band transceiver for telemetry down-link. - </para> - </listitem> - <listitem> - <para> - Barometric pressure sensor good to 45k feet MSL. - </para> - </listitem> - <listitem> - <para> - On-board 5 kilobyte non-volatile memory for flight data storage. - </para> - </listitem> - <listitem> - <para> - RF interface for configuration, and data recovery. - </para> - </listitem> - <listitem> - <para> - Support for Li-Po rechargeable batteries, using an external charger. - </para> - </listitem> - <listitem> - <para> - Uses Li-Po to fire e-matches, can be modified to support - optional separate pyro battery if needed. - </para> - </listitem> - <listitem> - <para> - 1.5 x .5 inch board designed to fit inside 18mm air-frame coupler tube. - </para> - </listitem> - </itemizedlist> - </section> - <section> - <title> - EasyMini Specifications - </title> - <itemizedlist> - <listitem> - <para> - Recording altimeter for model rocketry. - </para> - </listitem> - <listitem> - <para> - Supports dual deployment (can fire 2 ejection charges). - </para> - </listitem> - <listitem> - <para> - Barometric pressure sensor good to 100k feet MSL. - </para> - </listitem> - <listitem> - <para> - On-board 1 megabyte non-volatile memory for flight data storage. - </para> - </listitem> - <listitem> - <para> - USB interface for configuration, and data recovery. - </para> - </listitem> - <listitem> - <para> - Support for Li-Po rechargeable batteries (using an - external charger), or any 3.7-15V external battery. - </para> - </listitem> - <listitem> - <para> - Uses Li-Po to fire e-matches, can be modified to support - optional separate pyro battery if needed. - </para> - </listitem> - <listitem> - <para> - 1.5 x .8 inch board designed to fit inside 24mm air-frame coupler tube. - </para> - </listitem> - </itemizedlist> - </section> - </chapter> - <chapter> - <title>FAQ</title> - <para> - <emphasis>TeleMetrum seems to shut off when disconnected from the - computer.</emphasis> <?linebreak?> - Make sure the battery is adequately charged. Remember the - unit will pull more power than the USB port can deliver before the - GPS enters “locked” mode. The battery charges best when TeleMetrum - is turned off. - </para> - <para> - <emphasis>It's impossible to stop the TeleDongle when it's in “p” mode, I have - to unplug the USB cable? </emphasis><?linebreak?> - Make sure you have tried to “escape out” of - this mode. If this doesn't work the reboot procedure for the - TeleDongle *is* to simply unplug it. 'cu' however will retain it's - outgoing buffer IF your “escape out” ('~~') does not work. - At this point using either 'ao-view' (or possibly - 'cutemon') instead of 'cu' will 'clear' the issue and allow renewed - communication. - </para> - <para> - <emphasis>The amber LED (on the TeleMetrum) lights up when both - battery and USB are connected. Does this mean it's charging? - </emphasis><?linebreak?> - Yes, the yellow LED indicates the charging at the 'regular' rate. - If the led is out but the unit is still plugged into a USB port, - then the battery is being charged at a 'trickle' rate. - </para> - <para> - <emphasis>There are no “dit-dah-dah-dit” sound or lights like the manual - mentions?</emphasis><?linebreak?> - That's the “pad” mode. Weak batteries might be the problem. - It is also possible that the flight computer is horizontal and the - output - is instead a “dit-dit” meaning 'idle'. For TeleMini, it's possible that - it received a command packet which would have left it in “pad” mode. - </para> - <para> - <emphasis>How do I save flight data?</emphasis><?linebreak?> - Live telemetry is written to file(s) whenever AltosUI is connected - to the TeleDongle. The file area defaults to ~/TeleMetrum - but is easily changed using the menus in AltosUI. The files that - are written end in '.telem'. The after-flight - data-dumped files will end in .eeprom and represent continuous data - unlike the .telem files that are subject to losses - along the RF data path. - See the above instructions on what and how to save the eeprom stored - data after physically retrieving your altimeter. Make sure to save - the on-board data after each flight; while the TeleMetrum can store - multiple flights, you never know when you'll lose the altimeter... - </para> - </chapter> - <appendix> - <title>Notes for Older Software</title> - <para> - <emphasis> - Before AltosUI was written, using Altus Metrum devices required - some finesse with the Linux command line. There was a limited - GUI tool, ao-view, which provided functionality similar to the - Monitor Flight window in AltosUI, but everything else was a - fairly 80's experience. This appendix includes documentation for - using that software. - </emphasis> - </para> - <para> - Both TeleMetrum and TeleDongle can be directly communicated - with using USB ports. The first thing you should try after getting - both units plugged into to your computer's USB port(s) is to run - 'ao-list' from a terminal-window to see what port-device-name each - device has been assigned by the operating system. - You will need this information to access the devices via their - respective on-board firmware and data using other command line - programs in the AltOS software suite. - </para> - <para> - TeleMini can be communicated with through a TeleDongle device - over the radio link. When first booted, TeleMini listens for a - TeleDongle device and if it receives a packet, it goes into - 'idle' mode. Otherwise, it goes into 'pad' mode and waits to be - launched. The easiest way to get it talking is to start the - communication link on the TeleDongle and the power up the - TeleMini board. - </para> - <para> - To access the device's firmware for configuration you need a terminal - program such as you would use to talk to a modem. The software - authors prefer using the program 'cu' which comes from the UUCP package - on most Unix-like systems such as Linux. An example command line for - cu might be 'cu -l /dev/ttyACM0', substituting the correct number - indicated from running the - ao-list program. Another reasonable terminal program for Linux is - 'cutecom'. The default 'escape' - character used by CU (i.e. the character you use to - issue commands to cu itself instead of sending the command as input - to the connected device) is a '~'. You will need this for use in - only two different ways during normal operations. First is to exit - the program by sending a '~.' which is called a 'escape-disconnect' - and allows you to close-out from 'cu'. The - second use will be outlined later. - </para> - <para> - All of the Altus Metrum devices share the concept of a two level - command set in their firmware. - The first layer has several single letter commands. Once - you are using 'cu' (or 'cutecom') sending (typing) a '?' - returns a full list of these - commands. The second level are configuration sub-commands accessed - using the 'c' command, for - instance typing 'c?' will give you this second level of commands - (all of which require the - letter 'c' to access). Please note that most configuration options - are stored only in Flash memory; TeleDongle doesn't provide any storage - for these options and so they'll all be lost when you unplug it. - </para> - <para> - Try setting these configuration ('c' or second level menu) values. A good - place to start is by setting your call sign. By default, the boards - use 'N0CALL' which is cute, but not exactly legal! - Spend a few minutes getting comfortable with the units, their - firmware, and 'cu' (or possibly 'cutecom'). - For instance, try to send - (type) a 'c r 2' and verify the channel change by sending a 'c s'. - Verify you can connect and disconnect from the units while in your - terminal program by sending the escape-disconnect mentioned above. - </para> - <para> - To set the radio frequency, use the 'c R' command to specify the - radio transceiver configuration parameter. This parameter is computed - using the desired frequency, 'F', the radio calibration parameter, 'C' (showed by the 'c s' command) and - the standard calibration reference frequency, 'S', (normally 434.550MHz): - <programlisting> - R = F / S * C - </programlisting> - Round the result to the nearest integer value. - As with all 'c' sub-commands, follow this with a 'c w' to write the - change to the parameter block in the on-board flash on - your altimeter board if you want the change to stay in place across reboots. - </para> - <para> - To set the apogee delay, use the 'c d' command. - As with all 'c' sub-commands, follow this with a 'c w' to write the - change to the parameter block in the on-board DataFlash chip. - </para> - <para> - To set the main deployment altitude, use the 'c m' command. - As with all 'c' sub-commands, follow this with a 'c w' to write the - change to the parameter block in the on-board DataFlash chip. - </para> - <para> - To calibrate the radio frequency, connect the UHF antenna port to a - frequency counter, set the board to 434.550MHz, and use the 'C' - command to generate a CW carrier. Wait for the transmitter temperature - to stabilize and the frequency to settle down. - Then, divide 434.550 MHz by the - measured frequency and multiply by the current radio cal value show - in the 'c s' command. For an unprogrammed board, the default value - is 1186611 for cc1111 based products and 7119667 for cc1120 - based products. Take the resulting integer and program it using the 'c f' - command. Testing with the 'C' command again should show a carrier - within a few tens of Hertz of the intended frequency. - As with all 'c' sub-commands, follow this with a 'c w' to write the - change to the configuration memory. - </para> - <para> - Note that the 'reboot' command, which is very useful on the altimeters, - will likely just cause problems with the dongle. The *correct* way - to reset the dongle is just to unplug and re-plug it. - </para> - <para> - A fun thing to do at the launch site and something you can do while - learning how to use these units is to play with the radio link access - between an altimeter and the TeleDongle. Be aware that you *must* create - some physical separation between the devices, otherwise the link will - not function due to signal overload in the receivers in each device. - </para> - <para> - Now might be a good time to take a break and read the rest of this - manual, particularly about the two “modes” that the altimeters - can be placed in. TeleMetrum uses the position of the device when booting - up will determine whether the unit is in “pad” or “idle” mode. TeleMini - enters “idle” mode when it receives a command packet within the first 5 seconds - of being powered up, otherwise it enters “pad” mode. - </para> - <para> - You can access an altimeter in idle mode from the TeleDongle's USB - connection using the radio link - by issuing a 'p' command to the TeleDongle. Practice connecting and - disconnecting ('~~' while using 'cu') from the altimeter. If - you cannot escape out of the “p” command, (by using a '~~' when in - CU) then it is likely that your kernel has issues. Try a newer version. - </para> - <para> - Using this radio link allows you to configure the altimeter, test - fire e-matches and igniters from the flight line, check pyro-match - continuity and so forth. You can leave the unit turned on while it - is in 'idle mode' and then place the - rocket vertically on the launch pad, walk away and then issue a - reboot command. The altimeter will reboot and start sending data - having changed to the “pad” mode. If the TeleDongle is not receiving - this data, you can disconnect 'cu' from the TeleDongle using the - procedures mentioned above and THEN connect to the TeleDongle from - inside 'ao-view'. If this doesn't work, disconnect from the - TeleDongle, unplug it, and try again after plugging it back in. - </para> - <para> - In order to reduce the chance of accidental firing of pyrotechnic - charges, the command to fire a charge is intentionally somewhat - difficult to type, and the built-in help is slightly cryptic to - prevent accidental echoing of characters from the help text back at - the board from firing a charge. The command to fire the apogee - drogue charge is 'i DoIt drogue' and the command to fire the main - charge is 'i DoIt main'. - </para> - <para> - On TeleMetrum, the GPS will eventually find enough satellites, lock in on them, - and 'ao-view' will both auditorily announce and visually indicate - that GPS is ready. - Now you can launch knowing that you have a good data path and - good satellite lock for flight data and recovery. Remember - you MUST tell ao-view to connect to the TeleDongle explicitly in - order for ao-view to be able to receive data. - </para> - <para> - The altimeters provide RDF (radio direction finding) tones on - the pad, during descent and after landing. These can be used to - locate the rocket using a directional antenna; the signal - strength providing an indication of the direction from receiver to rocket. - </para> - <para> - TeleMetrum also provides GPS tracking data, which can further simplify - locating the rocket once it has landed. (The last good GPS data - received before touch-down will be on the data screen of 'ao-view'.) - </para> - <para> - Once you have recovered the rocket you can download the eeprom - contents using either 'ao-dumplog' (or possibly 'ao-eeprom'), over - either a USB cable or over the radio link using TeleDongle. - And by following the man page for 'ao-postflight' you can create - various data output reports, graphs, and even KML data to see the - flight trajectory in Google-earth. (Moving the viewing angle making - sure to connect the yellow lines while in Google-earth is the proper - technique.) - </para> - <para> - As for ao-view.... some things are in the menu but don't do anything - very useful. The developers have stopped working on ao-view to focus - on a new, cross-platform ground station program. So ao-view may or - may not be updated in the future. Mostly you just use - the Log and Device menus. It has a wonderful display of the incoming - flight data and I am sure you will enjoy what it has to say to you - once you enable the voice output! - </para> - </appendix> - <appendix> - <title>Drill Templates</title> - <para> - These images, when printed, provide precise templates for the - mounting holes in Altus Metrum flight computers - </para> - <section> - <title>TeleMega template</title> - <para> - TeleMega has overall dimensions of 1.250 x 3.250 inches, and - the mounting holes are sized for use with 4-40 or M3 screws. - </para> - <informalfigure> - <mediaobject id="TeleMegaTemplate"> - <imageobject> - <imagedata format="SVG" fileref="telemega.svg" - scalefit="0" scale="100" align="center" /> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>EasyMega template</title> - <para> - EasyMega has overall dimensions of 1.250 x 2.250 inches, and - the mounting holes are sized for use with 4-40 or M3 screws. - </para> - <informalfigure> - <mediaobject id="EasyMegaTemplate"> - <imageobject> - <imagedata format="SVG" fileref="easymega.svg" - scalefit="0" scale="100" align="center" /> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>TeleMetrum template</title> - <para> - TeleMetrum has overall dimensions of 1.000 x 2.750 inches, and the - mounting holes are sized for use with 4-40 or M3 screws. - </para> - <informalfigure> - <mediaobject id="TeleMetrumTemplate"> - <imageobject> - <imagedata format="SVG" fileref="telemetrum.svg" - scalefit="0" scale="100" align="center" /> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>TeleMini v2/EasyMini template</title> - <para> - TeleMini v2 and EasyMini have overall dimensions of 0.800 x 1.500 inches, and the - mounting holes are sized for use with 4-40 or M3 screws. - </para> - <informalfigure> - <mediaobject id="MiniTemplate"> - <imageobject> - <imagedata format="SVG" fileref="easymini.svg" - scalefit="0" scale="100" align="center" /> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>TeleMini v1 template</title> - <para> - TeleMini has overall dimensions of 0.500 x 1.500 inches, and the - mounting holes are sized for use with 2-56 or M2 screws. - </para> - <informalfigure> - <mediaobject id="TeleMiniTemplate"> - <imageobject> - <imagedata format="SVG" fileref="telemini.svg" - scalefit="0" scale="100" align="center" /> - </imageobject> - </mediaobject> - </informalfigure> - </section> - </appendix> - <appendix> - <title>Calibration</title> - <para> - There are only two calibrations required for TeleMetrum and - TeleMega, and only one for EasyMega, TeleDongle, TeleMini and EasyMini. - All boards are shipped from the factory pre-calibrated, but - the procedures are documented here in case they are ever - needed. Re-calibration is not supported by AltosUI, you must - connect to the board with a serial terminal program and - interact directly with the on-board command interpreter to - effect calibration. - </para> - <section> - <title>Radio Frequency</title> - <para> - The radio frequency is synthesized from a clock based on the - crystal on the board. The actual frequency of this oscillator - must be measured to generate a calibration constant. While our - GFSK modulation - bandwidth is wide enough to allow boards to communicate even when - their oscillators are not on exactly the same frequency, performance - is best when they are closely matched. - Radio frequency calibration requires a calibrated frequency counter. - Fortunately, once set, the variation in frequency due to aging and - temperature changes is small enough that re-calibration by customers - should generally not be required. - </para> - <para> - To calibrate the radio frequency, connect the UHF antenna - port to a frequency counter, set the board to 434.550MHz, - and use the 'C' command in the on-board command interpreter - to generate a CW carrier. For USB-enabled boards, this is - best done over USB. For TeleMini v1, note that the only way - to escape the 'C' command is via power cycle since the board - will no longer be listening for commands once it starts - generating a CW carrier. - </para> - <para> - Wait for the transmitter temperature to stabilize and the frequency - to settle down. Then, divide 434.550 MHz by the - measured frequency and multiply by the current radio cal value show - in the 'c s' command. For an unprogrammed board, the default value - is 1186611. Take the resulting integer and program it using the 'c f' - command. Testing with the 'C' command again should show a carrier - within a few tens of Hertz of the intended frequency. - As with all 'c' sub-commands, follow this with a 'c w' to write the - change to the parameter block in the on-board storage chip. - </para> - <para> - Note that any time you re-do the radio frequency calibration, the - radio frequency is reset to the default 434.550 Mhz. If you want - to use another frequency, you will have to set that again after - calibration is completed. - </para> - </section> - <section> - <title>TeleMetrum, TeleMega and EasyMega Accelerometers</title> - <para> - While barometric sensors are factory-calibrated, - accelerometers are not, and so each must be calibrated once - installed in a flight computer. Explicitly calibrating the - accelerometers also allows us to load any compatible device. - We perform a two-point calibration using gravity. - </para> - <para> - To calibrate the acceleration sensor, use the 'c a 0' command. You - will be prompted to orient the board vertically with the UHF antenna - up and press a key, then to orient the board vertically with the - UHF antenna down and press a key. Note that the accuracy of this - calibration depends primarily on how perfectly vertical and still - the board is held during the cal process. As with all 'c' - sub-commands, follow this with a 'c w' to write the - change to the parameter block in the on-board DataFlash chip. - </para> - <para> - The +1g and -1g calibration points are included in each telemetry - frame and are part of the header stored in onboard flash to be - downloaded after flight. We always store and return raw ADC - samples for each sensor... so nothing is permanently “lost” or - “damaged” if the calibration is poor. - </para> - <para> - In the unlikely event an accel cal goes badly, it is possible - that TeleMetrum, TeleMega or EasyMega may always come up in 'pad mode' - and as such not be listening to either the USB or radio link. - If that happens, there is a special hook in the firmware to - force the board back in to 'idle mode' so you can re-do the - cal. To use this hook, you just need to ground the SPI clock - pin at power-on. This pin is available as pin 2 on the 8-pin - companion connector, and pin 1 is ground. So either - carefully install a fine-gauge wire jumper between the two - pins closest to the index hole end of the 8-pin connector, or - plug in the programming cable to the 8-pin connector and use - a small screwdriver or similar to short the two pins closest - to the index post on the 4-pin end of the programming cable, - and power up the board. It should come up in 'idle mode' - (two beeps), allowing a re-cal. - </para> - </section> - </appendix> - <appendix> - <title>Igniter Current</title> - <para> - The question "how much igniter current can Altus Metrum products - handle?" comes up fairly frequently. The short answer is "more than - you're likely to need", the remainder of this appendix provides a - longer answer. - </para> - <section> - <title>Current Products</title> - <para> - The FET switches we're using on all of our current products that - have pyro channels are the Vishay Siliconix Si7232DN. These parts - have exceptionally low Rds(on) values, better than 0.02 ohms! That - means they aren't making a lot of heat... and the limit on current - is "package limited", meaning it's all about how much you can heat - the die before something breaks. - </para> - <para> - Cutting to the chase, the Si7232DN specs are 25 amps <emphasis>continuous</emphasis> at - 20V at a temperature of 25C. In pulsed mode, they're rated for 40A. - However, those specs are a little mis-leading because it really is - all about the heat generated... you can get something like 85A - through one briefly. Note that a typical commercial e-match only - needed about 13 microseconds to fire in tests on my bench a couple - years ago! - </para> - <para> - So a great plan is to use something like an e-match as the initiator - and build up pyrogen(s) as required to actually light what you're - trying to light... But if you want to use a high-current igniter, - we can probably handle it! - </para> - </section> - <section> - <title>Version 1 Products</title> - <para> - The FET switches used on TeleMetrum v1 and TeleMini v1 products - were Fairchild FDS9926A. The Rds(on) values under our operating - conditions are on the order of 0.04 ohms. These parts were rated - for a continuous current-carrying capacity of 6.5A, and a pulsed - current capacity of 20A. - </para> - <para> - As with the more modern parts, the real limit is based on the heat - generated in the part during the firing interval. So, while the - specs on these parts aren't as good as the ones we use on current - products, they were still great, and we never had a complaint about - current carrying capacity with any of our v1 boards. - </para> - </section> - </appendix> - <appendix> - <title>Release Notes</title> - <simplesect> - <title>Version 1.6.1</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.6.1.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.6</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.6.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.5</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.5.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.4.1</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.4.1.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.4</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.4.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.3.2</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.3.2.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.3.1</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.3.1.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.3</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.3.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.2.1</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.2.1.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.2</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.2.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.1.1</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.1.1.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.1</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.1.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.0.1</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.0.1.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 0.9.2</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-0.9.2.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 0.9</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-0.9.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 0.8</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-0.8.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 0.7.1</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-0.7.1.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - </appendix> -</book> - -<!-- LocalWords: Altusmetrum ---> diff --git a/doc/am-fo.xsl b/doc/am-fo.xsl new file mode 100644 index 00000000..605339d4 --- /dev/null +++ b/doc/am-fo.xsl @@ -0,0 +1,231 @@ +<!-- + Generates single FO document from DocBook XML source using DocBook XSL + stylesheets. + + See xsl-stylesheets/fo/param.xsl for all parameters. + + NOTE: The URL reference to the current DocBook XSL stylesheets is + rewritten to point to the copy on the local disk drive by the XML catalog + rewrite directives so it doesn't need to go out to the Internet for the + stylesheets. This means you don't need to edit the <xsl:import> elements on + a machine by machine basis. +--> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:fo="http://www.w3.org/1999/XSL/Format"> +<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/> +<xsl:import href="common.xsl"/> +<xsl:include href="titlepage.templates.xsl"/> +<xsl:include href="footer.templates.xsl"/> + +<xsl:param name="ulink.show" select="0" /> +<xsl:param name="ulink.footnotes" select="1"/> + +<xsl:param name="fop1.extensions" select="1" /> +<xsl:param name="variablelist.as.blocks" select="1" /> + +<xsl:param name="paper.type" select="'USletter'"/> + +<xsl:param name="hyphenate">false</xsl:param> +<!-- justify, left or right --> +<xsl:param name="alignment">left</xsl:param> + +<xsl:param name="body.font.family" select="'Open Sans Light,sans-serif'"/> +<xsl:param name="title.font.family" select="'Open Sans Light,sans-serif'"/> +<xsl:param name="monospace.font.family" select="'DejaVu Sans Mono,monospace'"/> +<xsl:param name="body.font.master">11</xsl:param> +<xsl:param name="body.font.size"> + <xsl:value-of select="$body.font.master"/><xsl:text>pt</xsl:text> +</xsl:param> + +<xsl:param name="body.margin.bottom" select="'0.5in'"/> +<xsl:param name="body.margin.top" select="'0.5in'"/> +<xsl:param name="bridgehead.in.toc" select="0"/> +<xsl:param name="footer.column.widths">10 1 1</xsl:param> + +<!-- Default fetches image from Internet (long timeouts) --> +<xsl:param name="draft.watermark.image" select="''"/> + +<!-- Line break --> +<xsl:template match="processing-instruction('asciidoc-br')"> + <fo:block/> +</xsl:template> + +<!-- Horizontal ruler --> +<xsl:template match="processing-instruction('asciidoc-hr')"> + <fo:block space-after="1em"> + <fo:leader leader-pattern="rule" rule-thickness="0.5pt" rule-style="solid" leader-length.minimum="100%"/> + </fo:block> +</xsl:template> + +<!-- Hard page break --> +<xsl:template match="processing-instruction('asciidoc-pagebreak')"> + <fo:block break-after='page'/> +</xsl:template> + +<!-- Sets title to body text indent --> +<xsl:param name="body.start.indent"> + <xsl:choose> + <xsl:when test="$fop.extensions != 0">0pt</xsl:when> + <xsl:when test="$passivetex.extensions != 0">0pt</xsl:when> + <xsl:otherwise>1pc</xsl:otherwise> + </xsl:choose> +</xsl:param> +<xsl:param name="title.margin.left"> + <xsl:choose> + <xsl:when test="$fop.extensions != 0">-1pc</xsl:when> + <xsl:when test="$passivetex.extensions != 0">0pt</xsl:when> + <xsl:otherwise>0pt</xsl:otherwise> + </xsl:choose> +</xsl:param> +<xsl:param name="page.margin.bottom" select="'0.25in'"/> +<xsl:param name="page.margin.inner"> + <xsl:choose> + <xsl:when test="$double.sided != 0">0.75in</xsl:when> + <xsl:otherwise>0.75in</xsl:otherwise> + </xsl:choose> +</xsl:param> +<xsl:param name="page.margin.outer"> + <xsl:choose> + <xsl:when test="$double.sided != 0">0.5in</xsl:when> + <xsl:otherwise>0.5in</xsl:otherwise> + </xsl:choose> +</xsl:param> + +<xsl:param name="page.margin.top" select="'0.5in'"/> +<xsl:param name="page.orientation" select="'portrait'"/> +<xsl:param name="page.width"> + <xsl:choose> + <xsl:when test="$page.orientation = 'portrait'"> + <xsl:value-of select="$page.width.portrait"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$page.height.portrait"/> + </xsl:otherwise> + </xsl:choose> +</xsl:param> + +<xsl:param name="table.frame.border.thickness">0.5pt</xsl:param> +<xsl:param name="table.frame.border.color">#78079a</xsl:param> +<xsl:param name="table.frame.border.thickness">0.5pt</xsl:param> +<xsl:param name="table.cell.border.thickness">0.5pt</xsl:param> +<xsl:param name="table.cell.border.color">#78079a</xsl:param> +<xsl:param name="table.cell.border.with.css" select="1"/> + +<xsl:attribute-set name="component.title.properties"> + <xsl:attribute name="font-size"> + <xsl:value-of select="$body.font.master * 1.61051"/> + <xsl:text>pt</xsl:text> + </xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="section.title.level1.properties"> + <xsl:attribute name="font-size"> + <xsl:value-of select="$body.font.master * 1.4641"/> + <xsl:text>pt</xsl:text> + </xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="section.title.level2.properties"> + <xsl:attribute name="font-size"> + <xsl:value-of select="$body.font.master * 1.331"/> + <xsl:text>pt</xsl:text> + </xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="section.title.level3.properties"> + <xsl:attribute name="font-size"> + <xsl:value-of select="$body.font.master * 1.21"/> + <xsl:text>pt</xsl:text> + </xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="section.title.level4.properties"> + <xsl:attribute name="font-size"> + <xsl:value-of select="$body.font.master * 1.1"/> + <xsl:text>pt</xsl:text> + </xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="copyright.title.properties"> + <xsl:attribute name="font-size">11pt</xsl:attribute> + <xsl:attribute name="font-weight">bold</xsl:attribute> + <xsl:attribute name="text-align">center</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="revhistory.title.properties"> + <xsl:attribute name="font-size">11pt</xsl:attribute> + <xsl:attribute name="font-weight">bold</xsl:attribute> + <xsl:attribute name="text-align">center</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="revhistory.table.properties"> + <xsl:attribute name="border">0.5pt solid #78079a</xsl:attribute> + <xsl:attribute name="width">50%</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="revhistory.table.cell.properties"> + <xsl:attribute name="border">0.5pt solid #78079a</xsl:attribute> + <xsl:attribute name="font-size">11pt</xsl:attribute> + <xsl:attribute name="padding">2pt</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="monospace.properties"> + <xsl:attribute name="font-size">11pt</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="component.title.properties"> + <xsl:attribute name="font-weight">normal</xsl:attribute> + <xsl:attribute name="color">#78079a</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="section.title.properties"> + <xsl:attribute name="font-weight">normal</xsl:attribute> + <xsl:attribute name="color">#78079a</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="admonition.title.properties"> + <xsl:attribute name="font-weight">normal</xsl:attribute> + <xsl:attribute name="color">#ff4040</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="formal.title.properties"> + <xsl:attribute name="font-weight">normal</xsl:attribute> + <xsl:attribute name="color">#78079a</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="sidebar.properties" use-attribute-sets="formal.object.properties"> + <xsl:attribute name="border-style">solid</xsl:attribute> + <xsl:attribute name="border-width">1pt</xsl:attribute> + <xsl:attribute name="border-color">silver</xsl:attribute> + <xsl:attribute name="background-color">#ffffee</xsl:attribute> + <xsl:attribute name="padding-left">12pt</xsl:attribute> + <xsl:attribute name="padding-right">12pt</xsl:attribute> + <xsl:attribute name="padding-top">6pt</xsl:attribute> + <xsl:attribute name="padding-bottom">6pt</xsl:attribute> + <xsl:attribute name="margin-left">0pt</xsl:attribute> + <xsl:attribute name="margin-right">12pt</xsl:attribute> + <xsl:attribute name="margin-top">6pt</xsl:attribute> + <xsl:attribute name="margin-bottom">6pt</xsl:attribute> +</xsl:attribute-set> + +<!-- Only shade programlisting and screen verbatim elements --> +<xsl:param name="shade.verbatim" select="1"/> +<xsl:attribute-set name="shade.verbatim.style"> + <xsl:attribute name="background-color"> + <xsl:choose> + <xsl:when test="self::programlisting|self::screen">#ffffff</xsl:when> + <xsl:otherwise>inherit</xsl:otherwise> + </xsl:choose> + </xsl:attribute> +</xsl:attribute-set> + +<!-- + Force XSL Stylesheets 1.72 default table breaks to be the same as the current + version (1.74) default which (for tables) is keep-together="auto". +--> +<xsl:attribute-set name="table.properties"> + <xsl:attribute name="keep-together.within-column">auto</xsl:attribute> +</xsl:attribute-set> + +</xsl:stylesheet> diff --git a/doc/am-html.xsl b/doc/am-html.xsl new file mode 100644 index 00000000..cdfe27f8 --- /dev/null +++ b/doc/am-html.xsl @@ -0,0 +1,14 @@ +<!-- + Generates single XHTML document from DocBook XML source using DocBook XSL + stylesheets. + + NOTE: The URL reference to the current DocBook XSL stylesheets is + rewritten to point to the copy on the local disk drive by the XML catalog + rewrite directives so it doesn't need to go out to the Internet for the + stylesheets. This means you don't need to edit the <xsl:import> elements on + a machine by machine basis. +--> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl"/> +<xsl:import href="common.xsl"/> +</xsl:stylesheet> diff --git a/doc/am.css b/doc/am.css new file mode 100644 index 00000000..393ef81b --- /dev/null +++ b/doc/am.css @@ -0,0 +1,476 @@ +/* + CSS stylesheet for XHTML produced by DocBook XSL stylesheets. +*/ + +@font-face { + font-family: 'Open Sans'; + src: url('fonts/OpenSans-Regular.ttf'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Open Sans'; + src: url('fonts/OpenSans-Italic.ttf'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Open Sans'; + src: url('fonts/OpenSans-Semibold.ttf'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'Open Sans'; + src: url('fonts/OpenSans-SemiboldItalic.ttf'); + font-weight: bold; + font-style: italic; +} + +@font-face { + font-family: 'DejaVu Sans Mono'; + src: url('fonts/DejaVuSansMono.ttf'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'DejaVu Sans Mono'; + src: url('fonts/DejaVuSansMono-Oblique.ttf'); + font-weight: normal; + font-style: oblique; +} + +@font-face { + font-family: 'DejaVu Sans Mono'; + src: url('fonts/DejaVuSansMono-Bold.ttf'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'DejaVu Sans Mono'; + src: url('fonts/DejaVuSansMono-BoldOblique.ttf'); + font-weight: bold; + font-style: oblique; +} + +body { + font-family: "Open Sans",sans-serif; + font-size: 12pt; +} + +code, pre { + font-family: "DejaVu Sans Mono", monospace; +} + +span.strong { + font-weight: bold; +} + +body blockquote { + margin-top: .75em; + line-height: 1.5; + margin-bottom: .75em; +} + +html body { + margin: 1em 5% 1em 5%; + line-height: 1.2; +} + +body div { + margin: 0; +} + +a:link { + color: #78079a; +} + +a:visited { + color: #78079a; +} + +h1, h2, h3, h4, h5, h6 +{ + color: #78079a; + font-family: "Open Sans",sans-serif; +} + +div.revhistory table { + width: 50%; + border-width: 1px; +} + +div titlepage { + margin-top: 100px; + border-top: 2px; +} + +div.warning h1, div.warning h2, div.warning h3, div.warning h4, div.warning h5, div.warning h6 { + color: #ff2020; +} + +div.warning p, div.note p, div.error p { + margin-left: 5%; + margin-left: 5%; +} + +h3.corpauthor img { + position: fixed; + left: 0px; + top: 0px; + width: 410px; + height: 90px; + border-right: 2px solid #808080; + border-bottom: 2px solid #808080; +} + +div.toc { + position: fixed; + left: 0px; + top: 92px; + bottom: 0; + width: 390px; + margin-right: 0; + margin-left: 0; + padding-left: 10px; + padding-right: 10px; + float: left; + border-right: 2px solid #808080; + border-collapse: collapse; + overflow: auto; +} + +div.toc p, +div.list-of-figures p, +div.list-of-tables p, +div.list-of-examples p, +div.toc a +{ + color: black; +} + +div.toc p { + color: black; +} + +div.toc a:link { + text-decoration: none; +} + +div.toc a:visited { + text-decoration: none; +} + +div.toc a:hover { + text-decoration: underline; +} + +div.toc a:active { + text-decoration: underline; +} + +div.book { + margin-left: 25em; +} + +div.list-of-figures { + display: none; +} + +div.list-of-tables { + display: none; +} + +div.figure p { + text-align: center; +} +div.figure img { + display: block; + margin: auto; +} + +div.table p.title { + text-align: center; +} + +div.table-contents table { + margin-left: auto; + margin-right: auto; +} + +div.example p.title, +div.sidebar p.title +{ + font-weight: normal; + color: #78079a; + font-family: "Open Sans",sans-serif; + margin-bottom: 0.2em; +} + +body h1 { + margin: .0em 0 0 -4%; + line-height: 1.3; + border-bottom: 2px solid #808080; +} + +body h2 { + margin: 0.5em 0 0 -4%; + line-height: 1.3; + border-bottom: 2px solid #808080; +} + +body h3 { + margin: .8em 0 0 -3%; + line-height: 1.3; +} + +body h4 { + margin: .8em 0 0 -3%; + line-height: 1.3; + border-top: 2px solid #808080; +} + +body h5 { + margin: .8em 0 0 -2%; + line-height: 1.3; +} + +body h6 { + margin: .8em 0 0 -1%; + line-height: 1.3; +} + +body hr { + border: none; /* Broken on IE6 */ +} +div.footnotes hr { + border: 1px solid #808080; +} + +div.navheader th, div.navheader td, div.navfooter td { + font-family: "Open Sans",sans-serif; + font-size: 12pt; + font-weight: normal; + color: #78079a; +} +div.navheader img, div.navfooter img { + border-style: none; +} +div.navheader a, div.navfooter a { + font-weight: normal; +} +div.navfooter hr { + border: 1px solid #808080; +} + +body td { + line-height: 1.2 +} + +body th { + line-height: 1.2; +} + +ol { + line-height: 1.2; +} + +ul, body dir, body menu { + line-height: 1.2; +} + +html { + margin: 0; + padding: 0; +} + +body h1, body h2, body h3, body h4, body h5, body h6 { + margin-left: 0 +} + +body pre { + margin: 0.5em 10% 0.5em 1em; + line-height: 1.0; +} + +tt.literal, code.literal { +} + +.programlisting, .screen { + border: 1px solid #808080; + background: #f4f4f4; + margin: 0.5em 10% 0.5em 0; + padding: 0.5em 1em; +} + +div.sidebar { + background: #ffffee; + margin: 1.0em 10% 0.5em 0; + padding: 0.5em 1em; + border: 1px solid #808080; +} +div.sidebar * { padding: 0; } +div.sidebar div { margin: 0; } +div.sidebar p.title { + margin-top: 0.5em; + margin-bottom: 0.2em; +} + +div.bibliomixed { + margin: 0.5em 5% 0.5em 1em; +} + +div.glossary dt { + font-weight: bold; +} +div.glossary dd p { + margin-top: 0.2em; +} + +dl { + margin: .8em 0; + line-height: 1.2; +} + +dt { + margin-top: 0.5em; +} + +dt span.term { + font-weight: bold; +} + +div.variablelist dd p { + margin-top: 0; +} + +div.itemizedlist li, div.orderedlist li { + margin-left: -0.8em; + margin-top: 0.5em; +} + +ul, ol { + list-style-position: outside; +} + +div.sidebar ul, div.sidebar ol { + margin-left: 2.8em; +} + +div.itemizedlist p.title, +div.orderedlist p.title, +div.variablelist p.title +{ + margin-bottom: -0.8em; +} + +div.revhistory { + border-style: none; +} + +div.revhistory table, div.revhistory th, div.revhistory td { + border-collapse: collapse; + border: 1px solid #808080; + padding: 0.25em; +} + +div.revhistory th { + color: black; +} + +/* Keep TOC and index lines close together. */ +div.toc dl, div.toc dt, +div.list-of-figures dl, div.list-of-figures dt, +div.list-of-tables dl, div.list-of-tables dt, +div.indexdiv dl, div.indexdiv dt +{ + line-height: normal; + margin-top: 0; + margin-bottom: 0; +} + +/* + Table styling does not work because of overriding attributes in + generated HTML. +*/ +div.table-contents p, +div.informaltable p +{ + margin: 0px; +} + +div.table thead, div.table tfoot, +div.informaltable thead, div.informaltable tfoot +{ + font-weight: bold; +} + +div.mediaobject img { + margin-bottom: 0.8em; +} +div.figure p.title, +div.table p.title +{ + margin-top: 1em; + margin-bottom: 0.4em; +} + +div.calloutlist p +{ + margin-top: 0em; + margin-bottom: 0.4em; +} + +a img { + border-style: none; +} + +@media print { + div.navheader, div.navfooter { display: none; } +} + +span.aqua { color: aqua; } +span.black { color: black; } +span.blue { color: blue; } +span.fuchsia { color: fuchsia; } +span.gray { color: gray; } +span.green { color: green; } +span.lime { color: lime; } +span.maroon { color: maroon; } +span.navy { color: navy; } +span.olive { color: olive; } +span.purple { color: purple; } +span.red { color: red; } +span.silver { color: silver; } +span.teal { color: teal; } +span.white { color: white; } +span.yellow { color: yellow; } + +span.aqua-background { background: aqua; } +span.black-background { background: black; } +span.blue-background { background: blue; } +span.fuchsia-background { background: fuchsia; } +span.gray-background { background: gray; } +span.green-background { background: green; } +span.lime-background { background: lime; } +span.maroon-background { background: maroon; } +span.navy-background { background: navy; } +span.olive-background { background: olive; } +span.purple-background { background: purple; } +span.red-background { background: red; } +span.silver-background { background: silver; } +span.teal-background { background: teal; } +span.white-background { background: white; } +span.yellow-background { background: yellow; } + +span.big { font-size: 2em; } +span.small { font-size: 0.6em; } + +span.underline { text-decoration: underline; } +span.overline { text-decoration: overline; } +span.line-through { text-decoration: line-through; } diff --git a/doc/aprs-operation.inc b/doc/aprs-operation.inc new file mode 100644 index 00000000..09f929d0 --- /dev/null +++ b/doc/aprs-operation.inc @@ -0,0 +1,109 @@ + === APRS + + {aprsdevices} can send APRS if desired, and the + interval between APRS packets can be configured. As each APRS + packet takes a full second to transmit, we recommend an + interval of at least 5 seconds to avoid consuming too much + battery power or radio channel bandwidth. You can configure + the APRS interval using {application}; that process is described in + <<{configure_section}>>. + + AltOS supports both compressed and uncompressed APRS + position report data formats. The compressed format + provides for higher position precision and shorter + packets than the uncompressed APRS format. We've found + some older APRS receivers that do not handle the + compressed format. The Kenwood TH-72A requires the use + of uncompressed format to display altitude information + correctly. The Yaesu FT1D requires the use of + compressed format to display altitude information. + + APRS packets include an SSID (Secondary Station Identifier) + field that allows one operator to have multiple + transmitters. AltOS allows you to set this to a single digit + from 0 to 9, allowing you to fly multiple transmitters at the + same time while keeping the identify of each one separate in + the receiver. By default, the SSID is set to the last digit of + the device serial number. + + The APRS packet format includes a comment field that + can have arbitrary text in it. AltOS uses this to send + status information as shown in the following table. + + .Altus Metrum APRS Comments + [options="header",cols="1,1,3"] + |==== + |Field |Example |Description + + |1 + |L + |GPS Status U for unlocked, L for locked + + |2 + |6 + |Number of Satellites in View + + |3 + |B4.0 + |Altimeter Battery Voltage + + ifdef::altusmetrum[] + + |4 + |A3.7 + |Apogee Igniter Voltage + + |5 + |M3.7 + |Main Igniter Voltage + + |6 + |1286 + |Device Serial Number + + endif::altusmetrum[] + ifdef::telegps[] + + |4 + |1286 + |Device Serial Number + + endif::telegps[] + + |==== + + ifdef::altusmetrum[] + Here's an example of an APRS comment showing GPS lock with 6 + satellites in view, a primary battery at 4.0V, and + apogee and main igniters both at 3.7V from device 1286. + + .... + L6 B4.0 A3.7 M3.7 1286 + .... + endif::altusmetrum[] + + ifdef::telegps[] + Here's an example of an APRS comment showing GPS lock with 6 + satellites in view and a primary battery at 4.0V from device 1876. + + .... + L6 B4.0 1876 + .... + endif::telegps[] + + Make sure your primary battery is above 3.8V + ifdef::altusmetrum[] + any connected igniters are above 3.5V + endif::altusmetrum[] + and GPS is locked with at least 5 or 6 satellites in + view before flying. If GPS is switching between L and + U regularly, then it doesn't have a good lock and you + should wait until it becomes stable. + + If the GPS receiver loses lock, the APRS data + transmitted will contain the last position for which + GPS lock was available. You can tell that this has + happened by noticing that the GPS status character + switches from 'L' to 'U'. Before GPS has locked, APRS + will transmit zero for latitude, longitude and + altitude. diff --git a/doc/common.xsl b/doc/common.xsl new file mode 100644 index 00000000..94b120af --- /dev/null +++ b/doc/common.xsl @@ -0,0 +1,124 @@ +<!-- + Inlcuded in xhtml.xsl, xhtml.chunked.xsl, htmlhelp.xsl. + Contains common XSL stylesheets parameters. + Output documents styled by docbook.css. +--> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +<xsl:param name="html.stylesheet" select="'docbook-xsl.css'"/> + +<xsl:param name="htmlhelp.chm" select="'htmlhelp.chm'"/> +<xsl:param name="htmlhelp.hhc.section.depth" select="5"/> + +<xsl:param name="section.autolabel"> + <xsl:choose> + <xsl:when test="/processing-instruction('asciidoc-numbered')">1</xsl:when> + <xsl:otherwise>0</xsl:otherwise> + </xsl:choose> +</xsl:param> + +<xsl:param name="suppress.navigation" select="0"/> +<xsl:param name="navig.graphics.extension" select="'.png'"/> +<xsl:param name="navig.graphics" select="0"/> +<xsl:param name="navig.graphics.path">images/icons/</xsl:param> +<xsl:param name="navig.showtitles">0</xsl:param> + +<xsl:param name="shade.verbatim" select="0"/> +<xsl:attribute-set name="shade.verbatim.style"> + <xsl:attribute name="border">0</xsl:attribute> + <xsl:attribute name="background-color">#E0E0E0</xsl:attribute> +</xsl:attribute-set> + +<xsl:param name="admon.graphics" select="1"/> +<xsl:param name="admon.graphics.path">images/icons/</xsl:param> +<xsl:param name="admon.graphics.extension" select="'.png'"/> +<xsl:param name="admon.style"> + <xsl:text>margin-left: 0; margin-right: 10%;</xsl:text> +</xsl:param> +<xsl:param name="admon.textlabel" select="1"/> + +<xsl:param name="callout.defaultcolumn" select="'60'"/> +<xsl:param name="callout.graphics.extension" select="'.png'"/> +<xsl:param name="callout.graphics" select="'1'"/> +<xsl:param name="callout.graphics.number.limit" select="'10'"/> +<xsl:param name="callout.graphics.path" select="'images/icons/callouts/'"/> +<xsl:param name="callout.list.table" select="'1'"/> + +<!-- This does not seem to work. --> +<xsl:param name="section.autolabel.max.depth" select="2"/> + +<xsl:param name="chunk.first.sections" select="1"/> +<xsl:param name="chunk.section.depth" select="1"/> +<xsl:param name="chunk.quietly" select="0"/> +<xsl:param name="chunk.toc" select="''"/> +<xsl:param name="chunk.tocs.and.lots" select="0"/> + +<xsl:param name="html.cellpadding" select="'4px'"/> +<xsl:param name="html.cellspacing" select="''"/> + +<xsl:param name="table.borders.with.css" select="1"/> +<xsl:param name="table.cell.border.color" select="'#78079a'"/> +<xsl:param name="table.cell.border.style" select="'solid'"/> +<xsl:param name="table.cell.border.thickness" select="'1px'"/> +<xsl:param name="table.footnote.number.format" select="'a'"/> +<xsl:param name="table.footnote.number.symbols" select="''"/> +<xsl:param name="table.frame.border.color" select="'#78079a'"/> +<xsl:param name="table.frame.border.style" select="'solid'"/> +<xsl:param name="table.frame.border.thickness" select="'1px'"/> +<xsl:param name="tablecolumns.extension" select="'1'"/> + +<xsl:attribute-set name="revhistory.title.properties"> + <xsl:attribute name="font-size">12pt</xsl:attribute> + <xsl:attribute name="font-weight">bold</xsl:attribute> + <xsl:attribute name="text-align">center</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="revhistory.table.properties"> + <xsl:attribute name="border">0.5pt solid #78079a</xsl:attribute> + <xsl:attribute name="width">50%</xsl:attribute> +</xsl:attribute-set> + +<xsl:attribute-set name="revhistory.table.cell.properties"> + <xsl:attribute name="border">0.5pt solid #78079a</xsl:attribute> + <xsl:attribute name="font-size">12pt</xsl:attribute> + <xsl:attribute name="padding">2pt</xsl:attribute> +</xsl:attribute-set> + +<xsl:param name="generate.revhistory.link" select="1"/> + +<xsl:param name="highlight.source" select="1"/> + +<xsl:param name="section.label.includes.component.label" select="1"/> + +<!-- + Table of contents inserted by <?asciidoc-toc?> processing instruction. +--> +<xsl:param name="generate.toc"> + <xsl:choose> + <xsl:when test="/processing-instruction('asciidoc-toc')"> +article toc,title +book toc,title,figure,table,example,equation + <!-- The only way I could find that suppressed book chapter TOCs --> + <xsl:if test="$generate.section.toc.level != 0"> +chapter toc,title +part toc,title +preface toc,title +qandadiv toc +qandaset toc +reference toc,title +sect1 toc +sect2 toc +sect3 toc +sect4 toc +sect5 toc +section toc +set toc,title + </xsl:if> + </xsl:when> + <xsl:otherwise> +article nop +book nop + </xsl:otherwise> + </xsl:choose> +</xsl:param> + +</xsl:stylesheet> diff --git a/doc/companion-docinfo.xml b/doc/companion-docinfo.xml new file mode 100644 index 00000000..243bded0 --- /dev/null +++ b/doc/companion-docinfo.xml @@ -0,0 +1,28 @@ +<subtitle>Protocol Definitions</subtitle> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>13 January 2012</date> +<copyright> + <year>2012</year> + <holder>Keith Packard</holder> +</copyright> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> +<revhistory> + <?dbhtml filename="companion-revhistory.html"?> + <revision> + <revnumber>0.1</revnumber> + <date>13 January 2012</date> + <revremark>Initial content</revremark> + </revision> +</revhistory> diff --git a/doc/companion.txt b/doc/companion.txt new file mode 100644 index 00000000..75ffa228 --- /dev/null +++ b/doc/companion.txt @@ -0,0 +1,241 @@ += AltOS Companion Port +:doctype: article +:toc: + +== Companion Port + + Many Altus Metrum products come with an eight pin Micro MaTch + connector, called the Companion Port. This is often used to + program devices using a programming cable. However, it can + also be used to connect TeleMetrum to external companion + boards (hence the name). + + The Companion Port provides two different functions: + + * Power. Both battery-level and 3.3V regulated power are + available. Note that the amount of regulated power is not + huge; TeleMetrum contains a 150mA regulator and uses, at + peak, about 120mA or so. For applications needing more than + a few dozen mA, placing a separate regulator on them and + using the battery for power is probably a good idea. + + + * SPI. The flight computer operates as a SPI master, using + a protocol defined in this document. Companion boards + provide a matching SPI slave implementation which supplies + telemetry information for the radio downlink during flight + +== Companion SPI Protocol + + The flight computer implements a SPI master communications + channel over the companion port, and uses this to get + information about a connected companion board and then to get + telemetry data for transmission during flight. + + At startup time, the flight computer sends a setup request + packet, and the companion board returns a board identifier, + the desired telemetry update period and the number of data + channels provided. The flight computer doesn't interpret the + telemetry data at all, simply packing it up and sending it + over the link. Telemetry packets are 32 bytes long, and + companion packets use 8 bytes as a header leaving room for a + maximum of 12 16-bit data values. + + Because of the limits of the AVR processors used in the first + two companion boards, the SPI data rate is set to 187.5kbaud. + +== SPI Message Formats + + This section first defines the command message format sent from + the flight computer to the companion board, and then the various + reply message formats for each type of command message. + + .Companion Command Message + [options="border",cols="1,3,3,9"] + |==== + |Offset + |Data Type + |Name + |Description + + |0 + |uint8_t + |command + |Command identifier + + |1 + |uint8_t + |flight_state + |Current flight computer state + + |2 + |uint16_t + |tick + |Flight computer clock (100 ticks/second) + + |4 + |uint16_t + |serial + |Flight computer serial number + + |6 + |uint16_t + |flight + |Flight number + + |8 + | + | + | + + |==== + + .Companion Command Identifiers + [options="border",cols="1,3,9"] + |==== + |Value + |Name + |Description + + |1 + |SETUP + |Supply the flight computer with companion + information + + |2 + |FETCH + |Return telemetry information + + |3 + |NOTIFY + |Tell companion board when flight state changes + |==== + + The flight computer will send a SETUP message shortly after + power-up and will then send FETCH messages no more often than + the rate specified in the SETUP reply. NOTIFY messages will be + sent whenever the flight state changes. + + 'flight_state' records the current state of the flight, + whether on the pad, under power, coasting to apogee or + descending on the drogue or main chute. + + 'tick' provides the current flight computer clock, which + be used to synchronize data recorded on the flight computer + with that recorded on the companion board in post-flight analysis. + + 'serial' is the product serial number of the flight computer, + 'flight' is the flight sequence number. Together, these two + uniquely identify the flight and can be recorded with any + companion board data logging to associate the companion data + with the proper flight. + + NOTIFY commands require no reply at all, they are used solely + to inform the companion board when the state of the flight, as + computed by the flight computer, changes. Companion boards can + use this to change data collection parameters, disabling data + logging until the flight starts and terminating it when the + flight ends. + + === SETUP reply message + + .SETUP reply contents + [options="border",cols="1,3,3,9"] + |==== + |Offset + |Data Type + |Name + |Description + + |0 + |uint16_t + |board_id + |Board identifier + + |2 + |uint16_t + |board_id_inverse + |~board_id—used to tell if a board is present + + |4 + |uint8_t + |update_period + |Minimum time (in 100Hz ticks) between FETCH commands + + |5 + |uint8_t + |channels + |Number of data channels to retrieve in FETCH command + + |6 + | + | + | + |==== + + The SETUP reply contains enough information to uniquely + identify the companion board to the end user as well as for + the flight computer to know how many data values to expect in + reply to a FETCH command, and how often to fetch that data. + + To detect the presence of a companion board, the flight + computer checks to make sure that board_id_inverse is the + bit-wise inverse of board_id. Current companion boards use + USB product ID as the board_id, but the flight computer does + not interpret this data and so it can be any value. + + === FETCH reply message + + .FETCH reply contents + [options="border",cols="1,3,3,9"] + |==== + |Offset + |Data Type + |Name + |Description + + |0 + |uint16_t + |data0 + |0th data item + + |2 + |uint16_t + |data1 + |1st data item + + |... + | + | + | + |==== + + The FETCH reply contains arbitrary data to be reported + over the flight computer telemetry link. The number of + 16-bit data items must match the 'channels' value + provided in the SETUP reply message. + +== History and Motivation + + To allow cross-programming, the original TeleMetrum and + TeleDongle designs needed to include some kind of + connector. With that in place, adding the ability to connect + external cards to TeleMetrum was fairly simple. We set the + software piece of this puzzle aside until we had a companion + board to use. + + The first companion board was TeleScience. Designed to collect + temperature data from the nose and fin of the airframe, the main + requirement for the companion port was that it be able to report + telemetry data during flight as a back-up in case the + TeleScience on-board data was lost. + + The second companion board, TelePyro, provides 8 additional + channels for deployment, staging or other activities. To avoid + re-programming the TeleMetrum to use TelePyro, we decided to + provide enough information over the companion link for it to + independently control those channels. + + Providing a standard, constant interface between the flight + computer and companion boards allows for the base flight + computer firmware to include support for companion boards. diff --git a/doc/companion.xsl b/doc/companion.xsl deleted file mode 100644 index 14e2194e..00000000 --- a/doc/companion.xsl +++ /dev/null @@ -1,353 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <articleinfo> - <title>AltOS Companion Port</title> - <subtitle>Protocol Definitions</subtitle> - <author> - <firstname>Keith</firstname> - <surname>Packard</surname> - </author> - <copyright> - <year>2012</year> - <holder>Keith Packard</holder> - </copyright> - <legalnotice> - <para> - This document is released under the terms of the - <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> - Creative Commons ShareAlike 3.0 - </ulink> - license. - </para> - </legalnotice> - <revhistory> - <revision> - <revnumber>0.1</revnumber> - <date>13 January 2012</date> - <revremark>Initial content</revremark> - </revision> - </revhistory> - </articleinfo> - <section> - <title>Companion Port</title> - <para> - Many Altus Metrum products come with an eight pin Micro MaTch - connector, called the Companion Port. This is often used to - program devices using a programming cable. However, it can also - be used to connect TeleMetrum to external companion boards - (hence the name). - </para> - <para> - The Companion Port provides two different functions: - <itemizedlist> - <listitem> - <para> - Power. Both battery-level and 3.3V regulated power are - available. Note that the amount of regulated power is not - huge; TeleMetrum contains a 150mA regulator and uses, at - peak, about 120mA or so. For applications needing more than - a few dozen mA, placing a separate regulator on them and - using the battery for power is probably a good idea. - </para> - </listitem> - <listitem> - <para> - SPI. The flight computer operates as a SPI master, using - a protocol defined in this document. Companion boards - provide a matching SPI slave implementation which supplies - telemetry information for the radio downlink during flight - </para> - </listitem> - </itemizedlist> - </para> - </section> - <section> - <title>Companion SPI Protocol</title> - <para> - The flight computer implements a SPI master communications - channel over the companion port, and uses this to get - information about a connected companion board and then to get - telemetry data for transmission during flight. - </para> - <para> - At startup time, the flight computer sends a setup request - packet, and the companion board returns a board identifier, the - desired telemetry update period and the number of data channels - provided. The flight computer doesn't interpret the telemetry - data at all, simply packing it up and sending it over the link. - Telemetry packets are 32 bytes long, and companion packets use 8 - bytes as a header leaving room for a maximum of 12 16-bit data - values. - </para> - <para> - Because of the limits of the AVR processors used in the first - two companion boards, the SPI data rate is set to 187.5kbaud. - </para> - </section> - <section> - <title>SPI Message Formats</title> - <para> - This section first defines the command message format sent from - the flight computer to the companion board, and then the various - reply message formats for each type of command message. - </para> - <section> - <title>Command Message</title> - <table frame='all'> - <title>Companion Command Message</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0</entry> - <entry>uint8_t</entry> - <entry>command</entry> - <entry>Command identifier</entry> - </row> - <row> - <entry>1</entry> - <entry>uint8_t</entry> - <entry>flight_state</entry> - <entry>Current flight computer state</entry> - </row> - <row> - <entry>2</entry> - <entry>uint16_t</entry> - <entry>tick</entry> - <entry>Flight computer clock (100 ticks/second)</entry> - </row> - <row> - <entry>4</entry> - <entry>uint16_t</entry> - <entry>serial</entry> - <entry>Flight computer serial number</entry> - </row> - <row> - <entry>6</entry> - <entry>uint16_t</entry> - <entry>flight</entry> - <entry>Flight number</entry> - </row> - <row> - <entry>8</entry> - </row> - </tbody> - </tgroup> - </table> - <table frame='all'> - <title>Companion Command Identifiers</title> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Value'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry>Value</entry> - <entry>Name</entry> - <entry>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>1</entry> - <entry>SETUP</entry> - <entry>Supply the flight computer with companion - information</entry> - </row> - <row> - <entry>2</entry> - <entry>FETCH</entry> - <entry>Return telemetry information</entry> - </row> - <row> - <entry>3</entry> - <entry>NOTIFY</entry> - <entry>Tell companion board when flight state - changes</entry> - </row> - </tbody> - </tgroup> - </table> - <para> - The flight computer will send a SETUP message shortly after - power-up and will then send FETCH messages no more often than - the rate specified in the SETUP reply. NOTIFY messages will be - sent whenever the flight state changes. - </para> - <para> - 'flight_state' records the current state of the flight, - whether on the pad, under power, coasting to apogee or - descending on the drogue or main chute. - </para> - <para> - 'tick' provides the current flight computer clock, which - be used to synchronize data recorded on the flight computer - with that recorded on the companion board in post-flight analysis. - </para> - <para> - 'serial' is the product serial number of the flight computer, - 'flight' is the flight sequence number. Together, these two - uniquely identify the flight and can be recorded with any - companion board data logging to associate the companion data - with the proper flight. - </para> - <para> - NOTIFY commands require no reply at all, they are used solely - to inform the companion board when the state of the flight, as - computed by the flight computer, changes. Companion boards can - use this to change data collection parameters, disabling data - logging until the flight starts and terminating it when the - flight ends. - </para> - </section> - <section> - <title>SETUP reply message</title> - <table frame='all'> - <title>SETUP reply contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0</entry> - <entry>uint16_t</entry> - <entry>board_id</entry> - <entry>Board identifier</entry> - </row> - <row> - <entry>2</entry> - <entry>uint16_t</entry> - <entry>board_id_inverse</entry> - <entry>~board_id—used to tell if a board is present</entry> - </row> - <row> - <entry>4</entry> - <entry>uint8_t</entry> - <entry>update_period</entry> - <entry>Minimum time (in 100Hz ticks) between FETCH commands</entry> - </row> - <row> - <entry>5</entry> - <entry>uint8_t</entry> - <entry>channels</entry> - <entry>Number of data channels to retrieve in FETCH command</entry> - </row> - <row> - <entry>6</entry> - </row> - </tbody> - </tgroup> - </table> - <para> - The SETUP reply contains enough information to uniquely - identify the companion board to the end user as well as for - the flight computer to know how many data values to expect in - reply to a FETCH command, and how often to fetch that data. - </para> - <para> - To detect the presence of a companion board, the flight - computer checks to make sure that board_id_inverse is the - bit-wise inverse of board_id. Current companion boards use - USB product ID as the board_id, but the flight computer does - not interpret this data and so it can be any value. - </para> - </section> - <section> - <title>FETCH reply message</title> - <table frame='all'> - <title>FETCH reply contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0</entry> - <entry>uint16_t</entry> - <entry>data0</entry> - <entry>0th data item</entry> - </row> - <row> - <entry>2</entry> - <entry>uint16_t</entry> - <entry>data1</entry> - <entry>1st data item</entry> - </row> - <row> - <entry>...</entry> - </row> - </tbody> - </tgroup> - </table> - <para> - The FETCH reply contains arbitrary data to be reported over - the flight computer telemetry link. The number of 16-bit data items - must match the 'channels' value provided in the SETUP reply - message. - </para> - </section> - </section> - <section> - <title>History and Motivation</title> - <para> - To allow cross-programming, the original TeleMetrum and - TeleDongle designs needed to include some kind of - connector. With that in place, adding the ability to connect - external cards to TeleMetrum was fairly simple. We set the - software piece of this puzzle aside until we had a companion - board to use. - </para> - <para> - The first companion board was TeleScience. Designed to collect - temperature data from the nose and fin of the airframe, the main - requirement for the companion port was that it be able to report - telemetry data during flight as a back-up in case the - TeleScience on-board data was lost. - </para> - <para> - The second companion board, TelePyro, provides 8 additional - channels for deployment, staging or other activities. To avoid - re-programming the TeleMetrum to use TelePyro, we decided to - provide enough information over the companion link for it to - independently control those channels. - </para> - <para> - Providing a standard, constant interface between the flight - computer and companion boards allows for the base flight - computer firmware to include support for companion boards. - </para> - </section> -</article> diff --git a/doc/config-device.inc b/doc/config-device.inc new file mode 100644 index 00000000..35848882 --- /dev/null +++ b/doc/config-device.inc @@ -0,0 +1,245 @@ +ifdef::altusmetrum[] + + ==== Main Deploy Altitude + + This sets the altitude (above the recorded pad + altitude) at which the 'main' igniter will fire. The + drop-down menu shows some common values, but you can + edit the text directly and choose whatever you + like. If the apogee charge fires below this altitude, + then the main charge will fire two seconds after the + apogee charge fires. + + ==== Apogee Delay + + When flying redundant electronics, it's often + important to ensure that multiple apogee charges don't + fire at precisely the same time, as that can over + pressurize the apogee deployment bay and cause a + structural failure of the air-frame. The Apogee Delay + parameter tells the flight computer to fire the apogee + charge a certain number of seconds after apogee has + been detected. + + ==== Apogee Lockout + + Apogee lockout is the number of seconds after boost + where the flight computer will not fire the apogee + charge, even if the rocket appears to be at + apogee. This is often called 'Mach Delay', as it is + intended to prevent a flight computer from + unintentionally firing apogee charges due to the + pressure spike that occurrs across a mach + transition. Altus Metrum flight computers include a + Kalman filter which is not fooled by this sharp + pressure increase, and so this setting should be left + at the default value of zero to disable it. + +endif::altusmetrum[] + +ifdef::radio[] + ==== Frequency + + This configures which of the frequencies to use for + both telemetry and packet command mode. Note that if + you set this value via packet command mode, the + TeleDongle frequency will also be automatically + reconfigured to match so that communication will + continue afterwards. + + ==== RF Calibration + + The radios in every Altus Metrum device are calibrated + at the factory to ensure that they transmit and + receive on the specified frequency. If you need to + you can adjust the calibration by changing this value. + Do not do this without understanding what the value + means, read the appendix on calibration and/or the + source code for more information. To change a + TeleDongle's calibration, you must reprogram the unit + completely. + + ==== Telemetry/RDF/APRS Enable + + Enables the radio for transmission during + flight. When disabled, the radio will not + transmit anything during flight at all. + + ==== Telemetry baud rate + + This sets the modulation bit rate for data + transmission for both telemetry and packet + link mode. Lower bit rates will increase range + while reducing the amount of data that can be + sent and increasing battery consumption. All + telemetry is done using a rate 1/2 constraint + 4 convolution code, so the actual data + transmission rate is 1/2 of the modulation bit + rate specified here. + + ==== APRS Interval + + How often to transmit GPS information via APRS + (in seconds). When set to zero, APRS + transmission is disabled. + ifdef::altusmetrum[] + This option is + available on TeleMetrum v2 and TeleMega + boards. TeleMetrum v1 boards cannot transmit + APRS packets. + endif::altusmetrum[] + Note that a single APRS packet + takes nearly a full second to transmit, so + enabling this option will prevent sending any + other telemetry during that time. + + ==== APRS SSID + + Which SSID to report in APRS packets. By + default, this is set to the last digit of the + serial number, but can be configured to any + value from 0 to 9. + + ==== APRS Format + + Whether to send APRS data in Compressed or + Uncompressed format. Compressed format is + smaller and more precise. Uncompressed + format is older, but may work better with your + device. The Kenwood TH-D72 only displays + altitude information with Uncompressed + format, while the Yaesu FT1D only displays + altitude with Compressed format. Test before + you fly to see which to use. + + ==== Callsign + + This sets the call sign included in each + telemetry packet. Set this as needed to + conform to your local radio regulations. +endif::radio[] + +ifdef::altusmetrum[] + + ==== Maximum Flight Log Size + + This sets the space (in kilobytes) allocated + for each flight log. The available space will + be divided into chunks of this size. A smaller + value will allow more flights to be stored, a + larger value will record data from longer + flights. + + ==== Ignitor Firing Mode + + This configuration parameter allows the two standard ignitor + channels (Apogee and Main) to be used in different + configurations. + + Dual Deploy:: + This is the usual mode of operation; the + 'apogee' channel is fired at apogee and the + 'main' channel at the height above ground + specified by the 'Main Deploy Altitude' during + descent. + + Redundant Apogee:: + This fires both channels at apogee, the + 'apogee' channel first followed after a two + second delay by the 'main' channel. + + Redundant Main:: + This fires both channels at the height above + ground specified by the Main Deploy Altitude + setting during descent. The 'apogee' channel + is fired first, followed after a two second + delay by the 'main' channel. + + ifdef::telemetrum,telemega,easymega[] + ==== Pad Orientation + + Because they include accelerometers, + TeleMetrum, TeleMega and EasyMega are + sensitive to the orientation of the board. By + default, they expect the antenna end to point + forward. This parameter allows that default to + be changed, permitting the board to be mounted + with the antenna pointing aft instead. + + Antenna Up:: + In this mode, the antenna end of the flight + computer must point forward, in line with the + expected flight path. + + Antenna Down:: + In this mode, the antenna end of the flight + computer must point aft, in line with the + expected flight path. + endif::telemetrum,telemega,easymega[] + + ==== Beeper Frequency + + The beeper on all Altus Metrum flight + computers works best at 4000Hz, however if you + have more than one flight computer in a single + airframe, having all of them sound at the same + frequency can be confusing. This parameter + lets you adjust the base beeper frequency + value. + +endif::altusmetrum[] + +ifdef::telegps[] + ==== Logging Trigger Motion + + This sets the amount of motion that TeleGPS + needs to see before logging the new + position. Motions smaller than this are + skipped, which saves storage space. + + ==== Position Reporting Interval + + The interval between TeleGPS position reports, + both over the air and in the log. Increase + this to reduce the frequency of radio + transmissions and the length of time available + in the log. +endif::telegps[] + +ifdef::telemega,easymega[] + + ==== Configure Pyro Channels + + .Additional Pyro Channel Configuration + image::configure-pyro.png[width="5.5in"] + + This opens a separate window to configure the + additional pyro channels available on TeleMega + and EasyMega. One column is presented for + each channel. Each row represents a single + parameter, if enabled the parameter must meet + the specified test for the pyro channel to be + fired. + + Select conditions and set the related value; + the pyro channel will be activated when *all* + of the conditions are met. Each pyro channel + has a separate set of configuration values, so + you can use different values for the same + condition with different channels. + + At the bottom of the window, the 'Pyro Firing + Time' configuration sets the length of time + (in seconds) which each of these pyro channels + will fire for. + + Once you have selected the appropriate + configuration for all of the necessary pyro + channels, you can save the pyro configuration + along with the rest of the flight computer + configuration by pressing the 'Save' button in + the main Configure Flight Computer window. + + include::pyro-channels.raw[] + +endif::telemega,easymega[] diff --git a/doc/config-ui.inc b/doc/config-ui.inc new file mode 100644 index 00000000..fdcfb9dc --- /dev/null +++ b/doc/config-ui.inc @@ -0,0 +1,113 @@ +ifdef::radio[] +==== Voice Settings + + {application} provides voice announcements during + flight so that you can keep your eyes on the + sky and still get information about the + current flight status. However, sometimes you + don't want to hear them. + + Enable:: + Turns all voice announcements on and off + + Test Voice:: + Plays a short message allowing you to verify + that the audio system is working and the volume settings + are reasonable +endif::radio[] + +==== Log Directory + + {application} logs all telemetry data and saves all + flash data to this directory. This + directory is also used as the staring point + when selecting data files for display or + export. + + Click on the directory name to bring up a + directory choosing dialog, select a new + directory and click 'Select Directory' to + change where {application} reads and writes data + files. + +ifdef::radio[] +==== Callsign + + This value is transmitted in each command + packet sent from TeleDongle and received from + an altimeter. It is not used in telemetry + mode, as the callsign configured in the + altimeter board is included in all telemetry + packets. Configure this with the {application} + operators call sign as needed to comply with + your local radio regulations. + + Note that to successfully command a flight + computer over the radio (to configure the + altimeter, monitor idle, or fire pyro + charges), the callsign configured here must + exactly match the callsign configured in the + flight computer. This matching is case + sensitive. +endif::radio[] + +==== Imperial Units + + This switches between metric units (meters) + and imperial units (feet and miles). This + affects the display of values use during + flight monitoring, configuration, data + graphing and all of the voice + announcements. It does not change the units + used when exporting to CSV files, those are + always produced in metric units. + +==== Serial Debug + + This causes all communication with a connected + device to be dumped to the console from which + {application} was started. If you've started it from + an icon or menu entry, the output will simply + be discarded. This mode can be useful to debug + various serial communication issues. + +==== Font size + + Selects the set of fonts used in the flight + monitor window. Choose between the small, + medium and large sets. + +==== Look & feel + + Switches between the available Java user + interface appearances. The default selection + is supposed to match the native window system + appearance for the target platform. + +==== Menu position + + Selects the initial position for the main + {application} window that includes all of the + command buttons. + +ifdef::gps[] +==== Map Cache Size + + Sets the number of map 'tiles' kept in memory + while the application is running. More tiles + consume more memory, but will make panning + around the map faster. +endif::gps[] + +ifdef::radio[] +==== Manage Frequencies + + This brings up a dialog where you can + configure the set of frequencies shown in the + various frequency menus. You can add as many + as you like, or even reconfigure the default + set. Changing this list does not affect the + frequency settings of any devices, it only + changes the set of frequencies shown in the + menus. +endif::radio[] diff --git a/doc/dedication.inc b/doc/dedication.inc new file mode 100644 index 00000000..6fac8e45 --- /dev/null +++ b/doc/dedication.inc @@ -0,0 +1,26 @@ +[dedication] +== Acknowledgments + + Thanks to Bob Finch, W9YA, NAR 12965, TRA 12350 for writing “The + Mere-Mortals Quick Start/Usage Guide to the Altus Metrum Starter + Kit” which formed the basis of the original Getting Started chapter + in this manual. Bob was one of our first customers for a production + TeleMetrum, and his continued enthusiasm and contributions + are immensely gratifying and highly appreciated! + + And thanks to Anthony (AJ) Towns for major contributions including + the AltosUI graphing and site map code and associated documentation. + Free software means that our customers and friends can become our + collaborators, and we certainly appreciate this level of + contribution! + + Have fun using these products, and we hope to meet all of you + out on the rocket flight line somewhere. + + [verse] + Bdale Garbee, KB0G + NAR #87103, TRA #12201 + + [verse] + Keith Packard, KD7SQG + NAR #88757, TRA #12200 diff --git a/doc/easymega-outline.txt b/doc/easymega-outline.txt new file mode 100644 index 00000000..f5ca982c --- /dev/null +++ b/doc/easymega-outline.txt @@ -0,0 +1,9 @@ += EasyMega Outline and Hole Pattern +:doctype: article + + This image, when printed, provides a precise template for the + mounting holes in EasyMega. EasyMega has overall dimensions of + 1.250 x 2.250 inches, and the mounting holes are sized for use + with 4-40 or M3 screws. + + image::easymega.svg[align="center"] diff --git a/doc/easymega-outline.xsl b/doc/easymega-outline.xsl deleted file mode 100644 index 5796f9c9..00000000 --- a/doc/easymega-outline.xsl +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" - "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> -<article> - <title>EasyMega Outline and Hole Pattern</title> - <para> - This image, when printed, provides a precise template for the - mounting holes in EasyMega. EasyMega has overall dimensions - of 1.250 x 2.250 inches, and the mounting holes are sized for - use with 4-40 or M3 screws. - </para> - <informalfigure> - <mediaobject id="EasyMegaTemplate"> - <imageobject> - <imagedata format="SVG" fileref="easymega.svg" - scalefit="0" scale="100" align="center" /> - </imageobject> - </mediaobject> - </informalfigure> -</article> - -<!-- LocalWords: Altusmetrum ---> diff --git a/doc/easymega.inc b/doc/easymega.inc new file mode 100644 index 00000000..c126004b --- /dev/null +++ b/doc/easymega.inc @@ -0,0 +1,123 @@ +== EasyMega + + .EasyMega Board + image::easymega-v1.0-top.jpg[width="4.5in"] + + EasyMega is a 1¼ inch by 2¼ inch circuit board. It was + designed to easily fit in a 38mm coupler. Like TeleMetrum, + EasyMega has an accelerometer and so it must be mounted so that + the board is aligned with the flight axis. It can be mounted + either antenna up or down. + + === EasyMega Screw Terminals + + EasyMega has two sets of nine screw terminals on the end of + the board opposite the telemetry antenna. They are as follows: + + .EasyMega Screw Terminals + [options="header",grid="all",cols="2,3,10"] + |==== + |Terminal #|Terminal Name|Description + + |Top 1 + |Switch Input + |Switch connection to positive battery terminal + + |Top 2 + |Switch Output + |Switch connection to flight computer + + |Top 3 + |GND + |Ground connection for use with external active switch + + |Top 4 + |Main - + |Main pyro channel connection to pyro circuit + + |Top 5 + |Main + + |Main pyro channel common connection to battery + + + |Top 6 + |Apogee - + |Apogee pyro channel connection to pyro circuit + + |Top 7 + |Apogee + + |Apogee pyro channel common connection to battery + + + |Top 8 + |D - + |D pyro channel connection to pyro circuit + + |Top 9 + |D + + |D pyro channel common connection to battery + + + |Bottom 1 + |GND + |Ground connection for negative pyro battery terminal + + |Bottom 2 + |Pyro + |Positive pyro battery terminal + + |Bottom 3 + |Lipo + |Power switch output. Use to connect main battery to pyro battery input + + |Bottom 4 + |A - + |A pyro channel connection to pyro circuit + + |Bottom 5 + |A + + |A pyro channel common connection to battery + + + |Bottom 6 + |B - + |B pyro channel connection to pyro circuit + + |Bottom 7 + |B + + |B pyro channel common connection to battery + + + |Bottom 8 + |C - + |C pyro channel connection to pyro circuit + + |Bottom 9 + |C + + |C pyro channel common connection to battery + + |==== + + === Using a Separate Pyro Battery with EasyMega + + EasyMega provides explicit support for an external pyro + battery. All that is required is to remove the jumper + between the lipo terminal (Bottom 3) and the pyro terminal + (Bottom 2). Then hook the negative pyro battery terminal to ground + (Bottom 1) and the positive pyro battery to the pyro battery + input (Bottom 2). You can then use the existing pyro screw + terminals to hook up all of the pyro charges. + + === Using Only One Battery With EasyMega + + Because EasyMega has built-in support for a separate pyro + battery, if you want to fly with just one battery running + both the computer and firing the charges, you need to + connect the flight computer battery to the pyro + circuit. EasyMega has two screw terminals for this—hook a + wire from the Lipo terminal (Bottom 3) to the Pyro terminal + (Bottom 2). + + === Using an Active Switch with EasyMega + + As explained above, an external active switch requires three + connections, one to the positive battery terminal, one to + the flight computer positive input and one to ground. + + The positive battery terminal is available on Top terminal + 1, the positive flight computer input is on Top terminal + 2. Ground is on Top terminal 3. diff --git a/doc/easymini-device.inc b/doc/easymini-device.inc new file mode 100644 index 00000000..fb2b6098 --- /dev/null +++ b/doc/easymini-device.inc @@ -0,0 +1,116 @@ +== EasyMini + + .EasyMini Board + image::easymini-top.jpg[width="5.5in"] + + EasyMini is built on a 0.8 inch by 1½ inch circuit board. It's + designed to fit in a 24mm coupler tube. + + You usually don't need to configure EasyMini at all; it's set + up to do dual-deployment with an event at apogee to separate + the airframe and deploy a drogue and another event at 250m + (820ft) to deploy the main. Install EasyMini in your airframe, + hook up a battery, igniters and a power switch and you're + ready to fly. + + === EasyMini Screw Terminals + + EasyMini has two sets of four screw terminals near one end of the + board. Using the picture + above, the top four have connections for the main pyro + circuit and an external battery and the bottom four have + connections for the apogee pyro circuit and the power + switch. Counting from the left, the connections are as follows: + + .EasyMini Screw Terminals + [options="header",grid="all",cols="2,3,10"] + |==== + |Terminal #|Terminal Name|Description + |Top 1 + |Main - + |Main pyro channel connection to pyro circuit + + |Top 2 + |Main + + |Main pyro channel common connection to battery + + + |Top 3 + |Battery + + |Positive external battery terminal + + |Top 4 + |Battery - + |Negative external battery terminal + + |Bottom 1 + |Apogee - + |Apogee pyro channel connection to pyro circuit + + |Bottom 2 + |Apogee + + |Apogee pyro channel common connection to battery + + + |Bottom 3 + |Switch Output + |Switch connection to flight computer + + |Bottom 4 + |Switch Input + |Switch connection to positive battery terminal + |==== + + === Connecting A Battery To EasyMini + + There are two possible battery connections on + EasyMini. You can use either method; both feed + through the power switch terminals. + + One battery connection is the standard Altus Metrum + white JST plug. This mates with single-cell Lithium + Polymer batteries sold by Altus Metrum. + + The other is a pair of screw terminals marked 'Battery + +' and 'Battery -'. Connect a battery from 4 to 12 + volts to these terminals, being careful to match polarity. + + === Charging Lithium Batteries + + Because EasyMini allows for batteries other than the + standard Altus Metrum Lithium Polymer cells, it cannot + incorporate a battery charger circuit. Therefore, when + using a Litium Polymer cell, you'll need an external + charger. These are available from Altus Metrum, or + from Spark Fun. + + === Using a Separate Pyro Battery with EasyMini + + As described above, using an external pyro battery involves + connecting the negative battery terminal to the flight + computer ground, connecting the positive battery terminal to + one of the igniter leads and connecting the other igniter + lead to the per-channel pyro circuit connection. + + To connect the negative pyro battery terminal to EasyMini + ground, connect it to the negative external battery + connection, top terminal 4. + + Connecting the positive battery terminal to the pyro + charges must be done separate from EasyMini, by soldering + them together or using some other connector. + + The other lead from each pyro charge is then inserted into + the appropriate per-pyro channel screw terminal (top + terminal 1 for the Main charge, bottom terminal 1 for the + Apogee charge). + + === Using an Active Switch with EasyMini + + As explained above, an external active switch requires three + connections, one to the positive battery terminal, one to + the flight computer positive input and one to ground. Use + the negative external battery connection, top terminal 4 for + ground. + + The positive battery terminal is available on bottom + terminal 4, the positive flight computer input is on the + bottom terminal 3. diff --git a/doc/easymini-docinfo.xml b/doc/easymini-docinfo.xml new file mode 100644 index 00000000..7789d2f3 --- /dev/null +++ b/doc/easymini-docinfo.xml @@ -0,0 +1,48 @@ +<subtitle>A Dual-Deploy Rocketry Flight Computer</subtitle> +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<copyright> + <year>2016</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="easymini-top.jpg" width="3.0in"/> + </imageobject> +</mediaobject> + +<corpauthor> + <inlinemediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="3in"/> + </imageobject> + </inlinemediaobject> +</corpauthor> + +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> +<revhistory> + <?dbhtml filename="easymini-revhistory.html"?> + <revision> + <revnumber>1.6.2</revnumber> + <date>10 January 2016</date> + <revremark> + First release of separate EasyMini doc + </revremark> + </revision> +</revhistory> diff --git a/doc/easymini-outline.txt b/doc/easymini-outline.txt new file mode 100644 index 00000000..e031b5ee --- /dev/null +++ b/doc/easymini-outline.txt @@ -0,0 +1,9 @@ += EasyMini Outline and Hole Pattern +:doctype: article + + This image, when printed, provides a precise template for the + mounting holes in EasyMini. EasyMini has overall dimensions + of 0.800 x 1.500 inches, and the mounting holes are sized for + use with 4-40 or M3 screws. + + image::easymini.svg[align="center"] diff --git a/doc/easymini-outline.xsl b/doc/easymini-outline.xsl deleted file mode 100644 index 88125322..00000000 --- a/doc/easymini-outline.xsl +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" - "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> -<article> - <title>EasyMini Outline and Hole Pattern</title> - <para> - This image, when printed, provides a precise template for the - mounting holes in EasyMini. EasyMini has overall dimensions - of 0.800 x 1.500 inches, and the mounting holes are sized for - use with 4-40 or M3 screws. - </para> - <informalfigure> - <mediaobject id="EasyMiniTemplate"> - <imageobject> - <imagedata format="SVG" fileref="easymini.svg" - scalefit="0" scale="100" align="center" /> - </imageobject> - </mediaobject> - </informalfigure> -</article> - -<!-- LocalWords: Altusmetrum ---> diff --git a/doc/easymini-release-notes.inc b/doc/easymini-release-notes.inc new file mode 100644 index 00000000..352a989b --- /dev/null +++ b/doc/easymini-release-notes.inc @@ -0,0 +1,7 @@ +[appendix] +== Release Notes + + :leveloffset: 2 + include::release-notes-1.6.2.raw[] + + :leveloffset: 0 diff --git a/doc/easymini.txt b/doc/easymini.txt new file mode 100644 index 00000000..1a75b929 --- /dev/null +++ b/doc/easymini.txt @@ -0,0 +1,34 @@ += EasyMini Owner's Manual +:doctype: book +:numbered: +:altusmetrum: 1 +:easymini: 1 +:application: AltosUI + + include::dedication.raw[] + + include::intro.raw[] + + include::getting-started.raw[] + + include::usage.raw[] + + include::easymini-device.raw[] + + include::installation.raw[] + + include::using-am-products.raw[] + + include::altosui.raw[] + + include::system-operation.raw[] + + include::handling.raw[] + + include::updating-firmware.raw[] + + include::flight-data-recording.raw[] + + include::specs.raw[] + + include::easymini-release-notes.raw[] diff --git a/doc/flight-data-recording.inc b/doc/flight-data-recording.inc new file mode 100644 index 00000000..32e44840 --- /dev/null +++ b/doc/flight-data-recording.inc @@ -0,0 +1,87 @@ +[appendix] +== Flight Data Recording + + Each flight computer logs data at 100 samples per second + during ascent and 10 samples per second during + ifdef::telemini[] + descent, except for TeleMini v1.0, which records ascent at 10 samples + per second and descent at 1 sample per second. + endif::telemini[] + ifndef::telemini[] + descent. + endif::telemini[] + Data are logged to + an on-board flash memory part, which can be partitioned into + several equal-sized blocks, one for each flight. + + .Data Storage on Altus Metrum altimeters + [options="header",cols="1,1,1,1"] + |==== + |Device |Bytes per Sample |Total Storage |Minutes at Full Rate + ifdef::telemetrum[] + |TeleMetrum v1.0 |8 |1MB |20 + |TeleMetrum v1.1 v1.2 |8 |2MB |40 + |TeleMetrum v2.0 |16 |8MB |80 + endif::telemetrum[] + ifdef::telemini[] + |TeleMini v1.0 |2 |5kB |4 + endif::telemini[] + ifdef::easymini[] + |EasyMini |16 |1MB |10 + endif::easymini[] + ifdef::telemega[] + |TeleMega |32 |8MB |40 + endif::telemega[] + ifdef::easymega[] + |EasyMega |32 |8MB |40 + endif::easymega[] + |==== + + The on-board flash is partitioned into separate flight logs, + each of a fixed maximum size. Increase the maximum size of + each log and you reduce the number of flights that can be + stored. Decrease the size and you can store more flights. + + Configuration data is also stored in the flash memory on + ifdef::telemetrum[TeleMetrum v1.x,] + ifdef::telemini[TeleMini and] + ifdef::easymini[EasyMini.] + This consumes 64kB + of flash space. This configuration space is not available + for storing flight log data. + + ifdef::telemetrum,telemega,easymega[] + TeleMetrum v2.0, TeleMega and EasyMega + store configuration data in a bit of eeprom available within + the processor chip, leaving that space available in flash for + more flight data. + endif::telemetrum,telemega,easymega[] + + To compute the amount of space needed for a single flight, you + can multiply the expected ascent time (in seconds) by 100 + times bytes-per-sample, multiply the expected descent time (in + seconds) by 10 times the bytes per sample and add the two + together. That will slightly under-estimate the storage (in + bytes) needed for the flight. + ifdef::telemetrum[] + For instance, a TeleMetrum v2.0 flight spending + 20 seconds in ascent and 150 seconds in descent will take + about (20 * 1600) + (150 * 160) = 56000 bytes of storage. You + could store dozens of these flights in the on-board flash. + endif::telemetrum[] + + The default size allows for several flights on each flight + ifdef::telemini[] + computer, except for TeleMini v1.0, which + only holds data for a single flight. + endif::telemini[] + ifndef::telemini[] + computer. + endif::telemini[] + You can adjust the size. + + Altus Metrum flight computers will not overwrite existing + flight data, so be sure to download flight data and erase it + from the flight computer before it fills up. The flight + computer will still successfully control the flight even if it + cannot log data, so the only thing you will lose is the data. diff --git a/doc/fonts/DejaVuSansMono-Bold.ttf b/doc/fonts/DejaVuSansMono-Bold.ttf Binary files differnew file mode 100644 index 00000000..1085a738 --- /dev/null +++ b/doc/fonts/DejaVuSansMono-Bold.ttf diff --git a/doc/fonts/DejaVuSansMono-BoldOblique.ttf b/doc/fonts/DejaVuSansMono-BoldOblique.ttf Binary files differnew file mode 100644 index 00000000..3175ebf2 --- /dev/null +++ b/doc/fonts/DejaVuSansMono-BoldOblique.ttf diff --git a/doc/fonts/DejaVuSansMono-Oblique.ttf b/doc/fonts/DejaVuSansMono-Oblique.ttf Binary files differnew file mode 100644 index 00000000..d5d6f92d --- /dev/null +++ b/doc/fonts/DejaVuSansMono-Oblique.ttf diff --git a/doc/fonts/DejaVuSansMono.ttf b/doc/fonts/DejaVuSansMono.ttf Binary files differnew file mode 100644 index 00000000..05e23457 --- /dev/null +++ b/doc/fonts/DejaVuSansMono.ttf diff --git a/doc/fonts/OpenSans-Bold.ttf b/doc/fonts/OpenSans-Bold.ttf Binary files differnew file mode 100644 index 00000000..fd79d43b --- /dev/null +++ b/doc/fonts/OpenSans-Bold.ttf diff --git a/doc/fonts/OpenSans-BoldItalic.ttf b/doc/fonts/OpenSans-BoldItalic.ttf Binary files differnew file mode 100644 index 00000000..9bc80095 --- /dev/null +++ b/doc/fonts/OpenSans-BoldItalic.ttf diff --git a/doc/fonts/OpenSans-ExtraBold.ttf b/doc/fonts/OpenSans-ExtraBold.ttf Binary files differnew file mode 100644 index 00000000..21f6f84a --- /dev/null +++ b/doc/fonts/OpenSans-ExtraBold.ttf diff --git a/doc/fonts/OpenSans-ExtraBoldItalic.ttf b/doc/fonts/OpenSans-ExtraBoldItalic.ttf Binary files differnew file mode 100644 index 00000000..31cb6883 --- /dev/null +++ b/doc/fonts/OpenSans-ExtraBoldItalic.ttf diff --git a/doc/fonts/OpenSans-Italic.ttf b/doc/fonts/OpenSans-Italic.ttf Binary files differnew file mode 100644 index 00000000..c90da48f --- /dev/null +++ b/doc/fonts/OpenSans-Italic.ttf diff --git a/doc/fonts/OpenSans-Light.ttf b/doc/fonts/OpenSans-Light.ttf Binary files differnew file mode 100644 index 00000000..0d381897 --- /dev/null +++ b/doc/fonts/OpenSans-Light.ttf diff --git a/doc/fonts/OpenSans-LightItalic.ttf b/doc/fonts/OpenSans-LightItalic.ttf Binary files differnew file mode 100644 index 00000000..68299c4b --- /dev/null +++ b/doc/fonts/OpenSans-LightItalic.ttf diff --git a/doc/fonts/OpenSans-Regular.ttf b/doc/fonts/OpenSans-Regular.ttf Binary files differnew file mode 100644 index 00000000..db433349 --- /dev/null +++ b/doc/fonts/OpenSans-Regular.ttf diff --git a/doc/fonts/OpenSans-Semibold.ttf b/doc/fonts/OpenSans-Semibold.ttf Binary files differnew file mode 100644 index 00000000..1a7679e3 --- /dev/null +++ b/doc/fonts/OpenSans-Semibold.ttf diff --git a/doc/fonts/OpenSans-SemiboldItalic.ttf b/doc/fonts/OpenSans-SemiboldItalic.ttf Binary files differnew file mode 100644 index 00000000..59b6d16b --- /dev/null +++ b/doc/fonts/OpenSans-SemiboldItalic.ttf diff --git a/doc/footer.templates.xsl b/doc/footer.templates.xsl new file mode 100644 index 00000000..3484c0eb --- /dev/null +++ b/doc/footer.templates.xsl @@ -0,0 +1,52 @@ +<?xml version="1.0"?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:fo="http://www.w3.org/1999/XSL/Format" + xmlns:d="http://docbook.org/ns/docbook" + version="1.0"> + +<xsl:template name="footer.content"> + <xsl:param name="pageclass" select="''"/> + <xsl:param name="sequence" select="''"/> + <xsl:param name="position" select="''"/> + <xsl:param name="gentext-key" select="''"/> + +<!-- + <fo:block> + <xsl:value-of select="$pageclass"/> + <xsl:text>, </xsl:text> + <xsl:value-of select="$sequence"/> + <xsl:text>, </xsl:text> + <xsl:value-of select="$position"/> + <xsl:text>, </xsl:text> + <xsl:value-of select="$gentext-key"/> + </fo:block> +--> + + <fo:block> + <!-- pageclass can be front, body, back --> + <!-- sequence can be odd, even, first, blank --> + <!-- position can be left, center, right --> + <xsl:choose> + <xsl:when test="$pageclass = 'titlepage'"> + <!-- nop; no footer on title pages --> + </xsl:when> + + <xsl:when test="$position='right'"> + <fo:page-number/> + </xsl:when> + + <xsl:when test="$position='left'"> + <fo:block font-size="10"> + <xsl:value-of select="//legalnotice"/> + </fo:block> + </xsl:when> + + <xsl:otherwise> + <!-- nop --> + </xsl:otherwise> + </xsl:choose> + </fo:block> +</xsl:template> + +</xsl:stylesheet> + diff --git a/doc/fop.xconf b/doc/fop.xconf new file mode 100644 index 00000000..9ac42820 --- /dev/null +++ b/doc/fop.xconf @@ -0,0 +1,88 @@ +<?xml version="1.0"?> +<!-- $Id: fop.xconf 1339442 2012-05-17 01:42:56Z gadams $ --> + +<!-- + +This is an example configuration file for FOP. +This file contains the same settings as the default values +and will have no effect if used unchanged. + +Relative config url's will be resolved relative to +the location of this file. + +--> + +<!-- NOTE: This is the version of the configuration --> +<fop version="1.0"> + + <!-- Base URL for resolving relative URLs --> + <base>.</base> + + <!-- Source resolution in dpi (dots/pixels per inch) for determining the size of pixels in SVG and bitmap images, default: 72dpi --> + <source-resolution>72</source-resolution> + <!-- Target resolution in dpi (dots/pixels per inch) for specifying the target resolution for generated bitmaps, default: 72dpi --> + <target-resolution>72</target-resolution> + + <!-- Default page-height and page-width, in case + value is specified as auto --> + <default-page-settings height="11in" width="8.26in"/> + + <!-- Information for specific renderers --> + <!-- Uses renderer mime type for renderers --> + <renderers> + <renderer mime="application/pdf"> + <filterList> + <!-- provides compression using zlib flate (default is on) --> + <value>flate</value> + </filterList> + + <fonts> + <!-- embedded fonts --> + <font embed-url="fonts/OpenSans-Light.ttf"> + <font-triplet name="Open Sans Light" style="normal" + weight="normal"/> + </font> + <font embed-url="fonts/OpenSans-LightItalic.ttf"> + <font-triplet name="Open Sans Light" style="italic" + weight="normal"/> + </font> + <font embed-url="fonts/OpenSans-Semibold.ttf"> + <font-triplet name="Open Sans Light" style="normal" + weight="bold"/> + </font> + <font embed-url="fonts/OpenSans-SemiboldItalic.ttf"> + <font-triplet name="Open Sans Light" style="italic" + weight="bold"/> + </font> + + <font embed-url="fonts/DejaVuSansMono.ttf"> + <font-triplet name="DejaVu Sans Mono" style="normal" + weight="normal"/> + </font> + <font embed-url="fonts/DejaVuSansMono-Oblique.ttf"> + <font-triplet name="DejaVu Sans Mono" style="italic" + weight="normal"/> + </font> + <font embed-url="fonts/DejaVuSansMono-Bold.ttf"> + <font-triplet name="DejaVu Sans Mono" style="normal" + weight="bold"/> + </font> + <font embed-url="fonts/DejaVuSansMono-BoldOblique.ttf"> + <font-triplet name="DejaVu Sans Mono" style="italic" + weight="bold"/> + </font> + </fonts> + </renderer> + + <renderer mime="image/svg+xml"> + <format type="paginated"/> + <link value="true"/> + <strokeText value="false"/> + </renderer> + + <renderer mime="text/xml"> + </renderer> + + </renderers> +</fop> + diff --git a/doc/getting-started.inc b/doc/getting-started.inc new file mode 100644 index 00000000..decaf4d4 --- /dev/null +++ b/doc/getting-started.inc @@ -0,0 +1,95 @@ +== Getting Started + + The first thing to do after you open the box is to hook up a + battery and charge it if necessary. + + === Batteries + + ifdef::telemetrum,telemega,easymega[] + For TeleMetrum, TeleMega and EasyMega, the battery can be charged by plugging it into the + corresponding socket of the device and then using the USB + cable to plug the flight computer into your computer's USB socket. The + on-board circuitry will charge the battery whenever it is plugged + in, because the on-off switch does NOT control the + charging circuitry. + endif::telemetrum,telemega,easymega[] + The Lithium Polymer + ifdef::telemini[TeleMini and] + EasyMini battery can be charged by disconnecting it + from the board and plugging it into a standalone + battery charger such as link:http://altusmetrum.org/LipoCharger[LipoCharger], and + connecting that via a USB cable to a laptop or other + USB power source. + + You can also choose to use another battery with + EasyMini, anything supplying between 4 and 12 volts should + work fine (like a standard 9V battery), but if you are planning + to fire pyro charges, ground testing is required to verify that + the battery supplies enough current to fire your chosen e-matches. + + ifdef::telemetrum,telemega,easymega[] + [NOTE] + ==== + On TeleMetrum v1 boards, when the GPS chip is initially + searching for satellites, TeleMetrum will consume more current + than it pulls from the USB port, so the battery must be + attached in order to get satellite lock. Once GPS is locked, + the current consumption goes back down enough to enable charging + while running. So it's a good idea to fully charge the battery + as your first item of business so there is no issue getting and + maintaining satellite lock. The yellow charge indicator led + will go out when the battery is nearly full and the charger goes + to trickle charge. It can take several hours to fully recharge a + deeply discharged battery. + + TeleMetrum v2.0, TeleMega and EasyMega use a higher power battery charger, + allowing them to charge the battery while running the board at + maximum power. When the battery is charging, or when the board + is consuming a lot of power, the red LED will be lit. When the + battery is fully charged, the green LED will be lit. When the + battery is damaged or missing, both LEDs will be lit, which + appears yellow. + ==== + endif::telemetrum,telemega,easymega[] + + ifdef::radio[] + === Ground Station Hardware + + There are two ground stations available, the TeleDongle USB to + RF interface and the TeleBT Bluetooth/USB to RF interface. If + you plug either of these in to your Mac or Linux computer it should + “just work”, showing up as a serial port device. Windows systems need + driver information that is part of the AltOS download to know that the + existing USB modem driver will work. We therefore recommend installing + our software before plugging in TeleDongle if you are using a Windows + computer. If you are using an older version of Linux and are having + problems, try moving to a fresher kernel (2.6.33 or + newer). + endif::radio[] + + === Linux/Mac/Windows Ground Station Software + + Next you should obtain and install the AltOS software. + The AltOS distribution includes the AltosUI ground + station program, current firmware images for all of + the hardware, and a number of standalone utilities + that are rarely needed. Pre-built binary packages are + available for Linux, Microsoft Windows, Mac OSX. Full + source code and build instructions are also + available. The latest version may always be downloaded + from http://altusmetrum.org/AltOS + + ifdef::radio[] + === Android Ground Station Software + + TeleBT can also connect to an Android device over + BlueTooth or USB. The + link:https://play.google.com/store/apps/details?id=org.altusmetrum.AltosDroid[AltosDroid + Android application] is available from the + link:https://play.google.com[Google Play system]. + + You don't need a data plan to use AltosDroid, but + without network access, you'll want to download + offline map data before wandering away from the + network. + endif::radio[] diff --git a/doc/handling.inc b/doc/handling.inc new file mode 100644 index 00000000..7565996a --- /dev/null +++ b/doc/handling.inc @@ -0,0 +1,43 @@ +[appendix] +== Handling Precautions + + All Altus Metrum products are sophisticated electronic devices. + When handled gently and properly installed in an air-frame, they + will deliver impressive results. However, as with all electronic + devices, there are some precautions you must take. + + [WARNING] + The Lithium Polymer rechargeable batteries have an + extraordinary power density. This is great because we can fly with + much less battery mass than if we used alkaline batteries or previous + generation rechargeable batteries... but if they are punctured + or their leads are allowed to short, they can and will release their + energy very rapidly! + Thus we recommend that you take some care when handling our batteries + and consider giving them some extra protection in your air-frame. We + often wrap them in suitable scraps of closed-cell packing foam before + strapping them down, for example. + + The barometric sensors used on all of our flight computers are + sensitive to sunlight. In normal mounting situations, the baro sensor + and all of the other surface mount components + are “down” towards whatever the underlying mounting surface is, so + this is not normally a problem. Please consider this when designing an + installation in an air-frame with a see-through plastic payload bay. It + is particularly important to + consider this with TeleMini v1.0, both because the baro sensor is on the + “top” of the board, and because many model rockets with payload bays + use clear plastic for the payload bay! Replacing these with an opaque + cardboard tube, painting them, or wrapping them with a layer of masking + tape are all reasonable approaches to keep the sensor out of direct + sunlight. + + The barometric sensor sampling port must be able to “breathe”, + both by not being covered by foam or tape or other materials that might + directly block the hole on the top of the sensor, and also by having a + suitable static vent to outside air. + + As with all other rocketry electronics, Altus Metrum altimeters must + be protected from exposure to corrosive motor exhaust and ejection + charge gasses. + diff --git a/doc/installation.inc b/doc/installation.inc new file mode 100644 index 00000000..d390551e --- /dev/null +++ b/doc/installation.inc @@ -0,0 +1,69 @@ +== Installation + + A typical installation involves attaching + only a suitable battery, a single pole switch for + power on/off, and two pairs of wires connecting e-matches for the + apogee and main ejection charges. All Altus Metrum products are + designed for use with single-cell batteries with 3.7 volts + nominal. + ifdef::telemini[TeleMini v2.0 and] + EasyMini may also be used with other + batteries as long as they supply between 4 and 12 volts. + + The battery connectors are a standard 2-pin JST connector; you + can purchase suitable batteries from the any vendor selling + Altus Metrum products. These batteries are + single-cell Lithium Polymer batteries that nominally provide 3.7 + volts. Other vendors sell similar batteries for RC aircraft + using mating connectors, however the polarity for those is + generally reversed from the batteries used by Altus Metrum + products. In particular, the Tenergy batteries supplied for use + in Featherweight flight computers are not compatible with Altus + Metrum flight computers or battery chargers. + + [WARNING] + Check polarity and voltage before connecting any battery not + purchased from Altus Metrum. + + [WARNING] + Spark Fun sells batteries that have a matching connector with + the correct polarity. However, these batteries include an + integrated current limiting circuit. That circuit will cause + the battery to shut down when firing the igniter circuit. Do + not use these batteries unless you remove the current limiting + circuit. + + By default, we use the unregulated output of the battery + directly to fire ejection charges. This works marvelously + with standard low-current e-matches like the J-Tek from MJG + Technologies, and with Quest Q2G2 igniters. However, if you + want or need to use a separate pyro battery, check out + <<_using_a_separate_pyro_battery>> for instructions on how to wire + that up. The altimeters are designed to work with an external + pyro battery of no more than 15 volts. + + Ejection charges are wired directly to the screw terminal block + at the aft end of the altimeter. You'll need a very small straight + blade screwdriver for these screws, such as you might find in a + jeweler's screwdriver set. + ifndef::telemini[] + The screw terminal block is also used for the power switch leads. + endif::telemini[] + + ifdef::telemini[] + Except for TeleMini v1.0, the flight computers also use the + screw terminal block for the power switch leads. On TeleMini v1.0, + the power switch leads are soldered directly to the board and + can be connected directly to a switch. + endif::telemini[] + + ifdef::radio[] + For most air-frames, the integrated antennas are more than + adequate. However, if you are installing in a carbon-fiber or + metal electronics bay which is opaque to RF signals, you may need to + use off-board external antennas instead. In this case, you can + replace the stock UHF antenna wire with an edge-launched SMA connector, + and, on TeleMetrum v1, you can unplug the integrated GPS + antenna and select an appropriate off-board GPS antenna with + cable terminating in a U.FL connector. + endif::radio[] diff --git a/doc/intro.inc b/doc/intro.inc new file mode 100644 index 00000000..28daa41a --- /dev/null +++ b/doc/intro.inc @@ -0,0 +1,54 @@ +== Introduction and Overview + + Welcome to the Altus Metrum community! Our circuits and software reflect + our passion for both hobby rocketry and Free Software. We hope their + capabilities and performance will delight you in every way, but by + releasing all of our hardware and software designs under open licenses, + we also hope to empower you to take as active a role in our collective + future as you wish! + + The first device created for our community was TeleMetrum, a dual + deploy altimeter with fully integrated GPS and radio telemetry + as standard features, and a “companion interface” that will + support optional capabilities in the future. The latest version + of TeleMetrum, v2.0, has all of the same features but with + improved sensors and radio to offer increased performance. + + Our second device was TeleMini, a dual deploy altimeter with + radio telemetry and radio direction finding. The first version + of this device was only 13mm by 38mm (½ inch by 1½ inches) and + could fit easily in an 18mm air-frame. The latest version, v2.0, + includes a beeper, USB data download and extended on-board + flight logging, along with an improved barometric sensor. + + TeleMega is our most sophisticated device, including six pyro + channels (four of which are fully programmable), integrated GPS, + integrated gyroscopes for staging/air-start inhibit and high + performance telemetry. + + EasyMini is a dual-deploy altimeter with logging and built-in + USB data download. + + EasyMega is essentially a TeleMega board with the GPS receiver + and telemetry transmitter removed. It offers the same 6 pyro + channels and integrated gyroscopes for staging/air-start inhibit. + + TeleDongle v0.2 was our first ground station, providing a USB to RF + interfaces for communicating with the altimeters. Combined with + your choice of antenna and notebook computer, TeleDongle and our + associated user interface software form a complete ground + station capable of logging and displaying in-flight telemetry, + aiding rocket recovery, then processing and archiving flight + data for analysis and review. The latest version, TeleDongle + v3, has all new electronics with a higher performance radio + for improved range. + + For a slightly more portable ground station experience that also + provides direct rocket recovery support, TeleBT offers flight + monitoring and data logging using a Bluetooth™ connection between + the receiver and an Android device that has the AltosDroid + application installed from the Google Play store. + + More products will be added to the Altus Metrum family over time, and + we currently envision that this will be a single, comprehensive manual + for the entire product family. diff --git a/doc/load-maps.inc b/doc/load-maps.inc new file mode 100644 index 00000000..e7717d89 --- /dev/null +++ b/doc/load-maps.inc @@ -0,0 +1,60 @@ +=== Load Maps + + .Load Maps Window + image::load-maps.png[width="5.2in"] + + Before heading out to a new launch site, you can use + this to load satellite images in case you don't have + internet connectivity at the site. + + There's a drop-down menu of launch sites we know + about; if your favorites aren't there, please let us + know the lat/lon and name of the site. The contents of + this list are actually downloaded from our server at + run-time, so as new sites are sent in, they'll get + automatically added to this list. If the launch site + isn't in the list, you can manually enter the lat/lon + values + + There are four different kinds of maps you can view; + you can select which to download by selecting as many + as you like from the available types: + + Hybrid:: + A combination of satellite imagery and road data. This + is the default view. + + Satellite:: + Just the satellite imagery without any annotation. + + Roadmap:: + Roads, political boundaries and a few geographic + features. + + Terrain:: + Contour intervals and shading that show hills and + valleys. + + You can specify the range of zoom levels to download; + smaller numbers show more area with less + resolution. The default level, 0, shows about + 3m/pixel. One zoom level change doubles or halves that + number. Larger zoom levels show more detail, smaller + zoom levels less. + + The Map Radius value sets how large an area around the + center point to download. Select a value large enough + to cover any plausible flight from that site. Be aware + that loading a large area with a high maximum zoom + level can attempt to download a lot of data. Loading + hybrid maps with a 10km radius at a minimum zoom of -2 + and a maximum zoom of 2 consumes about 120MB of + space. Terrain and road maps consume about 1/10 as + much space as satellite or hybrid maps. + + Clicking the 'Load Map' button will fetch images from + Google Maps; note that Google limits how many images + you can fetch at once, so if you load more than one + launch site, you may get some gray areas in the map + which indicate that Google is tired of sending data to + you. Try again later. diff --git a/doc/make-am-html b/doc/make-am-html new file mode 100755 index 00000000..ad8cb0a2 --- /dev/null +++ b/doc/make-am-html @@ -0,0 +1,30 @@ +#!/bin/sh +cat << 'EOF' +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content= +"text/html; charset=utf-8" /> +<title>Altus Metrum Documentation</title> +<link rel="stylesheet" type="text/css" href="am.css" /> +<meta name="generator" content="DocBook XSL Stylesheets V1.78.1" /> +</head> +<body> +<h1>Altus Metrum Documentation</h1> +EOF + +for i in "$@"; do + echo '<p>' + grep '<title>' $i | head -1 | sed -e 's/.*<title>//' -e 's;</title>.*;;' + pdf=`basename "$i" .html`.pdf + echo '<a href="'$i'">html</a>' + echo '<a href="'$pdf'">pdf</a>' + echo '</p>' +done + +cat << 'EOF' +</body> +</html> +EOF diff --git a/doc/micropeak-docinfo.xml b/doc/micropeak-docinfo.xml new file mode 100644 index 00000000..37c6e770 --- /dev/null +++ b/doc/micropeak-docinfo.xml @@ -0,0 +1,76 @@ +<subtitle>A recording altimeter for hobby rocketry</subtitle> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<copyright> + <year>2014</year> + <holder>Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="micropeak-dime.jpg" width="6in"/> + </imageobject> +</mediaobject> +<corpauthor> + <inlinemediaobject> + <imageobject> + <imagedata fileref="micropeak-oneline.svg" width="3in"/> + </imageobject> + </inlinemediaobject> +</corpauthor> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> +<revhistory> + <?dbhtml filename="micropeak-revhistory.html"?> + <revision> + <revnumber>1.3.2</revnumber> + <date>12 February 2014</date> + <revremark> + Add a "Download" button to the main window, which makes it + quicker to access the download function. Update the data + download documentation to reflect the new MicroPeak USB + adapter design. Monitor data during download to let you see + if the USB connection is working at all by showing the + characters received from the MicroPeak USB adapter. + </revremark> + </revision> + <revision> + <revnumber>1.2</revnumber> + <date>20 January 2013</date> + <revremark> + Add documentation for the MicroPeak USB adapter board. Note + the switch to a Kalman filter for peak altitude + determination. + </revremark> + </revision> + <revision> + <revnumber>1.1</revnumber> + <date>12 December 2012</date> + <revremark> + Add comments about EEPROM storage format and programming jig. + </revremark> + </revision> + <revision> + <revnumber>1.0</revnumber> + <date>18 November 2012</date> + <revremark> + Updates for version 1.0 release. + </revremark> + </revision> + <revision> + <revnumber>0.1</revnumber> + <date>29 October 2012</date> + <revremark> + Initial release with preliminary hardware. + </revremark> + </revision> +</revhistory> diff --git a/doc/micropeak-oneline-font.svg b/doc/micropeak-oneline-font.svg new file mode 100644 index 00000000..f6b23aa3 --- /dev/null +++ b/doc/micropeak-oneline-font.svg @@ -0,0 +1,199 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="400" + height="54" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="micropeak-oneline-font.svg"> + <defs + id="defs4"> + <linearGradient + id="linearGradient5343"> + <stop + style="stop-color:#7200a4;stop-opacity:1;" + offset="0" + id="stop5345" /> + <stop + style="stop-color:#da7000;stop-opacity:1;" + offset="1" + id="stop5347" /> + </linearGradient> + <marker + inkscape:stockid="Arrow2Send" + orient="auto" + refY="0" + refX="0" + id="Arrow2Send" + style="overflow:visible"> + <path + id="path3798" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-0.3,0,0,-0.3,0.69,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0" + refX="0" + id="Arrow1Send" + style="overflow:visible"> + <path + id="path3780" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mend" + style="overflow:visible"> + <path + id="path3792" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6,-0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path3768" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend" + style="overflow:visible"> + <path + id="path3786" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" + inkscape:connector-curvature="0" /> + </marker> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5343" + id="linearGradient5349" + x1="255.48561" + y1="275.90405" + x2="280.61411" + y2="275.90405" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9246394,0,0,1.9246394,-223.70579,-247.62056)" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.8852983" + inkscape:cx="103.59377" + inkscape:cy="27.872251" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="2560" + inkscape:window-height="1582" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-241.93841,-249.0196)"> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30.79423141px;line-height:125%;font-family:'Minion Pro';-inkscape-font-specification:'Minion Pro';letter-spacing:0px;word-spacing:0px;fill:#7200a4;fill-opacity:1;stroke:none" + x="237.36546" + y="300.57535" + id="text2985" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan2989" + x="237.36546" + y="300.57535" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:69.28701782px;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#7200a4;fill-opacity:1">μ</tspan></text> + <path + style="fill:none;stroke:url(#linearGradient5349);stroke-width:5.58145428;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:none" + d="m 270.8026,311.8784 c 5.85134,-0.46986 8.28205,-5.13748 10.35972,-10.71262 3.23453,-8.67942 7.06755,-30.54218 16.59477,-39.56149 7.82712,-7.40985 15.82735,-6.67187 15.82735,-6.67187" + id="path2991" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cssc" /> + <path + sodipodi:type="star" + style="fill:none;stroke:#da7000;stroke-width:2.11710358;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5341" + sodipodi:sides="5" + sodipodi:cx="313.82785" + sodipodi:cy="254.81477" + sodipodi:r1="13.956471" + sodipodi:r2="6.9782352" + sodipodi:arg1="1.0731354" + sodipodi:arg2="1.7014539" + inkscape:flatsided="false" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 320.49027,267.07835 -7.57159,-5.34482 -8.69538,3.20724 2.74347,-8.85265 -5.73728,-7.27871 9.26715,-0.12642 5.14955,-7.70573 2.98393,8.77452 8.91988,2.51631 -7.42297,5.54937 z" + inkscape:transform-center-x="-0.56191834" + inkscape:transform-center-y="-0.78695059" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:70.16494751px;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#7200a4;fill-opacity:1;stroke:none" + x="331.6398" + y="300.51898" + id="text5351" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5353" + x="331.6398" + y="300.51898">MicroPeak</tspan></text> + </g> +</svg> diff --git a/doc/micropeak-oneline.svg b/doc/micropeak-oneline.svg new file mode 100644 index 00000000..4b695827 --- /dev/null +++ b/doc/micropeak-oneline.svg @@ -0,0 +1,239 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="444" + height="98" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="micropeak-oneline.svg"> + <defs + id="defs4"> + <linearGradient + id="linearGradient5343"> + <stop + style="stop-color:#7200a4;stop-opacity:1;" + offset="0" + id="stop5345" /> + <stop + style="stop-color:#da7000;stop-opacity:1;" + offset="1" + id="stop5347" /> + </linearGradient> + <marker + inkscape:stockid="Arrow2Send" + orient="auto" + refY="0" + refX="0" + id="Arrow2Send" + style="overflow:visible"> + <path + id="path3798" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-0.3,0,0,-0.3,0.69,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0" + refX="0" + id="Arrow1Send" + style="overflow:visible"> + <path + id="path3780" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mend" + style="overflow:visible"> + <path + id="path3792" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6,-0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path3768" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" + transform="matrix(-0.8,0,0,-0.8,-10,0)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend" + style="overflow:visible"> + <path + id="path3786" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" + inkscape:connector-curvature="0" /> + </marker> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5343" + id="linearGradient5349" + x1="255.48561" + y1="275.90405" + x2="280.61411" + y2="275.90405" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9246394,0,0,1.9246394,-200.29778,-270.16721)" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.8852983" + inkscape:cx="243.9235" + inkscape:cy="27.872251" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1871" + inkscape:window-height="1383" + inkscape:window-x="119" + inkscape:window-y="125" + inkscape:window-maximized="0" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-241.93841,-205.0196)"> + <g + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30.79423141px;line-height:125%;font-family:'Minion Pro';-inkscape-font-specification:'Minion Pro';letter-spacing:0px;word-spacing:0px;fill:#7200a4;fill-opacity:1;stroke:none" + id="text2985" + transform="translate(23.408014,-22.546654)" /> + <path + style="fill:none;stroke:url(#linearGradient5349);stroke-width:5.58145428;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:none" + d="m 294.21061,289.33175 c 5.85134,-0.46986 8.28205,-5.13748 10.35972,-10.71262 3.23453,-8.67942 7.06755,-30.54218 16.59477,-39.56149 7.82712,-7.40985 15.82735,-6.67187 15.82735,-6.67187" + id="path2991" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cssc" /> + <path + sodipodi:type="star" + style="fill:none;stroke:#da7000;stroke-width:2.11710358;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5341" + sodipodi:sides="5" + sodipodi:cx="337.23586" + sodipodi:cy="232.26813" + sodipodi:r1="13.956471" + sodipodi:r2="6.9782352" + sodipodi:arg1="1.0731354" + sodipodi:arg2="1.7014539" + inkscape:flatsided="false" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 343.89829,244.5317 -7.57159,-5.34482 -8.69538,3.20724 2.74347,-8.85265 -5.73728,-7.27871 9.26715,-0.12642 5.14955,-7.70573 2.98393,8.77452 8.91988,2.51631 -7.42297,5.54937 z" + inkscape:transform-center-x="-0.56191834" + inkscape:transform-center-y="-0.78695059" /> + <g + id="g4212" + style="fill:#78079a;fill-opacity:1"> + <path + inkscape:connector-curvature="0" + id="path4233" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:69.28701782px;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';letter-spacing:0px;word-spacing:0px;fill:#78079a;fill-opacity:1;stroke:none;text-align:start;writing-mode:lr-tb;text-anchor:start" + d="m 271.3161,268.77261 c 0,-2.07861 -0.76216,-3.60293 -3.04863,-3.60293 -2.28647,0 -3.04863,1.52432 -3.04863,3.60293 l 0,16.69817 c 0,5.54296 -3.94936,9.83875 -9.28446,9.83875 -5.88939,0 -7.89872,-3.60292 -7.89872,-9.76946 l 0,-16.76746 c 0,-2.07861 -0.76215,-3.60293 -3.04862,-3.60293 -2.28648,0 -3.04863,1.52432 -3.04863,3.60293 l 0,42.19579 c 0,2.07861 0.76215,3.60293 3.04863,3.60293 2.28647,0 3.04862,-1.52432 3.04862,-3.60293 l 0,-11.84808 c 1.52432,1.17788 4.01865,1.87075 6.85942,1.87075 4.43437,0 8.5223,-1.52431 10.87806,-5.75082 l 0.13857,0.13857 0,2.42505 c 0,1.66289 1.03931,2.77148 2.7022,2.77148 1.66289,0 2.70219,-1.10859 2.70219,-2.77148 l 0,-29.03126 z" + transform="translate(23.40801,-22.54665)" /> + <g + style="fill:#78079a;fill-opacity:1" + id="g4200"> + <path + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + inkscape:connector-curvature="0" + id="path4236" + d="m 380.37736,256.92285 c 4.28006,0 10.5949,-13.68217 12.13853,-17.05008 l 0.14033,0 c 2.10495,11.50705 2.38561,23.15443 2.38561,34.02999 0,2.73644 0.77182,4.28007 3.08726,4.28007 2.10495,0 3.08726,-1.68396 3.08726,-4.28007 0,-9.54243 -1.82429,-30.31125 -3.71875,-38.94154 -0.49115,-2.38561 -1.75412,-5.47287 -4.06956,-5.47287 -3.92924,0 -5.54303,9.19161 -13.05068,19.71635 -7.50765,-10.52474 -9.12145,-19.71635 -13.05068,-19.71635 -2.31545,0 -3.57842,3.08726 -4.06957,5.47287 -1.89445,8.63029 -3.71874,29.39911 -3.71874,38.94154 0,2.59611 0.98231,4.28007 3.08726,4.28007 2.31544,0 3.08725,-1.54363 3.08725,-4.28007 0,-10.87556 0.28066,-22.52294 2.31545,-34.02999 l 0.14033,0 c 1.61379,3.36791 7.92864,17.05008 12.2087,17.05008 z" /> + <path + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + inkscape:connector-curvature="0" + id="path4238" + d="m 416.62852,245.76662 c 0,-2.10495 -0.77182,-3.64858 -3.08726,-3.64858 -2.31544,0 -3.08726,1.54363 -3.08726,3.64858 l 0,28.76763 c 0,2.10495 0.77182,3.64858 3.08726,3.64858 2.31544,0 3.08726,-1.54363 3.08726,-3.64858 l 0,-28.76763 z m -3.08726,-15.64678 c -2.24528,0 -3.29775,1.96462 -3.29775,4.06956 0,2.10495 1.05247,4.06957 3.29775,4.06957 2.24528,0 3.29775,-1.96462 3.29775,-4.06957 0,-2.10494 -1.05247,-4.06956 -3.29775,-4.06956 z" /> + <path + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + inkscape:connector-curvature="0" + id="path4240" + d="m 446.07368,272.21881 c -8.56013,0 -15.36613,-5.33254 -15.36613,-14.73464 0,-6.52534 3.57842,-9.8231 12.27887,-9.8231 l 7.9988,0 c 1.89446,0 3.15743,-0.84197 3.15743,-2.66626 0,-1.82429 -1.26297,-2.66627 -3.15743,-2.66627 l -11.92804,0 c -9.19161,0 -14.94513,6.45517 -14.94513,14.94513 0,12.77002 10.59491,20.69866 20.13734,20.69866 l 8.34963,0 c 1.96462,0 3.36791,-0.91214 3.36791,-2.87676 0,-1.96462 -1.40329,-2.87676 -3.36791,-2.87676 l -6.52534,0 z" /> + <path + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + inkscape:connector-curvature="0" + id="path4242" + d="m 461.22931,274.53425 c 0,2.10495 0.77181,3.64858 3.08725,3.64858 2.31545,0 3.08726,-1.54363 3.08726,-3.64858 l 0,-18.59371 c 0,-5.47287 4.35023,-8.27947 9.47227,-8.27947 2.24528,0 3.15742,-1.05247 3.15742,-3.01709 0,-2.03478 -1.33313,-2.73643 -3.64858,-2.73643 -4.49055,0 -7.50764,1.68396 -8.84078,6.10435 l -0.14033,0 0,-2.03478 c 0,-2.10495 -0.77181,-3.64858 -3.08726,-3.64858 -2.31544,0 -3.08725,1.54363 -3.08725,3.64858 l 0,28.55713 z" /> + <path + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + inkscape:connector-curvature="0" + id="path4244" + d="m 498.09441,273.06079 c -6.38501,0 -10.66507,-6.10435 -10.66507,-12.91035 0,-6.806 4.28006,-12.91036 10.66507,-12.91036 6.45518,0 10.73524,6.10436 10.73524,12.91036 0,6.806 -4.28006,12.91035 -10.73524,12.91035 z m 0,5.33253 c 9.54243,0 16.90975,-7.92864 16.90975,-18.31305 0,-9.68276 -7.36732,-18.17272 -16.90975,-18.17272 -9.54243,0 -16.83959,8.48996 -16.83959,18.17272 0,10.38441 7.29716,18.31305 16.83959,18.31305 z" /> + <path + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + inkscape:connector-curvature="0" + id="path4246" + d="m 529.43293,256.78252 c 8.63029,-3.08726 27.15383,-6.45518 27.15383,-18.73404 0,-5.6132 -4.49055,-8.34963 -10.03358,-8.34963 l -20.418,0 c -2.17512,0 -2.87677,1.4033 -2.87677,3.36792 l 0,41.46748 c 0,2.17511 0.98231,3.64858 3.08726,3.64858 2.10495,0 3.08726,-1.47347 3.08726,-3.64858 l 0,-17.75173 z m 15.99761,-21.33015 c 2.45577,0 4.28006,0.84198 4.28006,3.57842 0,6.31484 -13.19101,8.48995 -20.27767,11.43688 l 0,-15.0153 15.99761,0 z" /> + <path + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + inkscape:connector-curvature="0" + id="path4248" + d="m 566.52497,255.80021 c 0.91214,-4.49056 4.13973,-8.56013 10.87556,-8.56013 5.68336,0 9.26178,3.64858 9.54244,8.56013 l -20.418,0 z m 23.15443,4.77121 c 3.36792,0 3.43808,-0.77181 3.43808,-3.71874 0,-8.84078 -6.94633,-14.94513 -15.64678,-14.94513 -10.45458,0 -17.8219,7.15682 -17.8219,17.68157 0,12.34903 7.78831,18.38321 17.05008,18.38321 l 13.47167,0 c 1.89446,0 3.15743,-0.84198 3.15743,-2.66627 0,-1.82428 -1.26297,-2.66626 -3.15743,-2.66626 l -13.33134,0 c -5.75352,0 -11.08606,-3.92924 -10.5949,-12.06838 l 23.43509,0 z" /> + <path + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + inkscape:connector-curvature="0" + id="path4250" + d="m 620.52676,265.34264 c 0,6.10435 -3.43809,8.27947 -9.26178,8.27947 -5.26237,0 -8.27946,-1.89446 -8.27946,-6.10436 0,-6.5955 9.47227,-8.56012 17.54124,-8.56012 l 0,6.38501 z m -5.68336,-17.26058 c 4.28006,0 5.68336,0.98231 5.68336,3.99941 l 0,2.10494 c -9.05128,0.56132 -23.71576,1.4033 -23.71576,13.612 0,6.66567 5.68336,10.59491 13.47167,10.59491 4.77122,0 7.0165,-1.26297 10.66508,-3.9994 0,2.24528 0.91214,3.57841 2.87676,3.57841 1.96462,0 2.87676,-1.33313 2.87676,-3.57841 l 0,-19.43569 c 0,-6.24468 -1.68396,-12.62969 -10.94573,-12.62969 l -12.98052,0 c -2.03478,0 -3.36791,0.91214 -3.36791,2.87676 0,1.96462 1.33313,2.87676 3.36791,2.87676 l 12.06838,0 z" /> + <path + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + inkscape:connector-curvature="0" + id="path4252" + d="m 635.47191,274.53425 c 0,2.10495 0.77181,3.64858 3.08725,3.64858 2.31545,0 3.08726,-1.54363 3.08726,-3.64858 l 0,-17.19041 c 11.71755,1.61379 15.50645,5.33253 17.19041,17.26057 0.28066,1.96462 0.56132,3.57842 3.0171,3.57842 2.03478,0 3.15742,-1.05248 3.15742,-3.29776 0,-7.9988 -4.13973,-17.19041 -12.27887,-19.64618 l 0,-0.14033 c 3.92924,-1.33313 9.6126,-5.89386 9.6126,-10.45458 0,-1.54363 -1.05247,-2.8066 -2.24528,-2.8066 -2.31544,0 -2.8066,1.6138 -5.05187,4.77122 -2.52594,3.71874 -7.29716,6.24468 -11.92805,6.24468 l -1.47346,0 0,-19.71635 c 0,-2.10495 -0.77181,-3.64858 -3.08726,-3.64858 -2.31544,0 -3.08725,1.54363 -3.08725,3.64858 l 0,41.39732 z" /> + </g> + </g> + </g> +</svg> diff --git a/doc/micropeak.txt b/doc/micropeak.txt new file mode 100644 index 00000000..d5036a00 --- /dev/null +++ b/doc/micropeak.txt @@ -0,0 +1,506 @@ += MicroPeak Owner's Manual +:doctype: book +:numbered: + +[dedication] +== Acknowledgements + + Thanks to John Lyngdal for suggesting that we build something + like this. + + Have fun using these products, and we hope to meet all of you + out on the rocket flight line somewhere. + + [verse] + Bdale Garbee, KB0G + NAR #87103, TRA #12201 + + [verse] + Keith Packard, KD7SQG + NAR #88757, TRA #12200 + +== Using MicroPeak + + MicroPeak is designed to be easy to use. Requiring no external + components, flying takes just a few steps + + Install the battery:: + + Fit a CR1025 battery into the plastic carrier. The positive + (\+) terminal should be towards the more open side of the + carrier. Slip the carrier into the battery holder with the + positive (+) terminal facing away from the circuit board. + + .MicroPeak and Battery + image::micropeak-back.jpg[width="4.5in"] + + Install MicroPeak in your rocket:: + + This can be as simple as preparing a soft cushion of wadding + inside a vented model payload bay. Wherever you mount it, + make sure you protect the barometric sensor from corrosive + ejection gasses as those will damage the sensor, and shield + it from light as that can cause incorrect sensor readings. + + Turn MicroPeak on:: + + Slide the switch so that the actuator covers the '1' printed + on the board. MicroPeak will report the maximum height of + the last flight in decimeters using a sequence of flashes on + the LED. A sequence of short flashes indicates one digit. A + single long flash indicates zero. The height is reported in + decimeters, so the last digit will be tenths of a meter. For + example, if MicroPeak reports 5 4 4 3, then the maximum + height of the last flight was 544.3m, or 1786 feet. + + Finish preparing the rocket for flight:: + + After the previous flight data have been reported, MicroPeak + waits for one minute before starting to check for + launch. This gives you time to finish assembling the + rocket. As those activities might cause pressure changes + inside the airframe, MicroPeak might accidentally detect + boost. If you need to do anything to the airframe after the + one minute window passes, make sure to be careful not to + disturb the altimeter. The LED will remain dark during the + one minute delay, but after that, it will start blinking + once every 3 seconds. + + Fly the rocket:: + + Once the rocket passes about 30m in height (100 feet), the + micro-controller will record the ground pressure and track + the pressure seen during the flight. In this mode, the LED + flickers rapidly. When the rocket lands, and the pressure + stabilizes, the micro-controller will record the minimum + pressure pressure experienced during the flight, compute the + height represented by the difference in air pressure and + blink that value out on the LED. After that, MicroPeak + powers down to conserve battery power. + + Recover the data:: + + Turn MicroPeak off and then back on. MicroPeak will blink + out the maximum height for the last flight. Turn MicroPeak + back off to conserve battery power. + +== The MicroPeak USB adapter + + .MicroPeak USB Adapter + image::MicroPeakUSB-2.0.jpg[width="4.5in",align="center"] + + MicroPeak stores barometric pressure information for the first + 48 seconds of the flight in on-board non-volatile memory. The + contents of this memory can be downloaded to a computer using + the MicroPeak USB adapter. + + === Installing the MicroPeak software + + The MicroPeak application runs on Linux, Mac OS X and + Windows. You can download the latest version from + http://altusmetrum.org/MicroPeak + + On Mac OS X and Windows, the FTDI USB device driver + needs to be installed. A compatible version of this + driver is included with the MicroPeak application, but + you may want to download a newer version from + http://www.ftdichip.com/FTDrivers.htm + + === Downloading Micro Peak data + + * Plug the MicroPeak USB adapter in to your computer. + + * Start the MicroPeak application. + + image::micropeak-nofont.svg[width="0.5in",align="center"] + + * Click on the Download button at the top of the + window. + + .MicroPeak Application + image::micropeak-app.png[width="4.5in",align="center"] + + * Select from the listed devices. There will probably + be only one. + + .MicroPeak Device Dialog + image::micropeak-device-dialog.png[width="2.3in",align="center"] + + * The application will now wait until it receives + valid data from the MicroPeak USB adapter. + + .MicroPeak Download Dialog + image::micropeak-download.png[width="2in",align="center"] + + * The MicroPeak USB adapter has a small + phototransistor under the hole in the center of the + box. Locate this, turn on the MicroPeak and place + the orange LED on the MicroPeak directly inside the + hole, resting the MicroPeak itself on the box. You + should see the blue LED on the MicroPeak USB adapter + blinking in time with the orange LED on the + MicroPeak board itself. + + .MicroPeak Downloading + image::MicroPeakUSB-2.0-inuse.jpg[width="4.5in",align="center"] + + * After the maximum flight height is reported, + MicroPeak will pause for a few seconds, blink the + LED four times rapidly and then send the data in one + long blur on the LED. The MicroPeak application + should receive the data. When it does, it will + present the data in a graph and offer to save the + data to a file. If not, you can power cycle the + MicroPeak board and try again. + + .MicroPeak Save Dialog + image::micropeak-save-dialog.png[width="2.3in",align="center"] + + * Once the data are saved, a graph will be displayed + with height, speed and acceleration values computed + from the recorded barometric pressure data. See + <<_analyzing_micropeak_data> for more details on that. + + === Analyzing MicroPeak Data + + The MicroPeak application can present flight data in + the form of a graph, a collection of computed + statistics or in tabular form. + + MicroPeak collects raw barometric pressure data which + is then used to compute the remaining data. Altitude + is computed through a standard atmospheric + model. Absolute error in this data will be affected by + local atmospheric conditions. Fortunately, these + errors tend to mostly cancel out, so the error in the + height computation is much smaller than the error in + altitude would be. + + Speed and acceleration are computed by first smoothing + the height data with a Gaussian window averaging + filter. For speed data, this average uses seven + samples. For acceleration data, eleven samples are + used. These were chosen to provide reasonably smooth + speed and acceleration data, which would otherwise be + swamped with noise. + + The File menu has operations to open existing flight + logs, Download new data from MicroPeak, Save a copy of + the flight log to a new file, Export the tabular data + (as seen in the Raw Data tab) to a file, change the + application Preferences, Close the current window or + close all windows and Exit the application. + + ==== MicroPeak Graphs + + .MicroPeak Graph + image::micropeak-graph.png[width="4.5in",align="center"] + + Under the Graph tab, the height, speed and acceleration values + are displayed together. You can zoom in on the graph by + clicking and dragging to sweep out an area of + interest. Right-click on the plot to bring up a menu that will + let you save, copy or print the graph. + + ==== MicroPeak Flight Statistics + + .MicroPeak Flight Statistics + image::micropeak-statistics.png[width="4.5in",align="center"] + + The Statistics tab presents overall data from + the flight. Note that the Maximum height value + is taken from the minumum pressure captured in + flight, and may be different from the apparant + apogee value as the on-board data are sampled + twice as fast as the recorded values, or + because the true apogee occurred after the + on-board memory was full. Each value is + presented in several units as appropriate. + + ==== Raw Flight Data + + .MicroPeak Raw Flight Data + image::micropeak-raw-data.png[width="4.5in",align="center"] + + A table consisting of the both the raw barometric pressure + data and values computed from that for each recorded time. + + ==== Configuring the Graph + + .MicroPeak Graph Configuration + image::micropeak-graph-configure.png[width="4.5in",align="center"] + + This selects which graph elements to show, and lets you + switch between metric and imperial units + + === Setting MicroPeak Preferences + + .MicroPeak Preferences + image::micropeak-preferences.png[width="1.8in",align="center"] + + The MicroPeak application has a few user settings which are + configured through the Preferences dialog, which can be + accessed from the File menu. + + Log Directory:: + + The Log Directory is where flight data will be + saved to and loaded from by default. Of + course, you can always navigate to other + directories in the file chooser windows, this + setting is just the starting point. + + Imperial Units:: + + If you prefer to see your graph data in feet + and miles per hour instead of meters and + meters per second, you can select Imperial + Units. + + Serial Debug:: + + To see what data is actually arriving over the + serial port, start the MicroPeak application + from a command prompt and select the Serial + Debug option. This can be useful in debugging + serial communication problems, but most people + need never choose this. + + Font Size:: + + You can adjust the size of the text in the + Statistics tab by changing the Font size + preference. There are three settings, with + luck one will both fit on your screen and + provide readable values. + + Look & Feel:: + + The Look & feel menu shows a list of available + application appearance choices. By default, + the MicroPeak application tries to blend in + with other applications, but you may choose + some other appearance if you like. + + Note that MicroPeak shares a subset of the + AltosUI preferences, so if you use both of + these applications, change in one application + will affect the other. + +[appendix] +== Handling Precautions + + All Altus Metrum products are sophisticated electronic + devices. When handled gently and properly installed in an + air-frame, they will deliver impressive results. However, as + with all electronic devices, there are some precautions you + must take. + + [WARNING] + + The CR1025 Lithium batteries have an extraordinary power + density. This is great because we can fly with much less + battery mass... but if they are punctured or their contacts + are allowed to short, they can and will release their energy + very rapidly! Thus we recommend that you take some care when + handling MicroPeak to keep conductive material from coming in + contact with the exposed metal elements. + + The barometric sensor used in MicroPeak is sensitive to + sunlight. Please consider this when designing an + installation. Many model rockets with payload bays use clear + plastic for the payload bay. Replacing these with an opaque + cardboard tube, painting them, or wrapping them with a layer + of masking tape are all reasonable approaches to keep the + sensor out of direct sunlight. + + The barometric sensor sampling ports must be able to + "breathe", both by not being covered by foam or tape or other + materials that might directly block the hole on the top of the + sensor, and also by having a suitable static vent to outside + air. + + As with all other rocketry electronics, Altus Metrum + altimeters must be protected from exposure to corrosive motor + exhaust and ejection charge gasses. + +[appendix] +== Technical Information + + === Barometric Sensor + + MicroPeak uses the Measurement Specialties MS5607 + sensor. This has a range of 120kPa to 1kPa with an + absolute accuracy of 150Pa and a resolution of 2.4Pa. + + The pressure range corresponds roughly to an altitude + range of -1500m (-4900 feet) to 31000m (102000 feet), + while the resolution is approximately 20cm (8 inches) + near sea level and 60cm (24in) at 10000m (33000 feet). + + Ground pressure is computed from an average of 16 + samples, taken while the altimeter is at rest. The + flight pressure used to report maximum height is + computed from a Kalman filter designed to smooth out + any minor noise in the sensor values. The flight + pressure recorded to non-volatile storage is + unfiltered, coming directly from the pressure sensor. + + === Micro-controller + + MicroPeak uses an Atmel ATtiny85 + micro-controller. This tiny CPU contains 8kB of flash + for the application, 512B of RAM for temporary data + storage and 512B of EEPROM for non-volatile storage of + previous flight data. + + The ATtiny85 has a low-power mode which turns off all + of the clocks and powers down most of the internal + components. In this mode, the chip consumes only .1μA + of power. MicroPeak uses this mode once the flight has + ended to preserve battery power. + + === Lithium Battery + + The CR1025 battery used by MicroPeak holds 30mAh of + power, which is sufficient to run for over 40 + hours. Because MicroPeak powers down on landing, run + time includes only time sitting on the launch pad or + during flight. + + The large positive terminal (+) is usually marked, + while the smaller negative terminal is not. Make sure + you install the battery with the positive terminal + facing away from the circuit board where it will be in + contact with the metal battery holder. A small pad on + the circuit board makes contact with the negative + battery terminal. + + Shipping restrictions may prevent us from including a + CR1025 battery with MicroPeak. If so, many stores + carry CR1025 batteries as they are commonly used in + small electronic devices such as flash lights. + + === Atmospheric Model + + MicroPeak contains a fixed atmospheric model which is + used to convert barometric pressure into altitude. The + model was converted into a 469-element piece-wise + linear approximation which is then used to compute the + altitude of the ground and apogee. The difference + between these represents the maximum height of the + flight. + + The model assumes a particular set of atmospheric + conditions, which, while a reasonable average, cannot + represent the changing nature of the real + atmosphere. Fortunately, for flights reasonably close + to the ground, the effect of this global inaccuracy + are largely canceled out when the computed ground + altitude is subtracted from the computed apogee + altitude, so the resulting height is more accurate + than either the ground or apogee altitudes. + + Because the raw pressure data is recorded to + non-volatile storage, you can use that, along with a + more sophisticated atmospheric model, to compute your + own altitude values. + + === Mechanical Considerations + + MicroPeak is designed to be rugged enough for typical + rocketry applications. It contains two moving parts, + the battery holder and the power switch, which were + selected for their ruggedness. + + The MicroPeak battery holder is designed to withstand + impact up to 150g without breaking contact (or, worse + yet, causing the battery to fall out). That means it + should stand up to almost any launch you care to try, + and should withstand fairly rough landings. + + The power switch is designed to withstand up to 50g + forces in any direction. Because it is a sliding + switch, orienting the switch perpendicular to the + direction of rocket travel will serve to further + protect the switch from launch forces. + + === MicroPeak Programming Interface + + MicroPeak exposes a standard 6-pin AVR programming + interface, but not using the usual 2x3 array of pins + on 0.1" centers. Instead, there is a single row of + tiny 0.60mm × 0.85mm pads on 1.20mm centers exposed + near the edge of the circuit board. We couldn't find + any connector that was small enough to include on the + circuit board. + + In lieu of an actual connector, the easiest way to + connect to the bare pads is through a set of Pogo + pins. These spring-loaded contacts are designed to + connect in precisely this way. We've designed a + programming jig, the MicroPeak Pogo Pin board which + provides a standard AVR interface on one end and a + recessed slot for MicroPeak to align the board with + the Pogo Pins. + + The MicroPeak Pogo Pin board is not a complete AVR + programmer, it is an interface board that provides a + 3.3V regulated power supply to run the MicroPeak via + USB and a standard 6-pin AVR programming interface + with the usual 2x3 grid of pins on 0.1" centers. This + can be connected to any AVR programming dongle. + + The AVR programming interface cannot run faster than ¼ + of the AVR CPU clock frequency. Because MicroPeak runs + at 250kHz to save power, you must configure your AVR + programming system to clock the AVR programming + interface at no faster than 62.5kHz, or a clock period + of 32µS. + +[appendix] +== On-board data storage + + The ATtiny85 has 512 bytes of non-volatile storage, separate + from the code storage memory. The MicroPeak firmware uses this + to store information about the last completed + flight. Barometric measurements from the ground before launch + and at apogee are stored, and used at power-on to compute the + height of the last flight. + + In addition to the data used to present the height of the last + flight, MicroPeak also stores barometric information sampled + at regular intervals during the flight. This is the + information captured with the MicroPeak USB adapter. It can + also be read from MicroPeak through any AVR programming tool. + + + .MicroPeak EEPROM Data Storage + [options="border",cols="2,1,7"] + |==== + |Address |Size (bytes) |Description + |0x000 |4 |Average ground pressure (Pa) + |0x004 |4 |Minimum flight pressure (Pa) + |0x008 |2 |Number of in-flight samples + |0x00a … 0x1fe |2 |Instantaneous flight pressure (Pa) low 16 bits + |==== + + All EEPROM data are stored least-significant byte first. The + instantaneous flight pressure data are stored without the + upper 16 bits of data. The upper bits can be reconstructed + from the previous sample, assuming that pressure doesn't + change by more more than 32kPa in a single sample + interval. Note that this pressure data is *not* filtered in + any way, while both the recorded ground and apogee pressure + values are, so you shouldn't expect the minimum instantaneous + pressure value to match the recorded minimum pressure value + exactly. + + MicroPeak samples pressure every 96ms, but stores only every + other sample in the EEPROM. This provides for 251 pressure + samples at 192ms intervals, or 48.192s of storage. The clock + used for these samples is a factory calibrated RC circuit + built into the ATtiny85 and is accurate only to within ±10% at + 25°C. So, you can count on the pressure data being accurate, + but speed or acceleration data computed from this will be + limited by the accuracy of this clock. diff --git a/doc/micropeak.xsl b/doc/micropeak.xsl deleted file mode 100644 index dafe3682..00000000 --- a/doc/micropeak.xsl +++ /dev/null @@ -1,736 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" - "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> -<book> - <title>MicroPeak Owner's Manual</title> - <subtitle>A recording altimeter for hobby rocketry</subtitle> - <bookinfo> - <author> - <firstname>Keith</firstname> - <surname>Packard</surname> - </author> - <copyright> - <year>2014</year> - <holder>Bdale Garbee and Keith Packard</holder> - </copyright> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-dime.jpg" width="6in"/> - </imageobject> - </mediaobject> - <legalnotice> - <para> - This document is released under the terms of the - <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> - Creative Commons ShareAlike 3.0 - </ulink> - license. - </para> - </legalnotice> - <revhistory> - <revision> - <revnumber>0.1</revnumber> - <date>29 October 2012</date> - <revremark> - Initial release with preliminary hardware. - </revremark> - </revision> - <revision> - <revnumber>1.0</revnumber> - <date>18 November 2012</date> - <revremark> - Updates for version 1.0 release. - </revremark> - </revision> - <revision> - <revnumber>1.1</revnumber> - <date>12 December 2012</date> - <revremark> - Add comments about EEPROM storage format and programming jig. - </revremark> - </revision> - <revision> - <revnumber>1.2</revnumber> - <date>20 January 2013</date> - <revremark> - Add documentation for the MicroPeak USB adapter board. Note - the switch to a Kalman filter for peak altitude - determination. - </revremark> - </revision> - <revision> - <revnumber>1.3.2</revnumber> - <date>12 February 2014</date> - <revremark> - Add a "Download" button to the main window, which makes it - quicker to access the download function. Update the data - download documentation to reflect the new MicroPeak USB - adapter design. Monitor data during download to let you see - if the USB connection is working at all by showing the - characters received from the MicroPeak USB adapter. - </revremark> - </revision> - </revhistory> - </bookinfo> - <dedication> - <title>Acknowledgements</title> - <para> - Thanks to John Lyngdal for suggesting that we build something like this. - </para> - <para> - Have fun using these products, and we hope to meet all of you - out on the rocket flight line somewhere. - <literallayout> -Bdale Garbee, KB0G -NAR #87103, TRA #12201 - -Keith Packard, KD7SQG -NAR #88757, TRA #12200 - </literallayout> - </para> - </dedication> - <chapter> - <title>Quick Start Guide</title> - <para> - MicroPeak is designed to be easy to use. Requiring no external - components, flying takes just a few steps - </para> - <itemizedlist> - <listitem> - <para> - Install the battery. Fit a CR1025 battery into the plastic - carrier. The positive (+) terminal should be towards the more - open side of the carrier. Slip the carrier into the battery - holder with the positive (+) terminal facing away from the - circuit board. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-back.jpg" width="4.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </listitem> - <listitem> - <para> - Install MicroPeak in your rocket. This can be as simple as - preparing a soft cushion of wadding inside a vented model payload - bay. Wherever you mount it, make sure you protect the - barometric sensor from corrosive ejection gasses as those - will damage the sensor, and shield it from light as that can - cause incorrect sensor readings. - </para> - </listitem> - <listitem> - <para> - Turn MicroPeak on. Slide the switch so that the actuator - covers the '1' printed on the board. MicroPeak will report - the maximum height of the last flight in decimeters using a - sequence of flashes on the LED. A sequence of short flashes - indicates one digit. A single long flash indicates zero. The - height is reported in decimeters, so the last digit will be - tenths of a meter. For example, if MicroPeak reports 5 4 4 - 3, then the maximum height of the last flight was 544.3m, or - 1786 feet. - </para> - </listitem> - <listitem> - <para> - Finish preparing the rocket for flight. After the - previous flight data have been reported, MicroPeak waits for - one minute before starting to check for launch. This gives - you time to finish assembling the rocket. As those - activities might cause pressure changes inside the airframe, - MicroPeak might accidentally detect boost. If you need to do - anything to the airframe after the one minute window passes, - make sure to be careful not to disturb the altimeter. The - LED will remain dark during the one minute delay, but after - that, it will start blinking once every 3 seconds. - </para> - </listitem> - <listitem> - <para> - Fly the rocket. Once the rocket passes about 30m in height - (100 feet), the micro-controller will record the ground - pressure and track the pressure seen during the flight. In - this mode, the LED flickers rapidly. When the rocket lands, - and the pressure stabilizes, the micro-controller will record - the minimum pressure pressure experienced during the flight, - compute the height represented by the difference in air - pressure and blink that value out on the LED. After that, - MicroPeak powers down to conserve battery power. - </para> - </listitem> - <listitem> - <para> - Recover the data. Turn MicroPeak off and then back on. MicroPeak - will blink out the maximum height for the last flight. Turn - MicroPeak back off to conserve battery power. - </para> - </listitem> - </itemizedlist> - </chapter> - <chapter> - <title>Handling Precautions</title> - <para> - All Altus Metrum products are sophisticated electronic devices. - When handled gently and properly installed in an air-frame, they - will deliver impressive results. However, as with all electronic - devices, there are some precautions you must take. - </para> - <para> - The CR1025 Lithium batteries have an - extraordinary power density. This is great because we can fly with - much less battery mass... but if they are punctured - or their contacts are allowed to short, they can and will release their - energy very rapidly! - Thus we recommend that you take some care when handling MicroPeak - to keep conductive material from coming in contact with the exposed metal elements. - </para> - <para> - The barometric sensor used in MicroPeak is sensitive to - sunlight. Please consider this when designing an - installation. Many model rockets with payload bays use clear - plastic for the payload bay. Replacing these with an opaque - cardboard tube, painting them, or wrapping them with a layer of - masking tape are all reasonable approaches to keep the sensor - out of direct sunlight. - </para> - <para> - The barometric sensor sampling ports must be able to "breathe", - both by not being covered by foam or tape or other materials that might - directly block the hole on the top of the sensor, and also by having a - suitable static vent to outside air. - </para> - <para> - As with all other rocketry electronics, Altus Metrum altimeters must - be protected from exposure to corrosive motor exhaust and ejection - charge gasses. - </para> - </chapter> - <chapter> - <title>The MicroPeak USB adapter</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="MicroPeakUSB-2.0.jpg" width="4.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - MicroPeak stores barometric pressure information for the first - 48 seconds of the flight in on-board non-volatile memory. The - contents of this memory can be downloaded to a computer using - the MicroPeak USB adapter. - </para> - <section> - <title>Installing the MicroPeak software</title> - <para> - The MicroPeak application runs on Linux, Mac OS X and - Windows. You can download the latest version from - <ulink url="http://altusmetrum.org/AltOS"/>. - </para> - <para> - On Mac OS X and Windows, the FTDI USB device driver needs to - be installed. A compatible version of this driver is included - with the MicroPeak application, but you may want to download a - newer version from <ulink - url="http://www.ftdichip.com/FTDrivers.htm"/>. - </para> - </section> - <section> - <title>Downloading Micro Peak data</title> - <itemizedlist> - <listitem> - <para> - Plug the MicroPeak USB adapter in to your computer. - </para> - </listitem> - <listitem> - <?dbfo keep-together="always"?> - <para> - Start the MicroPeak application. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-nofont.svg" width="0.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </listitem> - <listitem> - <?dbfo keep-together="always"?> - <para> - Click on the Download button at the top of the window. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-app.png" width="4.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </listitem> - <listitem> - <?dbfo keep-together="always"?> - <para> - Select from the listed devices. There will probably be - only one. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-device-dialog.png" width="2.3in"/> - </imageobject> - </mediaobject> - </informalfigure> - </listitem> - <listitem> - <para> - The application will now wait until it receives valid data - from the MicroPeak USB adapter. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-download.png" width="2in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - The MicroPeak USB adapter has a small phototransistor - under the hole in the center of the box. - Locate this, turn on the MicroPeak and place the orange LED on the MicroPeak - directly inside the hole, resting the MicroPeak itself on - the box. You should see the blue LED on the MicroPeak USB - adapter blinking in time with the orange LED on the - MicroPeak board itself. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="MicroPeakUSB-2.0-inuse.jpg" width="4.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </listitem> - <listitem> - <?dbfo keep-together="always"?> - <para> - After the maximum flight height is reported, MicroPeak will - pause for a few seconds, blink the LED four times rapidly - and then send the data in one long blur on the LED. The - MicroPeak application should receive the data. When it does, - it will present the data in a graph and offer to save the - data to a file. If not, you can power cycle the MicroPeak - board and try again. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-save-dialog.png" width="2.3in"/> - </imageobject> - </mediaobject> - </informalfigure> - </listitem> - <listitem> - <?dbfo keep-together="always"?> - <para> - Once the data are saved, a graph will be displayed with - height, speed and acceleration values computed from the - recorded barometric pressure data. See the next section - for more details on that. - </para> - </listitem> - </itemizedlist> - </section> - <section> - <title>Analyzing MicroPeak Data</title> - <para> - The MicroPeak application can present flight data in the form - of a graph, a collection of computed statistics or in tabular - form. - </para> - <para> - MicroPeak collects raw barometric pressure data which is - then used to compute the remaining data. Altitude is computed - through a standard atmospheric model. Absolute error in this - data will be affected by local atmospheric - conditions. Fortunately, these errors tend to mostly cancel - out, so the error in the height computation is much smaller - than the error in altitude would be. - </para> - <para> - Speed and acceleration are computed by first smoothing the - height data with a Gaussian window averaging filter. For speed - data, this average uses seven samples. For acceleration data, - eleven samples are used. These were chosen to provide - reasonably smooth speed and acceleration data, which would - otherwise be swamped with noise. - </para> - <para> - The File menu has operations to open existing flight logs, - Download new data from MicroPeak, Save a copy of the flight - log to a new file, Export the tabular data (as seen in the Raw - Data tab) to a file, change the application Preferences, Close - the current window or close all windows and Exit the - application. - </para> - <section> - <title>MicroPeak Graphs</title> - <para> - Under the Graph tab, the height, speed and acceleration values - are displayed together. You can zoom in on the graph by - clicking and dragging to sweep out an area of - interest. Right-click on the plot to bring up a menu that will - let you save, copy or print the graph. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-graph.png" width="4.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>MicroPeak Flight Statistics</title> - <para> - The Statistics tab presents overall data from the flight. Note - that the Maximum height value is taken from the minumum - pressure captured in flight, and may be different from the - apparant apogee value as the on-board data are sampled twice - as fast as the recorded values, or because the true apogee - occurred after the on-board memory was full. Each value is - presented in several units as appropriate. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-statistics.png" width="4.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>Raw Data</title> - <para> - A table consisting of the both the raw barometric pressure - data and values computed from that for each recorded time. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-raw-data.png" width="4.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>Configuring the Graph</title> - <para> - This selects which graph elements to show, and lets you - switch between metric and imperial units - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-graph-configure.png" width="4.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </section> - </section> - <section> - <title>Setting MicroPeak Preferences</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="micropeak-preferences.png" width="1.8in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - The MicroPeak application has a few user settings which are - configured through the Preferences dialog, which can be - accessed from the File menu. - <itemizedlist> - <listitem> - <para> - The Log Directory is where flight data will be saved to - and loaded from by default. Of course, you can always - navigate to other directories in the file chooser windows, - this setting is just the starting point. - </para> - </listitem> - <listitem> - <para> - If you prefer to see your graph data in feet and - miles per hour instead of meters and meters per second, - you can select Imperial Units. - </para> - </listitem> - <listitem> - <para> - To see what data is actually arriving over the serial - port, start the MicroPeak application from a command - prompt and select the Serial Debug option. This can be - useful in debugging serial communication problems, but - most people need never choose this. - </para> - </listitem> - <listitem> - <para> - You can adjust the size of the text in the Statistics tab - by changing the Font size preference. There are three - settings, with luck one will both fit on your screen and - provide readable values. - </para> - </listitem> - <listitem> - <para> - The Look & feel menu shows a list of available - application appearance choices. By default, the MicroPeak - application tries to blend in with other applications, but - you may choose some other appearance if you like. - </para> - </listitem> - </itemizedlist> - </para> - <para> - Note that MicroPeak shares a subset of the AltosUI - preferences, so if you use both of these applications, change - in one application will affect the other. - </para> - </section> - </chapter> - <chapter> - <title>Technical Information</title> - <section> - <title>Barometric Sensor</title> - <para> - MicroPeak uses the Measurement Specialties MS5607 sensor. This - has a range of 120kPa to 1kPa with an absolute accuracy of - 150Pa and a resolution of 2.4Pa. - </para> - <para> - The pressure range corresponds roughly to an altitude range of - -1500m (-4900 feet) to 31000m (102000 feet), while the - resolution is approximately 20cm (8 inches) near sea level and - 60cm (24in) at 10000m (33000 feet). - </para> - <para> - Ground pressure is computed from an average of 16 samples, - taken while the altimeter is at rest. The flight pressure used to - report maximum height is computed from a Kalman filter - designed to smooth out any minor noise in the sensor - values. The flight pressure recorded to non-volatile storage - is unfiltered, coming directly from the pressure sensor. - </para> - </section> - <section> - <title>Micro-controller</title> - <para> - MicroPeak uses an Atmel ATtiny85 micro-controller. This tiny - CPU contains 8kB of flash for the application, 512B of RAM for - temporary data storage and 512B of EEPROM for non-volatile - storage of previous flight data. - </para> - <para> - The ATtiny85 has a low-power mode which turns off all of the - clocks and powers down most of the internal components. In - this mode, the chip consumes only .1μA of power. MicroPeak - uses this mode once the flight has ended to preserve battery - power. - </para> - </section> - <section> - <title>Lithium Battery</title> - <para> - The CR1025 battery used by MicroPeak holds 30mAh of power, - which is sufficient to run for over 40 hours. Because - MicroPeak powers down on landing, run time includes only time - sitting on the launch pad or during flight. - </para> - <para> - The large positive terminal (+) is usually marked, while the - smaller negative terminal is not. Make sure you install the - battery with the positive terminal facing away from the - circuit board where it will be in contact with the metal - battery holder. A small pad on the circuit board makes contact - with the negative battery terminal. - </para> - <para> - Shipping restrictions may prevent us from including a CR1025 - battery with MicroPeak. If so, many stores carry CR1025 - batteries as they are commonly used in small electronic - devices such as flash lights. - </para> - </section> - <section> - <title>Atmospheric Model</title> - <para> - MicroPeak contains a fixed atmospheric model which is used to - convert barometric pressure into altitude. The model was - converted into a 469-element piece-wise linear approximation - which is then used to compute the altitude of the ground and - apogee. The difference between these represents the maximum - height of the flight. - </para> - <para> - The model assumes a particular set of atmospheric conditions, - which, while a reasonable average, cannot represent the changing - nature of the real atmosphere. Fortunately, for flights - reasonably close to the ground, the effect of this global - inaccuracy are largely canceled out when the computed ground - altitude is subtracted from the computed apogee altitude, so - the resulting height is more accurate than either the ground - or apogee altitudes. - </para> - <para> - Because the raw pressure data is recorded to non-volatile - storage, you can use that, along with a more sophisticated - atmospheric model, to compute your own altitude values. - </para> - </section> - <section> - <title>Mechanical Considerations</title> - <para> - MicroPeak is designed to be rugged enough for typical rocketry - applications. It contains two moving parts, the battery holder - and the power switch, which were selected for their - ruggedness. - </para> - <para> - The MicroPeak battery holder is designed to withstand impact - up to 150g without breaking contact (or, worse yet, causing - the battery to fall out). That means it should stand up to - almost any launch you care to try, and should withstand fairly - rough landings. - </para> - <para> - The power switch is designed to withstand up to 50g forces in - any direction. Because it is a sliding switch, orienting the - switch perpendicular to the direction of rocket travel will - serve to further protect the switch from launch forces. - </para> - </section> - <section> - <title>On-board data storage</title> - <para> - The ATtiny85 has 512 bytes of non-volatile storage, separate - from the code storage memory. The MicroPeak firmware uses this - to store information about the last completed - flight. Barometric measurements from the ground before launch - and at apogee are stored, and used at power-on to compute the - height of the last flight. - </para> - <para> - In addition to the data used to present the height of the last - flight, MicroPeak also stores barometric information sampled - at regular intervals during the flight. This is the - information captured with the MicroPeak USB adapter. It can - also be read from MicroPeak through any AVR programming - tool. - </para> - <table frame='all'> - <title>MicroPeak EEPROM Data Storage</title> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='2*' colname='Address'/> - <colspec align='center' colwidth='*' colname='Size (bytes)'/> - <colspec align='left' colwidth='7*' colname='Description'/> - <thead> - <row> - <entry align='center'>Address</entry> - <entry align='center'>Size (bytes)</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0x000</entry> - <entry>4</entry> - <entry>Average ground pressure (Pa)</entry> - </row> - <row> - <entry>0x004</entry> - <entry>4</entry> - <entry>Minimum flight pressure (Pa)</entry> - </row> - <row> - <entry>0x008</entry> - <entry>2</entry> - <entry>Number of in-flight samples</entry> - </row> - <row> - <entry>0x00a … 0x1fe</entry> - <entry>2</entry> - <entry>Instantaneous flight pressure (Pa) low 16 bits</entry> - </row> - </tbody> - </tgroup> - </table> - <para> - All EEPROM data are stored least-significant byte first. The - instantaneous flight pressure data are stored without the - upper 16 bits of data. The upper bits can be reconstructed - from the previous sample, assuming that pressure doesn't - change by more more than 32kPa in a single sample - interval. Note that this pressure data is <emphasis>not</emphasis> - filtered in any way, while both the recorded ground and apogee - pressure values are, so you shouldn't expect the minimum - instantaneous pressure value to match the recorded minimum - pressure value exactly. - </para> - <para> - MicroPeak samples pressure every 96ms, but stores only every - other sample in the EEPROM. This provides for 251 pressure - samples at 192ms intervals, or 48.192s of storage. The clock - used for these samples is a factory calibrated RC circuit - built into the ATtiny85 and is accurate only to within ±10% at - 25°C. So, you can count on the pressure data being accurate, - but speed or acceleration data computed from this will be - limited by the accuracy of this clock. - </para> - </section> - <section> - <title>MicroPeak Programming Interface</title> - <para> - MicroPeak exposes a standard 6-pin AVR programming interface, - but not using the usual 2x3 array of pins on 0.1" - centers. Instead, there is a single row of tiny 0.60mm × - 0.85mm pads on 1.20mm centers exposed near the edge of the - circuit board. We couldn't find any connector that was - small enough to include on the circuit board. - </para> - <para> - In lieu of an actual connector, the easiest way to connect to - the bare pads is through a set of Pogo pins. These - spring-loaded contacts are designed to connect in precisely - this way. We've designed a programming jig, the MicroPeak - Pogo Pin board which provides a standard AVR interface on one - end and a recessed slot for MicroPeak to align the board with - the Pogo Pins. - </para> - <para> - The MicroPeak Pogo Pin board is not a complete AVR programmer, - it is an interface board that provides a 3.3V regulated power - supply to run the MicroPeak via USB and a standard 6-pin AVR - programming interface with the usual 2x3 grid of pins on 0.1" - centers. This can be connected to any AVR programming - dongle. - </para> - <para> - The AVR programming interface cannot run faster than ¼ of the - AVR CPU clock frequency. Because MicroPeak runs at 250kHz to - save power, you must configure your AVR programming system to - clock the AVR programming interface at no faster than - 62.5kHz, or a clock period of 32µS. - </para> - </section> - </chapter> -</book> -<!-- LocalWords: Altusmetrum MicroPeak ---> diff --git a/doc/pyro-channels.inc b/doc/pyro-channels.inc new file mode 100644 index 00000000..3b918544 --- /dev/null +++ b/doc/pyro-channels.inc @@ -0,0 +1,99 @@ + +Acceleration:: Select a value, and then choose +whether acceleration should be above or below +that value. Acceleration is positive upwards, +so accelerating towards the ground would +produce negative numbers. Acceleration during +descent is noisy and inaccurate, so be careful +when using it during these phases of the +flight. + +Vertical speed:: Select a value, and then +choose whether vertical speed should be above +or below that value. Speed is positive +upwards, so moving towards the ground would +produce negative numbers. Speed during descent +is a bit noisy and so be careful when using it +during these phases of the flight. + +Height:: Select a value, and then choose +whether the height above the launch pad should +be above or below that value. + +Orientation:: TeleMega and EasyMega contain a +3-axis gyroscope and accelerometer which is +used to measure the current angle. Note that +this angle is not the change in angle from the +launch pad, but rather absolute relative to +gravity; the 3-axis accelerometer is used to +compute the angle of the rocket on the launch +pad and initialize the system. + + [NOTE] + ==== + Because this value is computed by integrating + rate gyros, it gets progressively less + accurate as the flight goes on. It should have + an accumulated error of less than 0.2°/second + (after 10 seconds of flight, the error should + be less than 2°). + + The usual use of the orientation configuration + is to ensure that the rocket is traveling + mostly upwards when deciding whether to ignite + air starts or additional stages. For that, + choose a reasonable maximum angle (like 20°) + and set the motor igniter to require an angle + of less than that value. + ==== + +Flight Time:: Time since boost was detected. Select a value and choose +whether to activate the pyro channel before or after that amount of +time. + +Ascending:: A simple test saying whether the rocket is going up or +not. This is exactly equivalent to testing whether the speed is > 0. + +Descending:: A simple test saying whether the rocket is going down or +not. This is exactly equivalent to testing whether the speed is < 0. + +After Motor:: The flight software counts each time the rocket starts +accelerating and then decelerating (presumably due to a motor or +motors burning). Use this value for multi-staged or multi-airstart +launches. + +Delay:: This value doesn't perform any checks, instead it inserts a +delay between the time when the other parameters become true and when +the pyro channel is activated. + +Flight State:: The flight software tracks the flight +through a sequence of states: + + * Boost. The motor has lit and the rocket is + accelerating upwards. + + * Fast. The motor has burned out and the + rocket is decelerating, but it is going + faster than 200m/s. + + * Coast. The rocket is still moving upwards + and decelerating, but the speed is less + than 200m/s. + + * Drogue. The rocket has reached apogee and + is heading back down, but is above the + configured Main altitude. + + * Main. The rocket is still descending, and + is below the Main altitude + + * Landed. The rocket is no longer moving. + +You can select a state to limit when the pyro channel may activate; +note that the check is based on when the rocket transitions *into* the +state, and so checking for “greater than Boost” means that the rocket +is currently in boost or some later state. + +When a motor burns out, the rocket enters either Fast or Coast state +(depending on how fast it is moving). If the computer detects upwards +acceleration again, it will move back to Boost state. diff --git a/doc/release-notes-0.7.1-docinfo.xml b/doc/release-notes-0.7.1-docinfo.xml new file mode 100644 index 00000000..9657f2a6 --- /dev/null +++ b/doc/release-notes-0.7.1-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>29 September 2010</date> +<copyright> + <year>2010</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-0.7.1.inc b/doc/release-notes-0.7.1.inc new file mode 100644 index 00000000..8ce49f0a --- /dev/null +++ b/doc/release-notes-0.7.1.inc @@ -0,0 +1,53 @@ += Release Notes for Version 0.7.1 +:toc!: +:doctype: article + + Version 0.7.1 is the first release containing our new + cross-platform Java-based user interface. + + == AltosUI Application + + * Receive and log telemetry from a connected TeleDongle + device. All data received is saved to log files named with + the current date and the connected rocket serial and flight + numbers. There is no mode in which telemetry data will not + be saved. + + + * Download logged data from TeleMetrum devices, either through + a direct USB connection or over the air through a TeleDongle + device. + + + * Configure a TeleMetrum device, setting the radio channel, + callsign, apogee delay and main deploy height. This can be + done through either a USB connection or over a radio link + via a TeleDongle device. + + + * Replay a flight in real-time. This takes a saved telemetry + log or eeprom download and replays it through the user + interface so you can relive your favorite rocket flights. + + + * Reprogram Altus Metrum devices. Using an Altus Metrum device + connected via USB, another Altus Metrum device can be + reprogrammed using the supplied programming cable between + the two devices. + + + * Export Flight data to a comma-separated-values file. This + takes either telemetry or on-board flight data and generates + data suitable for use in external applications. All data is + exported using standard units so that no device-specific + knowledge is needed to handle the data. + + + * Speak to you during the flight. Instead of spending the + flight hunched over your laptop looking at the screen, enjoy + the view while the computer tells you what’s going on up + there. During ascent, you hear the current flight state and + altitude information. During descent, you get azimuth, + elevation and range information to try and help you find + your rocket in the air. Once on the ground, the direction + and distance are reported. diff --git a/doc/release-notes-0.7.1.xsl b/doc/release-notes-0.7.1.xsl deleted file mode 100644 index 1f2feeb0..00000000 --- a/doc/release-notes-0.7.1.xsl +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> -Version 0.7.1 is the first release containing our new cross-platform Java-based user interface. AltosUI can: - </para> - <itemizedlist> - <listitem> -<para> - Receive and log telemetry from a connected TeleDongle - device. All data received is saved to log files named with the - current date and the connected rocket serial and flight - numbers. There is no mode in which telemetry data will not be - saved. - </para> -</listitem> - <listitem> -<para> - Download logged data from TeleMetrum devices, either through a - direct USB connection or over the air through a TeleDongle - device. - </para> -</listitem> - <listitem> -<para> - Configure a TeleMetrum device, setting the radio channel, - callsign, apogee delay and main deploy height. This can be done - through either a USB connection or over a radio link via a - TeleDongle device. - </para> -</listitem> - <listitem> -<para> - Replay a flight in real-time. This takes a saved telemetry log - or eeprom download and replays it through the user interface so - you can relive your favorite rocket flights. - </para> -</listitem> - <listitem> -<para> - Reprogram Altus Metrum devices. Using an Altus Metrum device - connected via USB, another Altus Metrum device can be - reprogrammed using the supplied programming cable between the - two devices. - </para> -</listitem> - <listitem> -<para> - Export Flight data to a comma-separated-values file. This takes - either telemetry or on-board flight data and generates data - suitable for use in external applications. All data is exported - using standard units so that no device-specific knowledge is - needed to handle the data. - </para> -</listitem> - <listitem> -<para> - Speak to you during the flight. Instead of spending the flight - hunched over your laptop looking at the screen, enjoy the view - while the computer tells you what’s going on up there. During - ascent, you hear the current flight state and altitude - information. During descent, you get azimuth, elevation and - range information to try and help you find your rocket in the - air. Once on the ground, the direction and distance are - reported. - </para> -</listitem> - </itemizedlist> -</article> diff --git a/doc/release-notes-0.8-docinfo.xml b/doc/release-notes-0.8-docinfo.xml new file mode 100644 index 00000000..d593da31 --- /dev/null +++ b/doc/release-notes-0.8-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>24 November 2010</date> +<copyright> + <year>2010</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-0.8.inc b/doc/release-notes-0.8.inc new file mode 100644 index 00000000..38230593 --- /dev/null +++ b/doc/release-notes-0.8.inc @@ -0,0 +1,47 @@ += Release Notes for Version 0.8 +:toc!: +:doctype: article + + Version 0.8 offers a major upgrade in the AltosUI + interface. + + == AltosUI Application: + + * Post-flight graphing tool. This lets you explore the + behaviour of your rocket after flight with a scroll-able and + zoom-able chart showing the altitude, speed and acceleration + of the airframe along with events recorded by the flight + computer. You can export graphs to PNG files, or print them + directly. + + * Real-time moving map which overlays the in-progress flight + on satellite imagery fetched from Google Maps. This lets you + see in pictures where your rocket has landed, allowing you + to plan recovery activities more accurately. + + * Wireless recovery system testing. Prep your rocket for + flight and test fire the deployment charges to make sure + things work as expected. All without threading wires through + holes in your airframe. + + * Optimized flight status displays. Each flight state now has + it's own custom 'tab' in the flight monitoring window so you + can focus on the most important details. Pre-flight, the + system shows a set of red/green status indicators for + battery voltage, apogee/main igniter continutity and GPS + reception. Wait until they're all green and your rocket is + ready for flight. There are also tabs for ascent, descent + and landing along with the original tabular view of the + data. + + * Monitor multiple flights simultaneously. If you have more + than one TeleDongle, you can monitor a flight with each one + on the same computer. + + * Automatic flight monitoring at startup. Plug TeleDongle into + the machine before starting AltosUI and it will + automatically connect to it and prepare to monitor a flight. + + * Exports Google Earth flight tracks. Using the Keyhole Markup + Language (.kml) file format, this provides a 3D view of your + rocket flight through the Google Earth program. diff --git a/doc/release-notes-0.8.xsl b/doc/release-notes-0.8.xsl deleted file mode 100644 index df7ef32d..00000000 --- a/doc/release-notes-0.8.xsl +++ /dev/null @@ -1,70 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 0.8 offers a major upgrade in the AltosUI - interface. Significant new features include: - </para> - <itemizedlist> - <listitem> -<para> - Post-flight graphing tool. This lets you explore the behaviour - of your rocket after flight with a scroll-able and zoom-able - chart showing the altitude, speed and acceleration of the - airframe along with events recorded by the flight computer. You - can export graphs to PNG files, or print them directly. - </para> -</listitem> - <listitem> -<para> - Real-time moving map which overlays the in-progress flight on - satellite imagery fetched from Google Maps. This lets you see in - pictures where your rocket has landed, allowing you to plan - recovery activities more accurately. - </para> -</listitem> - <listitem> -<para> - Wireless recovery system testing. Prep your rocket for flight - and test fire the deployment charges to make sure things work as - expected. All without threading wires through holes in your - airframe. - </para> -</listitem> - <listitem> -<para> - Optimized flight status displays. Each flight state now has it's - own custom 'tab' in the flight monitoring window so you can - focus on the most important details. Pre-flight, the system - shows a set of red/green status indicators for battery voltage, - apogee/main igniter continutity and GPS reception. Wait until - they're all green and your rocket is ready for flight. There are - also tabs for ascent, descent and landing along with the - original tabular view of the data. - </para> -</listitem> - <listitem> -<para> - Monitor multiple flights simultaneously. If you have more than - one TeleDongle, you can monitor a flight with each one on the - same computer. - </para> -</listitem> - <listitem> -<para> - Automatic flight monitoring at startup. Plug TeleDongle into the - machine before starting AltosUI and it will automatically - connect to it and prepare to monitor a flight. - </para> -</listitem> - <listitem> -<para> - Exports Google Earth flight tracks. Using the Keyhole Markup - Language (.kml) file format, this provides a 3D view of your - rocket flight through the Google Earth program. - </para> -</listitem> - </itemizedlist> -</article> diff --git a/doc/release-notes-0.9-docinfo.xml b/doc/release-notes-0.9-docinfo.xml new file mode 100644 index 00000000..605472f2 --- /dev/null +++ b/doc/release-notes-0.9-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>18 January 2011</date> +<copyright> + <year>2011</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-0.9.2-docinfo.xml b/doc/release-notes-0.9.2-docinfo.xml new file mode 100644 index 00000000..40e53634 --- /dev/null +++ b/doc/release-notes-0.9.2-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>19 March 2011</date> +<copyright> + <year>2011</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-0.9.2.inc b/doc/release-notes-0.9.2.inc new file mode 100644 index 00000000..b7c55bb2 --- /dev/null +++ b/doc/release-notes-0.9.2.inc @@ -0,0 +1,18 @@ += Release Notes for Version 0.9.2 +:toc!: +:doctype: article + + Version 0.9.2 is an AltosUI bug-fix release, with no firmware + changes. + + == AltosUI + + AltosUI fixes: + + * Fix plotting problems due to missing file in the Mac + OS install image. + + * Always read whole eeprom blocks, mark empty records + invalid, display parsing errors to user. + + * Add software version to Configure AltosUI dialog diff --git a/doc/release-notes-0.9.2.xsl b/doc/release-notes-0.9.2.xsl deleted file mode 100644 index 16ff989e..00000000 --- a/doc/release-notes-0.9.2.xsl +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 0.9.2 is an AltosUI bug-fix release, with no firmware changes. - </para> - <itemizedlist> - <listitem> -<para> - Fix plotting problems due to missing file in the Mac OS install image. -</para> - </listitem> - <listitem> -<para> - Always read whole eeprom blocks, mark empty records invalid, display parsing errors to user. -</para> - </listitem> - <listitem> - <para> - Add software version to Configure AltosUI dialog -</para> - </listitem> - </itemizedlist> -</article> diff --git a/doc/release-notes-0.9.inc b/doc/release-notes-0.9.inc new file mode 100644 index 00000000..0ee7ea51 --- /dev/null +++ b/doc/release-notes-0.9.inc @@ -0,0 +1,31 @@ += Release Notes for Version 0.9 +:toc!: +:doctype: article + + Version 0.9 adds a few new firmware features and accompanying + AltosUI changes, along with new hardware support. + + == AltOS + + * Support for TeleMetrum v1.1 hardware. Sources for the flash + memory part used in v1.0 dried up, so v1.1 uses a different + part which required a new driver and support for explicit + flight log erasing. + + * Multiple flight log support. This stores more than one + flight log in the on-board flash memory. It also requires + the user to explicitly erase flights so that you won't lose + flight logs just because you fly the same board twice in one + day. + + * Telemetry support for devices with serial number >= 256. + Previous versions used a telemetry packet format that + provided only 8 bits for the device serial number. This + change requires that both ends of the telemetry link be + running the 0.9 firmware or they will not communicate. + + == AltosUI Application + + * Support for telemetry format changes. + + * Support for multiple flight logs. diff --git a/doc/release-notes-0.9.xsl b/doc/release-notes-0.9.xsl deleted file mode 100644 index a5d6b3d7..00000000 --- a/doc/release-notes-0.9.xsl +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 0.9 adds a few new firmware features and accompanying - AltosUI changes, along with new hardware support. - </para> - <itemizedlist> - <listitem> - <para> - Support for TeleMetrum v1.1 hardware. Sources for the flash - memory part used in v1.0 dried up, so v1.1 uses a different part - which required a new driver and support for explicit flight log - erasing. -</para> - </listitem> - <listitem> - <para> - Multiple flight log support. This stores more than one flight - log in the on-board flash memory. It also requires the user to - explicitly erase flights so that you won't lose flight logs just - because you fly the same board twice in one day. -</para> - </listitem> - <listitem> - <para> - Telemetry support for devices with serial number >= - 256. Previous versions used a telemetry packet format that - provided only 8 bits for the device serial number. This change - requires that both ends of the telemetry link be running the 0.9 - firmware or they will not communicate. -</para> - </listitem> - </itemizedlist> -</article> diff --git a/doc/release-notes-1.0.1-docinfo.xml b/doc/release-notes-1.0.1-docinfo.xml new file mode 100644 index 00000000..23972104 --- /dev/null +++ b/doc/release-notes-1.0.1-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>24 August 2011</date> +<copyright> + <year>2011</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.0.1.inc b/doc/release-notes-1.0.1.inc new file mode 100644 index 00000000..067727e9 --- /dev/null +++ b/doc/release-notes-1.0.1.inc @@ -0,0 +1,100 @@ += Release Notes for Version 1.0.1 +:toc!: +:doctype: article + + Version 1.0.1 is a major release, adding support for the + TeleMini device and lots of new AltosUI features + + == AltOS + + AltOS New Features + + * Add TeleMini v1.0 support. + + * Support operation of TeleMetrum with the antenna pointing + aft. Previous firmware versions required the antenna to be + pointing upwards, now there is a configuration option + allowing the antenna to point aft, to aid installation in + some airframes. + + * Ability to disable telemetry. For airframes where an antenna + just isn't possible, or where radio transmissions might + cause trouble with other electronics, there's a + configuration option to disable all telemetry. Note that the + board will still enable the radio link in idle mode. + + * Arbitrary frequency selection. The radios in Altus Metrum + devices can be programmed to a wide range of frequencies, so + instead of limiting devices to 10 pre-selected 'channels', + the new firmware allows the user to choose any frequency in + the 70cm band. Note that the RF matching circuit on the + boards is tuned for around 435MHz, so frequencies far from + that may reduce the available range. + + + AltOS Fixes + + * Change telemetry to be encoded in multiple 32-byte + packets. This enables support for TeleMini and other devices + without requiring further updates to the TeleDongle + firmware. + + * Kalman-filter based flight-tracking. The model based sensor + fusion approach of a Kalman filter means that AltOS now + computes apogee much more accurately than before, generally + within a fraction of a second. In addition, this approach + allows the baro-only TeleMini device to correctly identify + Mach transitions, avoiding the error-prone selection of a + Mach delay. + + + == AltosUI Application + + AltosUI New Features + + * Add main/apogee voltage graphs to the data + plot. This provides a visual indication if the + igniters fail before being fired. + + * Scan for altimeter devices by watching the defined + telemetry frequencies. This avoids the problem of + remembering what frequency a device was configured + to use, which is especially important with TeleMini + which does not include a USB connection. + + * Monitor altimeter state in "Idle" mode. This + provides much of the information presented in the + "Pad" dialog from the Monitor Flight command, + monitoring the igniters, battery and GPS status + withing requiring the flight computer to be armed + and ready for flight. + + + * Pre-load map images from home. For those launch + sites which don't provide free Wi-Fi, this allows + you to download the necessary satellite images + given the location of the launch site. A list of + known launch sites is maintained at altusmetrum.org + which AltosUI downloads to populate a menu; if + you've got a launch site not on that list, please + send the name of it, latitude and longitude along + with a link to the web site of the controlling club + to the altusmetrum mailing list. + + * Flight statistics are now displayed in the Graph + data window. These include max height/speed/accel, + average descent rates and a few other bits of + information. The Graph Data window can now be + reached from the 'Landed' tab in the Monitor Flight + window so you can immediately see the results of a + flight. + + AltosUI Changes + + * Wait for altimeter when using packet mode. Instead + of quicly timing out when trying to initialize a + packet mode configuration connection, AltosUI now + waits indefinitely for the remote device to appear, + providing a cancel button should the user get + bored. This is necessary as the TeleMini can only be + placed in "Idle" mode if AltosUI is polling it. diff --git a/doc/release-notes-1.0.1.xsl b/doc/release-notes-1.0.1.xsl deleted file mode 100644 index 8b66f7e0..00000000 --- a/doc/release-notes-1.0.1.xsl +++ /dev/null @@ -1,127 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.0.1 is a major release, adding support for the TeleMini - device and lots of new AltosUI features - </para> - <para> - AltOS Firmware Changes - <itemizedlist> - <listitem> -<para> - Add TeleMini v1.0 support. Firmware images for TeleMini are - included in AltOS releases. - </para> -</listitem> - <listitem> -<para> - Change telemetry to be encoded in multiple 32-byte packets. This - enables support for TeleMini and other devices without requiring - further updates to the TeleDongle firmware. - </para> -</listitem> - <listitem> -<para> - Support operation of TeleMetrum with the antenna pointing - aft. Previous firmware versions required the antenna to be - pointing upwards, now there is a configuration option allowing - the antenna to point aft, to aid installation in some airframes. - </para> -</listitem> - <listitem> -<para> - Ability to disable telemetry. For airframes where an antenna - just isn't possible, or where radio transmissions might cause - trouble with other electronics, there's a configuration option - to disable all telemetry. Note that the board will still - enable the radio link in idle mode. - </para> -</listitem> - <listitem> -<para> - Arbitrary frequency selection. The radios in Altus Metrum - devices can be programmed to a wide range of frequencies, so - instead of limiting devices to 10 pre-selected 'channels', the - new firmware allows the user to choose any frequency in the - 70cm band. Note that the RF matching circuit on the boards is - tuned for around 435MHz, so frequencies far from that may - reduce the available range. - </para> -</listitem> - <listitem> -<para> - Kalman-filter based flight-tracking. The model based sensor - fusion approach of a Kalman filter means that AltOS now - computes apogee much more accurately than before, generally - within a fraction of a second. In addition, this approach - allows the baro-only TeleMini device to correctly identify - Mach transitions, avoiding the error-prone selection of a Mach - delay. - </para> -</listitem> - </itemizedlist> - </para> - <para> - AltosUI Changes - <itemizedlist> - <listitem> -<para> - Wait for altimeter when using packet mode. Instead of quicly - timing out when trying to initialize a packet mode - configuration connection, AltosUI now waits indefinitely for - the remote device to appear, providing a cancel button should - the user get bored. This is necessary as the TeleMini can only - be placed in "Idle" mode if AltosUI is polling it. - </para> -</listitem> - <listitem> -<para> - Add main/apogee voltage graphs to the data plot. This provides - a visual indication if the igniters fail before being fired. - </para> -</listitem> - <listitem> -<para> - Scan for altimeter devices by watching the defined telemetry - frequencies. This avoids the problem of remembering what - frequency a device was configured to use, which is especially - important with TeleMini which does not include a USB connection. - </para> -</listitem> - <listitem> -<para> - Monitor altimeter state in "Idle" mode. This provides much of - the information presented in the "Pad" dialog from the Monitor - Flight command, monitoring the igniters, battery and GPS - status withing requiring the flight computer to be armed and - ready for flight. - </para> -</listitem> - <listitem> -<para> - Pre-load map images from home. For those launch sites which - don't provide free Wi-Fi, this allows you to download the - necessary satellite images given the location of the launch - site. A list of known launch sites is maintained at - altusmetrum.org which AltosUI downloads to populate a menu; if - you've got a launch site not on that list, please send the - name of it, latitude and longitude along with a link to the - web site of the controlling club to the altusmetrum mailing list. - </para> -</listitem> - <listitem> -<para> - Flight statistics are now displayed in the Graph data - window. These include max height/speed/accel, average descent - rates and a few other bits of information. The Graph Data - window can now be reached from the 'Landed' tab in the Monitor - Flight window so you can immediately see the results of a - flight. - </para> -</listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.1-docinfo.xml b/doc/release-notes-1.1-docinfo.xml new file mode 100644 index 00000000..93273918 --- /dev/null +++ b/doc/release-notes-1.1-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>13 September 2012</date> +<copyright> + <year>2013</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.1.1-docinfo.xml b/doc/release-notes-1.1.1-docinfo.xml new file mode 100644 index 00000000..41ea12da --- /dev/null +++ b/doc/release-notes-1.1.1-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>16 September 2012</date> +<copyright> + <year>2012</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.1.1.inc b/doc/release-notes-1.1.1.inc new file mode 100644 index 00000000..2e61bfec --- /dev/null +++ b/doc/release-notes-1.1.1.inc @@ -0,0 +1,57 @@ += Release Notes for Version 1.1 +:toc!: +:doctype: article + + Version 1.1.1 is a bug-fix release. It fixes a couple of bugs + in AltosUI and one firmware bug that affects TeleMetrum + version 1.0 boards. Thanks to Bob Brown for help diagnosing + the Google Earth file export issue, and for suggesting the + addition of the Ground Distance value in the Descent tab. + + == AltOS + + AltOS fixes: + + * TeleMetrum v1.0 boards use the AT45DB081D flash + memory part to store flight data, which is different + from later TeleMetrum boards. The AltOS v1.1 driver + for this chip couldn't erase memory, leaving it + impossible to delete flight data or update + configuration values. This bug doesn't affect newer + TeleMetrum boards, and it doesn't affect the safety + of rockets flying version 1.1 firmware. + + == AltosUI + + AltosUI new features: + + * The “Descent” tab displays the range to the rocket, + which is a combination of the over-the-ground + distance to the rockets current latitude/longitude + and the height of the rocket. As such, it's useful + for knowing how far away the rocket is, but + difficult to use when estimating where the rocket + might eventually land. A new “Ground Distance” field + has been added which displays the distance to a spot + right underneath the rocket. + + AltosUI fixes: + + * Creating a Google Earth file (KML) from on-board + flight data (EEPROM) would generate an empty + file. The code responsible for reading the EEPROM + file wasn't ever setting the GPS valid bits, and so + the KML export code thought there was no GPS data in + the file. + + * The “Landed” tab was displaying all values in metric + units, even when AltosUI was configured to display + imperial units. Somehow I just missed this tab when + doing the units stuff. + + * Sensor data wasn't being displayed for TeleMini + flight computers in Monitor Idle mode, including + things like battery voltage. The code that picked + which kinds of data to fetch from the flight + computer was missing a check for TeleMini when + deciding whether to fetch the analog sensor data. diff --git a/doc/release-notes-1.1.1.xsl b/doc/release-notes-1.1.1.xsl deleted file mode 100644 index 6f3a925d..00000000 --- a/doc/release-notes-1.1.1.xsl +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.1.1 is a bug-fix release. It fixes a couple of bugs in - AltosUI and one firmware bug that affects TeleMetrum version 1.0 - boards. Thanks to Bob Brown for help diagnosing the Google Earth - file export issue, and for suggesting the addition of the Ground - Distance value in the Descent tab. - </para> - <para> - AltOS Firmware Changes - <itemizedlist> - <listitem> -<para> - TeleMetrum v1.0 boards use the AT45DB081D flash memory part to - store flight data, which is different from later TeleMetrum - boards. The AltOS v1.1 driver for this chip couldn't erase - memory, leaving it impossible to delete flight data or update - configuration values. This bug doesn't affect newer TeleMetrum - boards, and it doesn't affect the safety of rockets flying - version 1.1 firmware. - </para> -</listitem> - </itemizedlist> - </para> - <para> - AltosUI Changes - <itemizedlist> - <listitem> -<para> - Creating a Google Earth file (KML) from on-board flight data - (EEPROM) would generate an empty file. The code responsible - for reading the EEPROM file wasn't ever setting the GPS valid - bits, and so the KML export code thought there was no GPS data - in the file. - </para> -</listitem> - <listitem> -<para> - The “Landed” tab was displaying all values in metric units, - even when AltosUI was configured to display imperial - units. Somehow I just missed this tab when doing the units stuff. - </para> -</listitem> - <listitem> -<para> - The “Descent” tab displays the range to the rocket, which is a - combination of the over-the-ground distance to the rockets - current latitude/longitude and the height of the rocket. As - such, it's useful for knowing how far away the rocket is, but - difficult to use when estimating where the rocket might - eventually land. A new “Ground Distance” field has been added - which displays the distance to a spot right underneath the - rocket. - </para> -</listitem> - <listitem> -<para> - Sensor data wasn't being displayed for TeleMini flight - computers in Monitor Idle mode, including things like battery - voltage. The code that picked which kinds of data to fetch - from the flight computer was missing a check for TeleMini when - deciding whether to fetch the analog sensor data. - </para> -</listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.1.inc b/doc/release-notes-1.1.inc new file mode 100644 index 00000000..b3ea066d --- /dev/null +++ b/doc/release-notes-1.1.inc @@ -0,0 +1,92 @@ += Release Notes for Version 1.1 +:toc!: +:doctype: article + + Version 1.1 is a minor release. It provides a few new features + in AltosUI and the AltOS firmware and fixes bugs. + + == AltOS + + AltOS Firmware New Features: + + * Add apogee-lockout value. Overrides the apogee + detection logic to prevent incorrect apogee charge + firing. + + * Force the radio frequency to 434.550MHz when the + debug clock pin is connected to ground at boot + time. This provides a way to talk to a TeleMini + which is configured to some unknown frequency. + + * Provide RSSI values for Monitor Idle mode. This + makes it easy to check radio range without needing + to go to flight mode. + + AltOS Fixes: + + * Fix a bug where the data reported in telemetry + packets was from 320ms ago. + + * Fix a bug which caused the old received telemetry + packets to be retransmitted over the USB link when + the radio was turned off and back on. + + == AltosUI + + AltosUI New Features: + + * Make the look-n-feel configurable, providing a choice from + the available options. + + * Add an 'Age' element to mark how long since a + telemetry packet has been received. Useful to + quickly gauge whether communications with the rocket + are still active. + + * Add 'Configure Ground Station' dialog to set the + radio frequency used by a particular TeleDongle + without having to go through the flight monitor UI. + + * Add configuration for the new apogee-lockout + value. A menu provides a list of reasonable values, + or the value can be set by hand. + + * Add Imperial units mode to present data in feet + instead of meters. + + AltosUI Fixes: + + * Fix a bug that caused GPS ready to happen too + quickly. The software was using every telemetry + packet to signal new GPS data, which caused GPS + ready to be signalled after 10 packets instead of 10 + GPS updates. + + * Fix Google Earth data export to work with recent + versions. The google earth file loading code got a + lot pickier, requiring some minor white space + changes in the export code. + + * Changed how flight data are downloaded. Now there's + an initial dialog asking which flights to download, + and after that finishes, a second dialog comes up + asking which flights to delete. + + * Re-compute time spent in each state for the flight + graph; this figures out the actual boost and landing + times instead of using the conservative values + provide by the flight electronics. This improves the + accuracy of the boost acceleration and main descent + rate computations. + + * Make AltosUI run on Mac OS Lion. The default Java + heap space was dramatically reduced for this release + causing much of the UI to fail randomly. This most + often affected the satellite mapping download and + displays. + + * Change how data are displayed in the 'table' tab of + the flight monitoring window. This eliminates + entries duplicated from the header and adds both + current altitude and pad altitude, which are useful + in 'Monitor Idle' mode. diff --git a/doc/release-notes-1.1.xsl b/doc/release-notes-1.1.xsl deleted file mode 100644 index 0b2cce4e..00000000 --- a/doc/release-notes-1.1.xsl +++ /dev/null @@ -1,131 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.1 is a minor release. It provides a few new features in AltosUI - and the AltOS firmware and fixes bugs. - </para> - <para> - AltOS Firmware Changes - <itemizedlist> - <listitem> -<para> - Add apogee-lockout value. Overrides the apogee detection logic to - prevent incorrect apogee charge firing. - </para> -</listitem> - <listitem> -<para> - Fix a bug where the data reported in telemetry packets was - from 320ms ago. - </para> -</listitem> - <listitem> -<para> - Force the radio frequency to 434.550MHz when the debug clock - pin is connected to ground at boot time. This provides a way - to talk to a TeleMini which is configured to some unknown frequency. - </para> -</listitem> - <listitem> -<para> - Provide RSSI values for Monitor Idle mode. This makes it easy to check radio - range without needing to go to flight mode. - </para> -</listitem> - <listitem> -<para> - Fix a bug which caused the old received telemetry packets to - be retransmitted over the USB link when the radio was turned - off and back on. - </para> -</listitem> - </itemizedlist> - </para> - <para> - AltosUI Changes - <itemizedlist> - <listitem> -<para> - Fix a bug that caused GPS ready to happen too quickly. The - software was using every telemetry packet to signal new GPS - data, which caused GPS ready to be signalled after 10 packets - instead of 10 GPS updates. - </para> -</listitem> - <listitem> -<para> - Fix Google Earth data export to work with recent versions. The - google earth file loading code got a lot pickier, requiring - some minor white space changes in the export code. - </para> -</listitem> - <listitem> -<para> - Make the look-n-feel configurable, providing a choice from - the available options. - </para> -</listitem> - <listitem> -<para> - Add an 'Age' element to mark how long since a telemetry packet - has been received. Useful to quickly gauge whether - communications with the rocket are still active. - </para> -</listitem> - <listitem> -<para> - Add 'Configure Ground Station' dialog to set the radio - frequency used by a particular TeleDongle without having to go - through the flight monitor UI. - </para> -</listitem> - <listitem> -<para> - Add configuration for the new apogee-lockout value. A menu provides a list of - reasonable values, or the value can be set by hand. - </para> -</listitem> - <listitem> -<para> - Changed how flight data are downloaded. Now there's an initial - dialog asking which flights to download, and after that - finishes, a second dialog comes up asking which flights to delete. - </para> -</listitem> - <listitem> -<para> - Re-compute time spent in each state for the flight graph; this - figures out the actual boost and landing times instead of - using the conservative values provide by the flight - electronics. This improves the accuracy of the boost - acceleration and main descent rate computations. - </para> -</listitem> - <listitem> -<para> - Make AltosUI run on Mac OS Lion. The default Java heap space - was dramatically reduced for this release causing much of the - UI to fail randomly. This most often affected the satellite - mapping download and displays. - </para> -</listitem> - <listitem> -<para> - Change how data are displayed in the 'table' tab of the flight - monitoring window. This eliminates entries duplicated from the - header and adds both current altitude and pad altitude, which - are useful in 'Monitor Idle' mode. - </para> -</listitem> - <listitem> -<para> - Add Imperial units mode to present data in feet instead of - meters. - </para> -</listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.2-docinfo.xml b/doc/release-notes-1.2-docinfo.xml new file mode 100644 index 00000000..ba2c9d56 --- /dev/null +++ b/doc/release-notes-1.2-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>18 April 2013</date> +<copyright> + <year>2013</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.2.1-docinfo.xml b/doc/release-notes-1.2.1-docinfo.xml new file mode 100644 index 00000000..d0f08b9c --- /dev/null +++ b/doc/release-notes-1.2.1-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>21 May 2013</date> +<copyright> + <year>2013</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.2.1.inc b/doc/release-notes-1.2.1.inc new file mode 100644 index 00000000..18c5d7e2 --- /dev/null +++ b/doc/release-notes-1.2.1.inc @@ -0,0 +1,77 @@ += Release Notes for Version 1.2.1 +:toc!: +:doctype: article + + Version 1.2.1 is a minor release. It adds support for TeleBT and + the AltosDroid application, provides several new features in + AltosUI and fixes some bugs in the AltOS firmware. + + == AltOS + + AltOS new features: + + * Add support for TeleBT + + AltOS fixes: + + * In TeleMini recovery mode (when booted with the + outer two debug pins connected together), the radio + parameters are also set back to defaults + (434.550MHz, N0CALL, factory radio cal). + + * Correct Kalman filter model error covariance + matrix. The values used previously assumed + continuous measurements instead of discrete + measurements. + + * Fix some bugs in the USB driver for TeleMetrum and + TeleDongle that affected Windows users. + + * Adjusted the automatic gain control parameters that + affect receive performance for TeleDongle. Field + tests indicate that this may improve receive + performance somewhat. + + == AltosUI Application + + AltosUI application new features: + + * Make the initial position of the AltosUI top level + window configurable. Along with this change, the + other windows will pop up at 'sensible' places now, + instead of on top of one another. + + * Add GPS data and a map to the graph window. This + lets you see a complete summary of the flight + without needing to 'replay' the whole thing. + + AltosUI application fixes: + + * Handle missing GPS lock in 'Descent' + tab. Previously, if the GPS position of the pad was + unknown, an exception would be raised, breaking the + Descent tab contents. + + * Improve the graph, adding tool-tips to show values + near the cursor and making the displayed set of + values configurable, adding all of the flight data + as options while leaving the default settings alone + so that the graph starts by showing height, speed + and acceleration. + + * Add callsign to Monitor idle window and connecting + dialogs. This makes it clear which callsign is being + used so that the operator will be aware that it must + match the flight computer value or no communication + will work. + + * When downloading flight data, display the block + number so that the user has some sense of + progress. Unfortunately, we don't know how many + blocks will need to be downloaded, but at least it + isn't just sitting there doing nothing for a long + time. + + == AltosDroid + + * First version of this application diff --git a/doc/release-notes-1.2.1.xsl b/doc/release-notes-1.2.1.xsl deleted file mode 100644 index 0f056954..00000000 --- a/doc/release-notes-1.2.1.xsl +++ /dev/null @@ -1,107 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.2.1 is a minor release. It adds support for TeleBT and - the AltosDroid application, provides several new features in - AltosUI and fixes some bugs in the AltOS firmware. - </para> - <para> - AltOS Firmware Changes - <itemizedlist> - <listitem> -<para> - Add support for TeleBT - </para> -</listitem> - <listitem> -<para> - In TeleMini recovery mode (when booted with the outer two - debug pins connected together), the radio parameters are also - set back to defaults (434.550MHz, N0CALL, factory radio cal). - </para> -</listitem> - <listitem> -<para> - Add support for reflashing the SkyTraq GPS chips. This - requires special host-side code which currently only exists - for Linux. - </para> -</listitem> - <listitem> -<para> - Correct Kalman filter model error covariance matrix. The - values used previously assumed continuous measurements instead - of discrete measurements. - </para> -</listitem> - <listitem> -<para> - Fix some bugs in the USB driver for TeleMetrum and TeleDongle - that affected Windows users. - </para> -</listitem> - <listitem> -<para> - Adjusted the automatic gain control parameters that affect - receive performance for TeleDongle. Field tests indicate that this - may improve receive performance somewhat. - </para> -</listitem> - </itemizedlist> - </para> - <para> - AltosUI Changes - <itemizedlist> - <listitem> -<para> - Handle missing GPS lock in 'Descent' tab. Previously, if the - GPS position of the pad was unknown, an exception would be - raised, breaking the Descent tab contents. - </para> -</listitem> - <listitem> -<para> - Improve the graph, adding tool-tips to show values near the - cursor and making the displayed set of values configurable, - adding all of the flight data as options while leaving the - default settings alone so that the graph starts by showing - height, speed and acceleration. - </para> -</listitem> - <listitem> -<para> - Make the initial position of the AltosUI top level window - configurable. Along with this change, the other windows will - pop up at 'sensible' places now, instead of on top of one - another. - </para> -</listitem> - <listitem> -<para> - Add callsign to Monitor idle window and connecting - dialogs. This makes it clear which callsign is being used so - that the operator will be aware that it must match the flight - computer value or no communication will work. - </para> -</listitem> - <listitem> -<para> - When downloading flight data, display the block number so that - the user has some sense of progress. Unfortunately, we don't - know how many blocks will need to be downloaded, but at least - it isn't just sitting there doing nothing for a long time. - </para> -</listitem> - <listitem> -<para> - Add GPS data and a map to the graph window. This lets you see - a complete summary of the flight without needing to 'replay' - the whole thing. - </para> -</listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.2.inc b/doc/release-notes-1.2.inc new file mode 100644 index 00000000..42afad04 --- /dev/null +++ b/doc/release-notes-1.2.inc @@ -0,0 +1,32 @@ += Release Notes for Version 1.2 +:toc!: +:doctype: article + + Version 1.2 is a major release. It adds support for MicroPeak + and the MicroPeak USB adapter. + + == AltOS + + AltOS New Features: + + * Add MicroPeak support. This includes support for the + ATtiny85 processor and adaptations to the core code + to allow for devices too small to run the + multi-tasking scheduler. + + == AltosUI and MicroPeak Application + + New Features: + + * Added MicroPeak application + + AltosUI and MicroPeak fixes: + + * Distribute Mac OS X packages in disk image ('.dmg') + format to greatly simplify installation. + + * Provide version numbers for the shared Java + libraries to ensure that upgrades work properly, and + to allow for multiple Altus Metrum software packages + to be installed in the same directory at the same + time. diff --git a/doc/release-notes-1.2.xsl b/doc/release-notes-1.2.xsl deleted file mode 100644 index f26480a1..00000000 --- a/doc/release-notes-1.2.xsl +++ /dev/null @@ -1,51 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.2 is a major release. It adds support for MicroPeak and - the MicroPeak USB adapter. - </para> - <para> - AltOS Firmware Changes - <itemizedlist> - <listitem> -<para> - Add MicroPeak support. This includes support for the ATtiny85 - processor and adaptations to the core code to allow for - devices too small to run the multi-tasking scheduler. - </para> -</listitem> - </itemizedlist> - </para> - <para> - MicroPeak UI changes - <itemizedlist> - <listitem> -<para> - Added this new application - </para> -</listitem> - </itemizedlist> - </para> - <para> - Distribution Changes - <itemizedlist> - <listitem> -<para> - Distribute Mac OS X packages in disk image ('.dmg') format to - greatly simplify installation. - </para> -</listitem> - <listitem> -<para> - Provide version numbers for the shared Java libraries to - ensure that upgrades work properly, and to allow for multiple - Altus Metrum software packages to be installed in the same - directory at the same time. - </para> -</listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.3-docinfo.xml b/doc/release-notes-1.3-docinfo.xml new file mode 100644 index 00000000..aa569df4 --- /dev/null +++ b/doc/release-notes-1.3-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>12 November 2013</date> +<copyright> + <year>2013</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.3.1-docinfo.xml b/doc/release-notes-1.3.1-docinfo.xml new file mode 100644 index 00000000..f67cf3b8 --- /dev/null +++ b/doc/release-notes-1.3.1-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>21 January 2014</date> +<copyright> + <year>2014</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.3.1.inc b/doc/release-notes-1.3.1.inc new file mode 100644 index 00000000..ff9c8e52 --- /dev/null +++ b/doc/release-notes-1.3.1.inc @@ -0,0 +1,55 @@ += Release Notes for Version 1.3.1 +:toc!: +:doctype: article + + Version 1.3.1 is a minor release. It improves support for + TeleMega, TeleMetrum v2.0, TeleMini v2.0 and EasyMini. + + == AltOS + + AltOS new features: + + * Improved APRS mode. Now uses compressed position + format for smaller data size, improved precision and + to include altitude data as well as latitude and + longitude. Also added battery and pyro voltage + reports in the APRS comment field so you can confirm + that the unit is ready for launch. + + AltOS fixes: + + * Improve sensor boot code. If sensors fail to + self-test, the device will still boot up and check + for pad/idle modes. If in idle mode, the device will + warn the user with a distinct beep, if in Pad mode, + the unit will operate as best it can. Also, the + Z-axis accelerometer now uses the factory + calibration values instead of re-calibrating on the + pad each time. This avoids accidental boost detect + when moving the device around while in Pad mode. + + * Fix antenna-down mode accelerometer + configuration. Antenna down mode wasn't working + because the accelerometer calibration values were + getting re-computed incorrectly in inverted mode. + + == AltosUI Application + + AltosUI new features: + + * Display additional TeleMega sensor values in real + units. Make all of these values available for + plotting. Display TeleMega orientation value in the + Ascent and Table tabs. + + + * Support additional TeleMega pyro channels in the + Fire Igniter dialog. This lets you do remote testing + of all of the channels, rather than just Apogee and + Main. + + AltosUI fixes: + + * Limit data rate when downloading satellite images + from Google to make sure we stay within their limits + so that all of the map tiles download successfully. diff --git a/doc/release-notes-1.3.1.xsl b/doc/release-notes-1.3.1.xsl deleted file mode 100644 index 1ccbfa10..00000000 --- a/doc/release-notes-1.3.1.xsl +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.3.1 is a minor release. It improves support for TeleMega, - TeleMetrum v2.0, TeleMini v2.0 and EasyMini. - </para> - <para> - AltOS Firmware Changes - <itemizedlist> - <listitem> - <para> - Improve sensor boot code. If sensors fail to self-test, the - device will still boot up and check for pad/idle modes. If - in idle mode, the device will warn the user with a distinct - beep, if in Pad mode, the unit will operate as best it - can. Also, the Z-axis accelerometer now uses the factory - calibration values instead of re-calibrating on the pad each - time. This avoids accidental boost detect when moving the - device around while in Pad mode. - </para> - </listitem> - <listitem> - <para> - Fix antenna-down mode accelerometer configuration. Antenna - down mode wasn't working because the accelerometer - calibration values were getting re-computed incorrectly in - inverted mode. - </para> - </listitem> - <listitem> - <para> - Improved APRS mode. Now uses compressed position format for - smaller data size, improved precision and to include - altitude data as well as latitude and longitude. Also added - battery and pyro voltage reports in the APRS comment field - so you can confirm that the unit is ready for launch. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI changes - <itemizedlist> - <listitem> - <para> - Display additional TeleMega sensor values in real - units. Make all of these values available for - plotting. Display TeleMega orientation value in the Ascent - and Table tabs. - </para> - </listitem> - <listitem> - <para> - Support additional TeleMega pyro channels in the Fire - Igniter dialog. This lets you do remote testing of all of - the channels, rather than just Apogee and Main. - </para> - </listitem> - <listitem> - <para> - Limit data rate when downloading satellite images from - Google to make sure we stay within their limits so that all - of the map tiles download successfully. - </para> - </listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.3.2-docinfo.xml b/doc/release-notes-1.3.2-docinfo.xml new file mode 100644 index 00000000..82b7677e --- /dev/null +++ b/doc/release-notes-1.3.2-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>24 January 2014</date> +<copyright> + <year>2014</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.3.2.inc b/doc/release-notes-1.3.2.inc new file mode 100644 index 00000000..dae5dd99 --- /dev/null +++ b/doc/release-notes-1.3.2.inc @@ -0,0 +1,37 @@ += Release Notes for Version 1.3.2 +:toc!: +:doctype: article + + Version 1.3.2 is a minor release. It includes small bug fixes for + the TeleMega flight software and AltosUI ground station + + == AltOS + + AltOS fixes: + + * On TeleMega, limit number of logged GPS status + information to 12 satellites. That's all there is + room for in the log structure. + + * Improve APRS behavior. Remembers last known GPS + position and keeps sending that if we lose GPS + lock. Marks locked/unlocked by sending L/U in the + APRS comment field along with the number of sats in + view and voltages. + + == AltosUI Application + + AltosUI fixes: + + * If the TeleMega flight firmware reports that it has + logged information about more than 12 satellites, + don't believe it as the log only holds 12 satellite + records. + + * Track the maximum height as computed from GPS + altitude data and report that in the flight summary + data. + + * Use letters (A, B, C, D) for alternate pyro channel + names instead of numbers (0, 1, 2, 3) in the Fire + Igniter dialog. diff --git a/doc/release-notes-1.3.2.xsl b/doc/release-notes-1.3.2.xsl deleted file mode 100644 index 279762c1..00000000 --- a/doc/release-notes-1.3.2.xsl +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.3.2 is a minor release. It includes small bug fixes for - the TeleMega flight software and AltosUI ground station - </para> - <para> - AltOS Firmware Changes - <itemizedlist> - <listitem> - <para> - On TeleMega, limit number of logged GPS status information - to 12 satellites. That's all there is room for in the log - structure. - </para> - </listitem> - <listitem> - <para> - Improve APRS behavior. Remembers last known GPS position and - keeps sending that if we lose GPS lock. Marks - locked/unlocked by sending L/U in the APRS comment field - along with the number of sats in view and voltages. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI changes - <itemizedlist> - <listitem> - <para> - If the TeleMega flight firmware reports that it has logged - information about more than 12 satellites, don't believe it - as the log only holds 12 satellite records. - </para> - </listitem> - <listitem> - <para> - Track the maximum height as computed from GPS altitude - data and report that in the flight summary data. - </para> - </listitem> - <listitem> - <para> - Use letters (A, B, C, D) for alternate pyro channel names - instead of numbers (0, 1, 2, 3) in the Fire Igniter dialog. - </para> - </listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.3.inc b/doc/release-notes-1.3.inc new file mode 100644 index 00000000..ceb677a1 --- /dev/null +++ b/doc/release-notes-1.3.inc @@ -0,0 +1,57 @@ += Release Notes for Version 1.3 +:toc!: +:doctype: article + + Version 1.3 is a major release. It adds support for TeleMega, + TeleMetrum v2.0, TeleMini v2.0 and EasyMini. + + == AltOS + + AltOS new features: + + * Add STM32L processor support. This includes + enhancements to the scheduler to support products + with many threads. + + * Add NXP LPC11U14 processor support. + + + * Support additional pyro channels. These are + configurable through the UI to handle air starts, + staging, additional recovery events and external + devices such as cameras. + + + * Add 3-axis gyro support for orientation + tracking. This integrates the gyros to compute the + angle from vertical during flight, allowing the + additional pyro events to be controlled by this + value. + + + * Many more device drivers, including u-Blox Max 7Q + GPS, Freescale MMA6555 digital single-axis + accelerometer, Invensense MPU6000 3-axis + accelerometer + 3 axis gyro, Honeywell HMC5883 + 3-axis magnetic sensor and the TI CC1120 and CC115L + digital FM transceivers + + == AltosUI Application + + AltosUI new features: + + * Support TeleMega, TeleMetrum v2.0, TeleMini v2.0 and + EasyMini telemetry and log formats. + + + AltosUI fixes: + + * Use preferred units for main deployment height + configuration, instead of always doing configuration in + meters. + == MicroPeak Application + + * Add 'Download' button to menu bar. + + * Save the last log directory and offer that as the + default for new downloads diff --git a/doc/release-notes-1.3.xsl b/doc/release-notes-1.3.xsl deleted file mode 100644 index 3bc4857f..00000000 --- a/doc/release-notes-1.3.xsl +++ /dev/null @@ -1,81 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.3 is a major release. It adds support for TeleMega, - TeleMetrum v2.0, TeleMini v2.0 and EasyMini. - </para> - <para> - AltOS Firmware Changes - <itemizedlist> - <listitem> - <para> - Add STM32L processor support. This includes enhancements to - the scheduler to support products with many threads. - </para> - </listitem> - <listitem> - <para> - Add NXP LPC11U14 processor support. - </para> - </listitem> - <listitem> - <para> - Support additional pyro channels. These are configurable - through the UI to handle air starts, staging, additional - recovery events and external devices such as cameras. - </para> - </listitem> - <listitem> - <para> - Add 3-axis gyro support for orientation tracking. This - integrates the gyros to compute the angle from vertical during - flight, allowing the additional pyro events to be controlled - by this value. - </para> - </listitem> - <listitem> - <para> - Many more device drivers, including u-Blox Max 7Q GPS, - Freescale MMA6555 digital single-axis accelerometer, - Invensense MPU6000 3-axis accelerometer + 3 axis gyro, - Honeywell HMC5883 3-axis magnetic sensor and the TI CC1120 and - CC115L digital FM transceivers - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI changes - <itemizedlist> - <listitem> - <para> - Support TeleMega, TeleMetrum v2.0, TeleMini v2.0 and EasyMini telemetry and log formats. - </para> - </listitem> - <listitem> - <para> - Use preferred units for main deployment height configuration, - instead of always doing configuration in meters. - </para> - </listitem> - </itemizedlist> - </para> - <para> - MicroPeak UI changes - <itemizedlist> - <listitem> - <para> - Add 'Download' button to menu bar. - </para> - </listitem> - <listitem> - <para> - Save the last log directory and offer that as the default for new downloads - </para> - </listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.4-docinfo.xml b/doc/release-notes-1.4-docinfo.xml new file mode 100644 index 00000000..12a38ce5 --- /dev/null +++ b/doc/release-notes-1.4-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>15 June 2014</date> +<copyright> + <year>2014</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.4.1-docinfo.xml b/doc/release-notes-1.4.1-docinfo.xml new file mode 100644 index 00000000..6224b16e --- /dev/null +++ b/doc/release-notes-1.4.1-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>20 June 2014</date> +<copyright> + <year>2014</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.4.1.inc b/doc/release-notes-1.4.1.inc new file mode 100644 index 00000000..5e3e831e --- /dev/null +++ b/doc/release-notes-1.4.1.inc @@ -0,0 +1,34 @@ += Release Notes for Version 1.4.1 +:toc!: +:doctype: article + + Version 1.4.1 is a minor release. It fixes install issues on + Windows and provides the missing TeleMetrum V2.0 firmware. There + aren't any changes to the firmware or host applications at + all. All Windows users will want to upgrade to get the signed + driver, but Mac and Linux users who do not need the TeleMetrum + V2.0 firmware image will not need to upgrade. + + == AltosUI and TeleGPS Applications: + + Windows Install Fixes + + * Provide signed Windows driver files. This should avoid any need to + disable driver signature checking on Windows 7 or 8. + + * Fix Java version detection and download. Previously, the + installer would only look for Java 6 or 7 and insist on + downloading its own Java bits if there was something else + installed. Furthermore, the 64-bit Java link provided didn't + work for anyone other than Keith, making it impossible to + install AltOS on any machine with Java SE 8 installed. + + Other Fixes + + * Include 1.4 firmware for TeleMetrum V2.0. None of the + installers shipped this file. Now it's included in the AltOS + packages for Linux, Mac and Windows. + + * Include Google Application Key for map downloading. The 1.4 + release didn't have this key in the released version of the + software, making map downloading fail for most people. diff --git a/doc/release-notes-1.4.1.xsl b/doc/release-notes-1.4.1.xsl deleted file mode 100644 index e6c82d60..00000000 --- a/doc/release-notes-1.4.1.xsl +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.4.1 is a minor release. It fixes install issues on - Windows and provides the missing TeleMetrum V2.0 firmware. There - aren't any changes to the firmware or host applications at - all. All Windows users will want to upgrade to get the signed - driver, but Mac and Linux users who do not need the TeleMetrum - V2.0 firmware image will not need to upgrade. - </para> - <para> - Windows Install Fixes - <itemizedlist> - <listitem> - <para> - Provide signed Windows driver files. This should avoid any need to - disable driver signature checking on Windows 7 or 8. - </para> - </listitem> - <listitem> - <para> - Fix Java version detection and download. Previously, the - installer would only look for Java 6 or 7 and insist on - downloading its own Java bits if there was something else - installed. Furthermore, the 64-bit Java link provided didn't - work for anyone other than Keith, making it impossible to - install AltOS on any machine with Java SE 8 installed. - </para> - </listitem> - </itemizedlist> - </para> - <para> - Other Fixes - <itemizedlist> - <listitem> - <para> - Include 1.4 firmware for TeleMetrum V2.0. None of the - installers shipped this file. Now it's included in the AltOS - packages for Linux, Mac and Windows. - </para> - </listitem> - <listitem> - <para> - Include Google Application Key for map downloading. The 1.4 - release didn't have this key in the released version of the - software, making map downloading fail for most people. - </para> - </listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.4.2-docinfo.xml b/doc/release-notes-1.4.2-docinfo.xml new file mode 100644 index 00000000..8fd94324 --- /dev/null +++ b/doc/release-notes-1.4.2-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>17 August 2014</date> +<copyright> + <year>2014</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.4.2.inc b/doc/release-notes-1.4.2.inc new file mode 100644 index 00000000..ded6b408 --- /dev/null +++ b/doc/release-notes-1.4.2.inc @@ -0,0 +1,15 @@ += Release Notes for Version 1.4.2 +:toc!: +:doctype: article + + Version 1.4.2 is a minor release. It fixes Java-related install issues on + Windows + + == AltosUI and TeleGPS Applications + + Windows Install Fixes + + * Checks for Java installation data in more registry locations. + + * Allows user to bypass Java installation in case the + detection fails. diff --git a/doc/release-notes-1.4.inc b/doc/release-notes-1.4.inc new file mode 100644 index 00000000..f4ab9ad2 --- /dev/null +++ b/doc/release-notes-1.4.inc @@ -0,0 +1,125 @@ += Release Notes for Version 1.4 +:toc!: +:doctype: article + + Version 1.4 is a major release. It includes support for our new + TeleGPS product, new features and bug fixes in in the flight + software for all our boards and the AltosUI ground station + + == AltOS + + AltOS new features: + + * Add support for TeleGPS boards. + + * Make the beeper tone configurable, making it + possible to distinguish between two Altus Metrum + products in the same ebay. + + * Make the firing time for extra pyro channels + configurable, allowing longer (or shorter) than the + default 50ms. Only relevant for TeleMega at this + time. + + AltOS fixes: + + * Replace the 'dit dit dit' tones at startup with the + current battery voltage, measured in tenths of a + volt. This lets you check the battery voltage + without needing telemetry, which is especially + useful on EasyMini. + + * Change state beeping to "Farnsworth spacing", which + means they're quite a bit faster than before, and so + they take less time to send. + + * Fix bug preventing the selection of the 'Flight + State After' mode in pyro configuration. + + * Fix bug where erasing flights would reset the flight + number to 2 on TeleMega and TeleMetrum v2. + + * Fix u-Blox GPS driver to mark course and speed data + as being present. + + == AltosUI Application + + AltosUI new features: + + * Add zooming and new content types (terrain and road + maps) to map view. Change map storage format from + PNG to Jpeg, which saves a huge amount of disk + space. You will need to re-download all of your + pre-loaded map images. + + * Add a distance measuring device to the maps + view. Select this by using any button other than the + left one, or by pressing shift or control on the + keyboard while using the left button. + + * Add new 'Ignitor' tab to the flight monitor display + for TeleMega's extra ignitors. + + * Add additional ignitor firing marks and voltages to + the graph so you can see when the ignitors fired, + along with the ignitor voltages. + + * Add GPS course, ground speed and climb rate as + optional graph elements. + + AltosUI fixes: + + * When flashing new firmware, re-try opening the + device as sometimes it takes a while for the + underlying operating system to recognize that the + device has rebooted in preparation for the flashing + operation. + + * Hide Tilt Angle in ascent tab for devices that don't + have a gyro. + + * Increase the width of data lines in the graphs to + make them easier to read. + + * Filter out speed and acceleration spikes caused by + ejection charge firing when computing the maximum + values. This provides a more accurate reading of + those maximums. + + * Fix EasyMini voltage displays. Early EasyMini + prototypes used a 3.0V regulator, and AltosUI still + used that value as the basis of the + computation. Production EasyMini boards have always + shipped with a 3.3V regulator. Also, purple EasyMini + boards sensed the battery voltage past the blocking + diode, resulting in a drop of about 150mV from the + true battery voltage. Compensate for that when + displaying the value. + + * Display error message when trying to configure + maximum flight log size while the flight computer + still has flight data stored. + + * Handle TeleMetrum and TeleMini eeprom files + generated with pre-1.0 firmware. Those ancient + versions didn't report the log format, so just use + the product name instead. + + == TeleGPS Application + + * New application designed for use with TeleGPS boards. + + * Shares code with AltosUI, mostly just trimmed down + to focus on TeleGPS-related functions. + + == Documentation + + Documentation changes: + + * Re-create the drill template images; they should + print correctly from Firefox at least. Ship these as + individual PDF files so they're easy to print. + + * Add a description of the 'Apogee Lockout' setting, + which prevents the apogee charge from firing for a + configurable amount of time after boost. diff --git a/doc/release-notes-1.4.xsl b/doc/release-notes-1.4.xsl deleted file mode 100644 index 2893f1aa..00000000 --- a/doc/release-notes-1.4.xsl +++ /dev/null @@ -1,204 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.4 is a major release. It includes support for our new - TeleGPS product, new features and bug fixes in in the flight - software for all our boards and the AltosUI ground station - </para> - <para> - AltOS New Features - <itemizedlist> - <listitem> - <para> - Add support for TeleGPS boards. - </para> - </listitem> - <listitem> - <para> - Replace the 'dit dit dit' tones at startup with the current - battery voltage, measured in tenths of a volt. This lets you - check the battery voltage without needing telemetry, which - is especially useful on EasyMini. - </para> - </listitem> - <listitem> - <para> - Change state beeping to "Farnsworth spacing", which means - they're quite a bit faster than before, and so they take - less time to send. - </para> - </listitem> - <listitem> - <para> - Make the beeper tone configurable, making it possible to - distinguish between two Altus Metrum products in the same ebay. - </para> - </listitem> - <listitem> - <para> - Make the firing time for extra pyro channels configurable, - allowing longer (or shorter) than the default 50ms. Only relevant - for TeleMega at this time. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltOS Fixes - <itemizedlist> - <listitem> - <para> - Fix bug preventing the selection of the 'Flight State After' - mode in pyro configuration. - </para> - </listitem> - <listitem> - <para> - Fix bug where erasing flights would reset the flight number - to 2 on TeleMega and TeleMetrum v2. - </para> - </listitem> - <listitem> - <para> - Fix u-Blox GPS driver to mark course and speed data as being - present. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI New Features - <itemizedlist> - <listitem> - <para> - Add zooming and new content types (terrain and road maps) to - map view. Change map storage format from PNG to Jpeg, which - saves a huge amount of disk space. You will need to - re-download all of your pre-loaded map images. - </para> - </listitem> - <listitem> - <para> - Add a distance measuring device to the maps view. Select - this by using any button other than the left one, or by - pressing shift or control on the keyboard while using the - left button. - </para> - </listitem> - <listitem> - <para> - Add new 'Ignitor' tab to the flight monitor display for - TeleMega's extra ignitors. - </para> - </listitem> - <listitem> - <para> - Increase the width of data lines in the graphs to make them - easier to read. - </para> - </listitem> - <listitem> - <para> - Add additional ignitor firing marks and voltages to the - graph so you can see when the ignitors fired, along with - the ignitor voltages. - </para> - </listitem> - <listitem> - <para> - Add GPS course, ground speed and climb rate as optional - graph elements. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI Fixes - <itemizedlist> - <listitem> - <para> - When flashing new firmware, re-try opening the device as - sometimes it takes a while for the underlying operating - system to recognize that the device has rebooted in - preparation for the flashing operation. - </para> - </listitem> - <listitem> - <para> - Hide Tilt Angle in ascent tab for devices that don't have a gyro. - </para> - </listitem> - <listitem> - <para> - Filter out speed and acceleration spikes caused by ejection - charge firing when computing the maximum values. This - provides a more accurate reading of those maximums. - </para> - </listitem> - <listitem> - <para> - Fix EasyMini voltage displays. Early EasyMini prototypes - used a 3.0V regulator, and AltosUI still used that value as - the basis of the computation. Production EasyMini boards - have always shipped with a 3.3V regulator. Also, purple - EasyMini boards sensed the battery voltage past the blocking - diode, resulting in a drop of about 150mV from the true - battery voltage. Compensate for that when displaying the - value. - </para> - </listitem> - <listitem> - <para> - Display error message when trying to configure maximum - flight log size while the flight computer still has flight - data stored. - </para> - </listitem> - <listitem> - <para> - Handle TeleMetrum and TeleMini eeprom files generated with - pre-1.0 firmware. Those ancient versions didn't report the - log format, so just use the product name instead. - </para> - </listitem> - </itemizedlist> - </para> - <para> - TeleGPS Application - <itemizedlist> - <listitem> - <para> - New application designed for use with TeleGPS boards. - </para> - </listitem> - <listitem> - <para> - Shares code with AltosUI, mostly just trimmed down to focus - on TeleGPS-related functions. - </para> - </listitem> - </itemizedlist> - </para> - <para> - Documentation changes - <itemizedlist> - <listitem> - <para> - Re-create the drill template images; they should print - correctly from Firefox at least. Ship these as individual - PDF files so they're easy to print. - </para> - </listitem> - <listitem> - <para> - Add a description of the 'Apogee Lockout' setting, which - prevents the apogee charge from firing for a configurable - amount of time after boost. - </para> - </listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.5-docinfo.xml b/doc/release-notes-1.5-docinfo.xml new file mode 100644 index 00000000..0c0cace7 --- /dev/null +++ b/doc/release-notes-1.5-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>6 September 2014</date> +<copyright> + <year>2014</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.5.inc b/doc/release-notes-1.5.inc new file mode 100644 index 00000000..8d72c0e0 --- /dev/null +++ b/doc/release-notes-1.5.inc @@ -0,0 +1,69 @@ += Release Notes for Version 1.5 +:toc!: + + Version 1.5 is a major release. It includes support for our new + EasyMega product, new features and bug fixes in in the flight + software for all our boards and the AltosUI ground station + + == AltOS + + AltOS New Features + + * Add support for EasyMega boards. + + * Make the APRS SSID be configurable. This lets you track + different rockets on the same receiver without getting + things mixed up. + + * Report extra pyro channel continuity state on EasyMega and + TeleMega via the beeper. This lets you easily verify flight + readiness on these boards after powering up the electronics + on the rail. + + * Add lower telemetry data rates (2400 and 9600 bps) to + increase telemetry radio range. This reduces the amount of + data received as well as increasing battery consumption in + the transmitter. + + * Change TeleGPS to have only a single log, and append new + data to it rather than using seperate per-flight logs. This + avoids accidentally filling up log storage by turning + TeleGPS on/off several times. + + AltOS Fixes + + * Increase the maximum range for altitude values from +/-32767m + to +/-2147483647m, allowing the flight computers to function + correctly above the 32km level. + + * Continuously test pyro firing conditions during delay stage, + inhibiting the pyro channel if the test fails. This prevents + firing pyro charges where the conditions were good before + the delay, but become bad before the delay expires. + + * Allow negative numbers in pyro configuration values. This + lets you specify things like descending speed or + deceleration. + + == AltosUI and TeleGPS Applications + + AltosUI and TeleGPS New Features + + * Support telemetry baud rate selection. Adds menus to + the flight monitoring and configuration for baud rate + selection. + + * Support APRS SSID configuration. + + * Integrate with file managers. This provides icons for all of + our file types and associates our application with the files + so that using a file manager to open a AltOS data file + results in launching our application. + + AltosUI Fixes + + * Make the 'Graph' button on the landed tab work again. + + * Make tests for Java on Windows a bit smarter, and also + provide the user with the option to skip installing Java for + cases where we just can't figure out what version is installed. diff --git a/doc/release-notes-1.5.xsl b/doc/release-notes-1.5.xsl deleted file mode 100644 index 50d83f77..00000000 --- a/doc/release-notes-1.5.xsl +++ /dev/null @@ -1,121 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.5 is a major release. It includes support for our new - EasyMega product, new features and bug fixes in in the flight - software for all our boards and the AltosUI ground station - </para> - <para> - AltOS New Features - <itemizedlist> - <listitem> - <para> - Add support for EasyMega boards. - </para> - </listitem> - <listitem> - <para> - Make the APRS SSID be configurable. This lets you track - different rockets on the same receiver without getting - things mixed up. - </para> - </listitem> - <listitem> - <para> - Report extra pyro channel continuity state on EasyMega and - TeleMega via the beeper. This lets you easily verify flight - readiness on these boards after powering up the electronics - on the rail. - </para> - </listitem> - <listitem> - <para> - Add lower telemetry data rates (2400 and 9600 bps) to - increase telemetry radio range. This reduces the amount of - data received as well as increasing battery consumption in - the transmitter. - </para> - </listitem> - <listitem> - <para> - Change TeleGPS to have only a single log, and append new - data to it rather than using seperate per-flight logs. This - avoids accidentally filling up log storage by turning - TeleGPS on/off several times. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltOS Fixes - <itemizedlist> - <listitem> - <para> - Increase the maximum range for altitude values from +/-32767m - to +/-2147483647m, allowing the flight computers to function - correctly above the 32km level. - </para> - </listitem> - <listitem> - <para> - Continuously test pyro firing conditions during delay stage, - inhibiting the pyro channel if the test fails. This prevents - firing pyro charges where the conditions were good before - the delay, but become bad before the delay expires. - </para> - </listitem> - <listitem> - <para> - Allow negative numbers in pyro configuration values. This - lets you specify things like descending speed or - deceleration. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI and TeleGPS New Features - <itemizedlist> - <listitem> - <para> - Support telemetry baud rate selection. Adds menus to - the flight monitoring and configuration for baud rate - selection. - </para> - </listitem> - <listitem> - <para> - Support APRS SSID configuration. - </para> - </listitem> - <listitem> - <para> - Integrate with file managers. This provides icons for all of - our file types and associates our application with the files - so that using a file manager to open a AltOS data file - results in launching our application. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI Fixes - <itemizedlist> - <listitem> - <para> - Make the 'Graph' button on the landed tab work again. - </para> - </listitem> - <listitem> - <para> - Make tests for Java on Windows a bit smarter, and also - provide the user with the option to skip installing Java for - cases where we just can't figure out what version is installed. - </para> - </listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.6-docinfo.xml b/doc/release-notes-1.6-docinfo.xml new file mode 100644 index 00000000..5ae58bb5 --- /dev/null +++ b/doc/release-notes-1.6-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>8 January 2015</date> +<copyright> + <year>2015</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.6.1-docinfo.xml b/doc/release-notes-1.6.1-docinfo.xml new file mode 100644 index 00000000..dc0a2d67 --- /dev/null +++ b/doc/release-notes-1.6.1-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>15 July 2015</date> +<copyright> + <year>2015</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.6.1.inc b/doc/release-notes-1.6.1.inc new file mode 100644 index 00000000..1e03ed4f --- /dev/null +++ b/doc/release-notes-1.6.1.inc @@ -0,0 +1,101 @@ += Release Notes for Version 1.6.1 +:toc!: +:doctype: article + + Version 1.6.1 includes support for our updated TeleBT v3.0 + product and bug fixes in in the flight software for all our boards + and ground station interfaces. + + == AltOS + + AltOS New Features: + + * Add support for TeleBT v3.0 boards. + + * Add support for uncompressed APRS data, providing support + for older APRS receivers. Uncompressed APRS data is less + precise, takes more bandwidth and doesn't have integrated + altitude data. + + AltOS Fixes: + + * Make TeleDongle and TeleBT more tolerant of data rate + variations from transmitting devices. + + == AltosUI and TeleGPS Applications + + AltosUI and TeleGPS New Features: + + * Add map to Monitor Idle display. It's nice to be able to + verify that maps are working, instead of needing to use + Monitor Flight. + + AltosUI and TeleGPS Fixes: + + * Fix frequency configuration to round values instead of + truncate them, avoiding a common 1kHz error in the setting. + + * Turn the Windows stub into a more useful program that can + launch the application with parameters so that file manager + icons work more reliably. + + * Force KML export to use a C locale so that numbers are + formatted with '.' instead of ',' for a decimal separator in + non-US locales. + + * Preload map tiles based on distance rather than number of + tiles; this means you get the same resolution covering the + entire area, rather than having high resolution near the + center and low resolution further away. + + * Allow configuration of frequency and callsign in Monitor + Idle mode. + + * Fix layout weirdness when resizing windows on + Windows. Windows shouldn't have giant blank spaces around + the useful content anymore. + + * Fix layout weirdness when resizing windows on + Windows. Windows shouldn't have giant blank spaces around + the useful content anymore. + + * Use a longer filter for descent speed values. This should + provide something more useful on the display, although it + will take longer to respond to changes now. + + * Make Replay Flight run in realtime again. It had been set to + run at 10x speed by mistake. + + == AltosDroid + + AltosDroid New Features: + + * Add offline map support using mapping code from AltosUI. + + * Support TeleDongle (and TeleBT via USB) on devices + supporting USB On-The-Go. + + * Display additional TeleMega pyro channel status in Pad tab. + + * Switch between metric and imperial units. + + * Monitor TeleBT battery voltage. + + * Track multiple devices at the same time, selecting between + them with a menu or using the map. + + * Add hybrid, satellite and terrain map types. + + AltosDroid Fixes: + + * Use standard Android display conventions so that a menu + button is available in the application title bar. + + * Adjust layout to work on large and small screens; shrinking + the go/no-go lights in smaller environments to try and make + everything visible. + + * Make voice announcements depend on current tab. + + * Compute adjustment to current travel direction while in + motion towards rocket. diff --git a/doc/release-notes-1.6.1.xsl b/doc/release-notes-1.6.1.xsl deleted file mode 100644 index 058d43fe..00000000 --- a/doc/release-notes-1.6.1.xsl +++ /dev/null @@ -1,189 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.6.1 includes support for our updated TeleBT v3.0 - product and bug fixes in in the flight software for all our boards - and ground station interfaces. - </para> - <para> - AltOS New Features - <itemizedlist> - <listitem> - <para> - Add support for TeleBT v3.0 boards. - </para> - </listitem> - <listitem> - <para> - Add support for uncompressed APRS data, providing support - for older APRS receivers. Uncompressed APRS data is less - precise, takes more bandwidth and doesn't have integrated - altitude data. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltOS Fixes - <itemizedlist> - <listitem> - <para> - Make TeleDongle and TeleBT more tolerant of data rate - variations from transmitting devices. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI and TeleGPS New Features - <itemizedlist> - <listitem> - <para> - Add map to Monitor Idle display. It's nice to be able to - verify that maps are working, instead of needing to use - Monitor Flight. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI Fixes - <itemizedlist> - <listitem> - <para> - Fix frequency configuration to round values instead of - truncate them, avoiding a common 1kHz error in the setting. - </para> - </listitem> - <listitem> - <para> - Turn the Windows stub into a more useful program that can - launch the application with parameters so that file manager - icons work more reliably. - </para> - </listitem> - <listitem> - <para> - Force KML export to use a C locale so that numbers are - formatted with '.' instead of ',' for a decimal separator in - non-US locales. - </para> - </listitem> - <listitem> - <para> - Preload map tiles based on distance rather than number of - tiles; this means you get the same resolution covering the - entire area, rather than having high resolution near the - center and low resolution further away. - </para> - </listitem> - <listitem> - <para> - Allow configuration of frequency and callsign in Monitor - Idle mode. - </para> - </listitem> - <listitem> - <para> - Fix layout weirdness when resizing windows on - Windows. Windows shouldn't have giant blank spaces around - the useful content anymore. - </para> - </listitem> - <listitem> - <para> - Fix layout weirdness when resizing windows on - Windows. Windows shouldn't have giant blank spaces around - the useful content anymore. - </para> - </listitem> - <listitem> - <para> - Use a longer filter for descent speed values. This should - provide something more useful on the display, although it - will take longer to respond to changes now. - </para> - </listitem> - <listitem> - <para> - Make Replay Flight run in realtime again. It had been set to - run at 10x speed by mistake. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosDroid New Features - <itemizedlist> - <listitem> - <para> - Add offline map support using mapping code from AltosUI. - </para> - </listitem> - <listitem> - <para> - Support TeleDongle (and TeleBT via USB) on devices - supporting USB On-The-Go. - </para> - </listitem> - <listitem> - <para> - Display additional TeleMega pyro channel status in Pad tab. - </para> - </listitem> - <listitem> - <para> - Switch between metric and imperial units. - </para> - </listitem> - <listitem> - <para> - Monitor TeleBT battery voltage. - </para> - </listitem> - <listitem> - <para> - Track multiple devices at the same time, selecting between - them with a menu or using the map. - </para> - </listitem> - <listitem> - <para> - Add hybrid, satellite and terrain map types. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosDroid Fixes - <itemizedlist> - <listitem> - <para> - Use standard Android display conventions so that a menu - button is available in the application title bar. - </para> - </listitem> - <listitem> - <para> - Adjust layout to work on large and small screens; shrinking - the go/no-go lights in smaller environments to try and make - everything visible. - </para> - </listitem> - <listitem> - <para> - Make voice announcements depend on current tab. - </para> - </listitem> - <listitem> - <para> - Compute adjustment to current travel direction while in - motion towards rocket. - </para> - </listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-1.6.2-docinfo.xml b/doc/release-notes-1.6.2-docinfo.xml new file mode 100644 index 00000000..78206e2a --- /dev/null +++ b/doc/release-notes-1.6.2-docinfo.xml @@ -0,0 +1,29 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>10 January 2016</date> +<copyright> + <year>2016</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="altusmetrum-oneline.svg" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes-1.6.2.inc b/doc/release-notes-1.6.2.inc new file mode 100644 index 00000000..990eb48f --- /dev/null +++ b/doc/release-notes-1.6.2.inc @@ -0,0 +1,46 @@ += Release Notes for Version 1.6.2 +:toc!: +:doctype: article + + Version 1.6.2 includes support for our updated TeleMega v2.0 + product and bug fixes in in the flight software for all our boards + and ground station interfaces. + + == AltOS + + AltOS New Features: + + * Add support for TeleMega v2.0 boards. + + * Add PWM servo driver. There's no higher level code using + this yet, but the driver allows testing of the TeleMega v2.0 + servo output connector. + + AltOS Fixes: + + * Slow down telemetry packets to allow receiver to keep + up. + + == AltosUI and TeleGPS Applications + + AltosUI and TeleGPS Fixes: + + * Fix post-flight orientation computation when processing + TeleMega and EasyMega eeprom data files. + + * Capture complete eeprom data even when there are invalid + entries in the data. This keeps reading eeprom contents and + writing the associated .eeprom file when an error is detected. + + == Documentation + + We spent a bunch of time trying to improve our documentation + + * HTML versions now have a table of contents on the left side. + + * EasyMini now has its own shorter manual. + + * Provide links between sections in each document. + + * Lots of minor rewriting and restructuring to avoid + duplication of information diff --git a/doc/release-notes-1.6.inc b/doc/release-notes-1.6.inc new file mode 100644 index 00000000..0908dfaf --- /dev/null +++ b/doc/release-notes-1.6.inc @@ -0,0 +1,85 @@ += Release Notes for Version 1.6 +:toc!: +:doctype: article + + Version 1.6 includes support for our updated TeleDongle v3.0 + product and bug fixes in in the flight software for all our boards + and ground station interfaces. + + == AltOS + + AltOS New Features + + * Add support for TeleDongle v3.0 boards. + + AltOS Fixes + + * Don't beep out the continuity twice by accident in idle mode. + If the battery voltage report takes longer than the initialiation + sequence, the igniter continuity would get reported twice. + + * Record all 32 bits of gyro calibration data in TeleMega and + EasyMega log files. This fixes computation of the gyro rates + in AltosUI. + + * Change TeleDongle LED usage. Green LED flashes when valid + packet is received. Red LED flashes when invalid packet is + received. + + * Replace LPC11U14 SPI driver with non-interrupt version. The + interrupt code would occasionally wedge on long transfers + if interrupts were blocked for too long. This affects all + released TeleGPS products; if you have a TeleGPS device, + you'll want to reflash the firmware. + + == AltosUI and TeleGPS Applications + + AltosUI and TeleGPS New Features + + * Compute tilt angle from TeleMega and EasyMega log + files. This duplicates the quaternion-based angle tracking + code from the flight firmware inside the ground station + software so that post-flight analysis can include evaluation + of the tilt angle. + + * Shows the tool button window when starting with a data file + specified. This means that opening a data file from the file + manager will now bring up the main window to let you operate + the whole application. + + AltosUI Fixes + + * Show the 'Connecting' dialog when using Monitor Idle. Lets + you cancel the Monitor Idle startup when connecting over the + radio link. + + * Make 'Monitor Idle' work for TeleGPS devices when connected + over USB. It's nice for testing without needing to broadcast + over the radio. + + * Use different Windows API to discover USB devices. This + works better on my Windows 7 box, and will be used if the + older API fails to provide the necessary information. + + * Look in more places in the registry to try and identify the + installed Java version on Windows. If you install the + default 32-bit version of Windows on a 64-bit OS, the Java + registry information is hiding \SOFTWARE\Wow6432Node for + some reason. + + * Fix file association on Windows by searching for the + javaw.exe program instead of assuming it is in + %SYSTEMROOT%. This makes double-clicking on Altus Metrum + data files in the file manager work correctly. + + * When replaying a file, put 'done' in the Age field when we + reach the end of the file, instead of continuing to count forever. + + * In the Scan Channels code, wait for five seconds if we see + any packet. This is needed because AltOS now sends the + callsign, serial number and flight number only once every + five seconds these days. + + * In the Scan Channels code, reset pending flight state + information each time we change channels. This avoids having + flight computers appear on multiple frequencies by accident. diff --git a/doc/release-notes-1.6.xsl b/doc/release-notes-1.6.xsl deleted file mode 100644 index 604fe096..00000000 --- a/doc/release-notes-1.6.xsl +++ /dev/null @@ -1,142 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <para> - Version 1.6 includes support for our updated TeleDongle v3.0 - product and bug fixes in in the flight software for all our boards - and ground station interfaces. - </para> - <para> - AltOS New Features - <itemizedlist> - <listitem> - <para> - Add support for TeleDongle v3.0 boards. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltOS Fixes - <itemizedlist> - <listitem> - <para> - Don't beep out the continuity twice by accident in idle mode. - If the battery voltage report takes longer than the initialiation - sequence, the igniter continuity would get reported twice. - </para> - </listitem> - <listitem> - <para> - Record all 32 bits of gyro calibration data in TeleMega and - EasyMega log files. This fixes computation of the gyro rates - in AltosUI. - </para> - </listitem> - <listitem> - <para> - Change TeleDongle LED usage. Green LED flashes when valid - packet is received. Red LED flashes when invalid packet is - received. - </para> - </listitem> - <listitem> - <para> - Replace LPC11U14 SPI driver with non-interrupt version. The - interrupt code would occasionally wedge on long transfers - if interrupts were blocked for too long. This affects all - released TeleGPS products; if you have a TeleGPS device, - you'll want to reflash the firmware. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI and TeleGPS New Features - <itemizedlist> - <listitem> - <para> - Compute tilt angle from TeleMega and EasyMega log - files. This duplicates the quaternion-based angle tracking - code from the flight firmware inside the ground station - software so that post-flight analysis can include evaluation - of the tilt angle. - </para> - </listitem> - <listitem> - <para> - Shows the tool button window when starting with a data file - specified. This means that opening a data file from the file - manager will now bring up the main window to let you operate - the whole application. - </para> - </listitem> - </itemizedlist> - </para> - <para> - AltosUI Fixes - <itemizedlist> - <listitem> - <para> - Show the 'Connecting' dialog when using Monitor Idle. Lets - you cancel the Monitor Idle startup when connecting over the - radio link. - </para> - </listitem> - <listitem> - <para> - Make 'Monitor Idle' work for TeleGPS devices when connected - over USB. It's nice for testing without needing to broadcast - over the radio. - </para> - </listitem> - <listitem> - <para> - Use different Windows API to discover USB devices. This - works better on my Windows 7 box, and will be used if the - older API fails to provide the necessary information. - </para> - </listitem> - <listitem> - <para> - Look in more places in the registry to try and identify the - installed Java version on Windows. If you install the - default 32-bit version of Windows on a 64-bit OS, the Java - registry information is hiding \SOFTWARE\Wow6432Node for - some reason. - </para> - </listitem> - <listitem> - <para> - Fix file association on Windows by searching for the - javaw.exe program instead of assuming it is in - %SYSTEMROOT%. This makes double-clicking on Altus Metrum - data files in the file manager work correctly. - </para> - </listitem> - <listitem> - <para> - When replaying a file, put 'done' in the Age field when we - reach the end of the file, instead of continuing to count forever. - </para> - </listitem> - <listitem> - <para> - In the Scan Channels code, wait for five seconds if we see - any packet. This is needed because AltOS now sends the - callsign, serial number and flight number only once every - five seconds these days. - </para> - </listitem> - <listitem> - <para> - In the Scan Channels code, reset pending flight state - information each time we change channels. This avoids having - flight computers appear on multiple frequencies by accident. - </para> - </listitem> - </itemizedlist> - </para> -</article> diff --git a/doc/release-notes-docinfo.xml b/doc/release-notes-docinfo.xml new file mode 100644 index 00000000..4f842cde --- /dev/null +++ b/doc/release-notes-docinfo.xml @@ -0,0 +1,28 @@ +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<copyright> + <year>2015</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="../themes/background.png" width="6.0in"/> + </imageobject> +</mediaobject> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> diff --git a/doc/release-notes.inc b/doc/release-notes.inc new file mode 100644 index 00000000..a6240d43 --- /dev/null +++ b/doc/release-notes.inc @@ -0,0 +1,79 @@ +[appendix] +== Release Notes + + :leveloffset: 2 + include::release-notes-1.6.2.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.6.1.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.6.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.5.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.4.2.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.4.1.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.4.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.3.2.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.3.1.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.3.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.2.1.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.2.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.1.1.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.1.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.0.1.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-0.9.2.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-0.9.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-0.8.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-0.7.1.raw[] + + :leveloffset: 0 diff --git a/doc/specs.inc b/doc/specs.inc new file mode 100644 index 00000000..a6c7b69a --- /dev/null +++ b/doc/specs.inc @@ -0,0 +1,155 @@ +[appendix] +== Altus Metrum Hardware Specifications + + Here's the full set of Altus Metrum products, both in + production and retired. + + .Altus Metrum Flight Computer Electronics + [options="header"] + |================================ + |Device | Barometer | Z-axis accel | GPS | 3D sensors | Storage | RF Output | Battery + + ifdef::telemetrum[] + |TeleMetrum v1.0 + |MP3H6115 10km (33k') + |MMA2202 50g + |SkyTraq + |- + |1MB + |10mW + |3.7V + + |TeleMetrum v1.1 + |MP3H6115 10km (33k') + |MMA2202 50g + |SkyTraq + |- + |2MB + |10mW + |3.7V + + |TeleMetrum v1.2 + |MP3H6115 10km (33k') + |ADXL78 70g + |SkyTraq + |- + |2MB + |10mW + |3.7V + + |TeleMetrum v2.0 + |MS5607 30km (100k') + |MMA6555 102g + |uBlox Max-7Q + |- + |8MB + |40mW + |3.7V + endif::telemetrum[] + + ifdef::telemini[] + |TeleMini v1.0 + |MP3H6115 10km (33k') + |- + |- + |- + |5kB + |10mW + |3.7V + + endif::telemini[] + + ifdef::easymini[] + |EasyMini v1.0 + |MS5607 30km (100k') + |- + |- + |- + |1MB + |- + |3.7-12V + endif::easymini[] + + ifdef::telemega[] + |TeleMega v1.0 + |MS5607 30km (100k') + |MMA6555 102g + |uBlox Max-7Q + |MPU6000 HMC5883 + |8MB + |40mW + |3.7V + endif::telemega[] + + ifdef::easymega[] + |EasyMega v1.0 + |MS5607 30km (100k') + |MMA6555 102g + |- + |MPU6000 HMC5883 + |8MB + |- + |3.7V + endif::easymega[] + + |============================== + + <<<< + .Altus Metrum Flight Computer Mechanical Components + [options="header",grid="all"] + |============================== + |Device|Connectors|Screw Terminals|Width|Length|Tube Size + + ifdef::telemetrum[] + |TeleMetrum + |Antenna Debug Companion USB Battery + |Apogee pyro Main pyro Switch + |1 inch (2.54cm) + |2 ¾ inch (6.99cm) + |29mm coupler + endif::telemetrum[] + + ifdef::telemini[] + |TeleMini v1.0 + |Antenna Debug Battery + |Apogee pyro Main pyro + |½ inch (1.27cm) + |1½ inch (3.81cm) + |18mm coupler + + |TeleMini v2.0 + |Antenna Debug USB Battery + |Apogee pyro Main pyro Battery Switch + |0.8 inch (2.03cm) + |1½ inch (3.81cm) + |24mm coupler + endif::telemini[] + + ifdef::easymini[] + |EasyMini + |Debug USB Battery + |Apogee pyro Main pyro Battery + |0.8 inch (2.03cm) + |1½ inch (3.81cm) + |24mm coupler + endif::easymini[] + + ifdef::telemega[] + |TeleMega + |Antenna Debug Companion USB Battery + |Apogee pyro Main pyro Pyro A-D Switch Pyro battery + |1¼ inch (3.18cm) + |3¼ inch (8.26cm) + |38mm coupler + endif::telemega[] + + ifdef::easymega[] + |EasyMega + |Debug Companion USB Battery + |Apogee pyro Main pyro Pyro A-D Switch Pyro battery + |1¼ inch (3.18cm) + |2¼ inch (5.62cm) + |38mm coupler + endif::easymega[] + + |==================================== diff --git a/doc/system-operation.inc b/doc/system-operation.inc new file mode 100644 index 00000000..e68b2acb --- /dev/null +++ b/doc/system-operation.inc @@ -0,0 +1,307 @@ +[appendix] +== System Operation + + === Firmware Modes + + The AltOS firmware build for the altimeters has two + fundamental modes, “idle” and “flight”. Which of these modes + the firmware operates in is determined at start up + time. + ifdef::telemetrum,telemega,easymega[] + For + TeleMetrum, TeleMega and EasyMega, which have accelerometers, the mode is + controlled by the orientation of the + rocket (well, actually the board, of course...) at the time + power is switched on. If the rocket is “nose up”, then + the flight computer assumes it's on a rail or rod being prepared for + launch, so the firmware chooses flight mode. However, if the + rocket is more or less horizontal, the firmware instead enters + idle mode. + endif::telemetrum,telemega,easymega[] + Since + EasyMini doesn't + have an + accelerometer we can use to determine orientation, “idle” mode + is selected if the board is connected via USB to a computer, + otherwise the board enters “flight” mode. + ifdef::telemini[] + TeleMini v1.0 + selects “idle” mode if it receives a command packet within the + first five seconds of operation. + endif::telemini[] + + At power on, the altimeter will beep out the battery voltage + to the nearest tenth of a volt. Each digit is represented by + a sequence of short “dit” beeps, with a pause between + digits. A zero digit is represented with one long “dah” + beep. Then there will be a short pause while the altimeter + completes initialization and self test, and decides which mode + to enter next. + + In flight or “pad” mode, the altimeter engages the flight + state machine, goes into transmit-only mode to send telemetry, + and waits for launch to be detected. Flight mode is indicated + by an “di-dah-dah-dit” (“P” for pad) on the beeper or lights, + followed by beeps or flashes indicating the state of the + pyrotechnic igniter continuity. One beep/flash indicates + apogee continuity, two beeps/flashes indicate main continuity, + three beeps/flashes indicate both apogee and main continuity, + and one longer “brap” sound which is made by rapidly + alternating between two tones indicates no continuity. For a + dual deploy flight, make sure you're getting three beeps or + flashes before launching! For apogee-only or motor eject + flights, do what makes sense. + + If idle mode is entered, you will hear an audible “di-dit” or + see two short flashes (“I” for idle), and the flight state + machine is disengaged, thus no ejection charges will fire. + ifdef::radio[] + The altimeters also listen for the radio link when in idle + mode for requests sent via TeleDongle. Commands can be issued + in idle mode over either USB or the radio link + equivalently. + ifdef::telemini[TeleMini v1.0 only has the radio link.] + endif::radio[] + Idle mode is useful for configuring the altimeter, for + extracting data from the on-board storage chip after + flight, and for ground testing pyro charges. + + In “Idle” and “Pad” modes, once the mode indication + beeps/flashes and continuity indication has been sent, if + there is no space available to log the flight in on-board + memory, the flight computer will emit a warbling tone (much + slower than the “no continuity tone”) + + See <<_understanding_beeps>> for a summary of all of + the audio signals used. + + Once landed, the flight computer will signal that by emitting + the “Landed” sound described above, after which it will beep + out the apogee height (in meters). Each digit is represented + by a sequence of short “dit” beeps, with a pause between + digits. A zero digit is represented with one long “dah” + beep. The flight computer will continue to report landed mode + and beep out the maximum height until turned off. + + ifdef::telemetrum,telemega,easymega[] + One “neat trick” of particular value when TeleMetrum, TeleMega + or EasyMega are used with + very large air-frames, is that you can power the board up while the + rocket is horizontal, such that it comes up in idle mode. Then you can + raise the air-frame to launch position, and issue a 'reset' command + via TeleDongle over the radio link to cause the altimeter to reboot and + come up in flight mode. This is much safer than standing on the top + step of a rickety step-ladder or hanging off the side of a launch + tower with a screw-driver trying to turn on your avionics before + installing igniters! + endif::telemetrum,telemega,easymega[] + + ifdef::telemini[] + TeleMini v1.0 is configured solely via the radio link. Of course, that + means you need to know the TeleMini radio configuration values + or you won't be able to communicate with it. For situations + when you don't have the radio configuration values, TeleMini v1.0 + offers an 'emergency recovery' mode. In this mode, TeleMini is + configured as follows: + + + * Sets the radio frequency to 434.550MHz + * Sets the radio calibration back to the factory value. + * Sets the callsign to N0CALL + * Does not go to 'pad' mode after five seconds. + + To get into 'emergency recovery' mode, first find the row of + four small holes opposite the switch wiring. Using a short + piece of small gauge wire, connect the outer two holes + together, then power TeleMini up. Once the red LED is lit, + disconnect the wire and the board should signal that it's in + 'idle' mode after the initial five second startup + period. + endif::telemini[] + + ifdef::gps[] + === GPS + + TeleMetrum and TeleMega include a complete GPS receiver. A + complete explanation of how GPS works is beyond the scope of + this manual, but the bottom line is that the GPS receiver + needs to lock onto at least four satellites to obtain a solid + 3 dimensional position fix and know what time it is. + + The flight computers provide backup power to the GPS chip any time a + battery is connected. This allows the receiver to “warm start” on + the launch rail much faster than if every power-on were a GPS + “cold start”. In typical operations, powering up + on the flight line in idle mode while performing final air-frame + preparation will be sufficient to allow the GPS receiver to cold + start and acquire lock. Then the board can be powered down during + RSO review and installation on a launch rod or rail. When the board + is turned back on, the GPS system should lock very quickly, typically + long before igniter installation and return to the flight line are + complete. + endif::gps[] + + ifdef::radio[] + === Controlling An Altimeter Over The Radio Link + + One of the unique features of the Altus Metrum system is the + ability to create a two way command link between TeleDongle + and an altimeter using the digital radio transceivers + built into each device. This allows you to interact with the + altimeter from afar, as if it were directly connected to the + computer. + + Any operation which can be performed with a flight computer can + either be done with the device directly connected to the + computer via the USB cable, or through the radio + link. TeleMini v1.0 doesn't provide a USB connector and so it is + always communicated with over radio. Select the appropriate + TeleDongle device when the list of devices is presented and + AltosUI will interact with an altimeter over the radio link. + + One oddity in the current interface is how AltosUI selects the + frequency for radio communications. Instead of providing + an interface to specifically configure the frequency, it uses + whatever frequency was most recently selected for the target + TeleDongle device in Monitor Flight mode. If you haven't ever + used that mode with the TeleDongle in question, select the + Monitor Flight button from the top level UI, and pick the + appropriate TeleDongle device. Once the flight monitoring + window is open, select the desired frequency and then close it + down again. All radio communications will now use that frequency. + + * Save Flight Data—Recover flight data from the + rocket without opening it up. + + * Configure altimeter apogee delays, main deploy + heights and additional pyro event conditions to + respond to changing launch conditions. You can also + 'reboot' the altimeter. Use this to remotely enable + the flight computer by turning TeleMetrum or + TeleMega on in “idle” mode, then once the air-frame + is oriented for launch, you can reboot the + altimeter and have it restart in pad mode without + having to climb the scary ladder. + + * Fire Igniters—Test your deployment charges without snaking + wires out through holes in the air-frame. Simply assemble the + rocket as if for flight with the apogee and main charges + loaded, then remotely command the altimeter to fire the + igniters. + + Operation over the radio link for configuring an + altimeter, ground testing igniters, and so forth uses + the same RF frequencies as flight telemetry. To + configure the desired TeleDongle frequency, select the + monitor flight tab, then use the frequency selector + and close the window before performing other desired + radio operations. + + The flight computers only enable radio commanding in + 'idle' mode. TeleMetrum and TeleMega use the + accelerometer to detect which orientation they start + up in, so make sure you have the flight computer lying + horizontally when you turn it on. Otherwise, it will + start in 'pad' mode ready for flight, and will not be + listening for command packets from TeleDongle. + + TeleMini listens for a command packet for five seconds + after first being turned on, if it doesn't hear + anything, it enters 'pad' mode, ready for flight and + will no longer listen for command packets. The easiest + way to connect to TeleMini is to initiate the command + and select the TeleDongle device. At this point, the + TeleDongle will be attempting to communicate with the + TeleMini. Now turn TeleMini on, and it should + immediately start communicating with the TeleDongle + and the desired operation can be performed. + + You can monitor the operation of the radio link by watching the + lights on the devices. The red LED will flash each time a packet + is transmitted, while the green LED will light up on TeleDongle when + it is waiting to receive a packet from the altimeter. + endif::radio[] + + === Ground Testing + + An important aspect of preparing a rocket using electronic deployment + for flight is ground testing the recovery system. + ifdef::radio[] + Thanks + to the bi-directional radio link central to the Altus Metrum system, + this can be accomplished in a TeleMega, TeleMetrum or TeleMini equipped rocket + with less work than you may be accustomed to with other systems. It + can even be fun! + endif::radio[] + + Just prep the rocket for flight, then power up the altimeter + in “idle” + ifdef::telemetrum,telemega,telemini[] + mode (placing air-frame horizontal for TeleMetrum or TeleMega, or + selecting the Configure Altimeter tab for TeleMini). + This will cause + the firmware to go into “idle” mode, in which the normal flight + state machine is disabled and charges will not fire without + manual command. + endif::telemetrum,telemega,telemini[] + ifndef::telemetrum,telemega,telemini[] + mode. + endif::telemetrum,telemega,telemini[] + You can now command the altimeter to fire the apogee + or main charges from a safe distance using your + computer and the Fire Igniter tab to complete ejection testing. + + ifdef::radio[] + === Radio Link + + TeleMetrum, TeleMini and TeleMega all incorporate an + RF transceiver, but it's not a full duplex system; + each end can only be transmitting or receiving at any + given moment. So we had to decide how to manage the + link. + + By design, the altimeter firmware listens for the + radio link when it's in “idle mode”, which allows us + to use the radio link to configure the rocket, do + things like ejection tests, and extract data after a + flight without having to crack open the air-frame. + However, when the board is in “flight mode”, the + altimeter only transmits and doesn't listen at all. + That's because we want to put ultimate priority on + event detection and getting telemetry out of the + rocket through the radio in case the rocket crashes + and we aren't able to extract data later. + + We don't generally use a 'normal packet radio' mode + like APRS because they're just too inefficient. The + GFSK modulation we use is FSK with the base-band + pulses passed through a Gaussian filter before they go + into the modulator to limit the transmitted bandwidth. + When combined with forward error correction and + interleaving, this allows us to have a very robust + 19.2 kilobit data link with only 10-40 milliwatts of + transmit power, a whip antenna in the rocket, and a + hand-held Yagi on the ground. We've had flights to + above 21k feet AGL with great reception, and + calculations suggest we should be good to well over + 40k feet AGL with a 5-element yagi on the ground with + our 10mW units and over 100k feet AGL with the 40mW + devices. We hope to fly boards to higher altitudes + over time, and would of course appreciate customer + feedback on performance in higher altitude flights! + endif::radio[] + + ifdef::gps+radio[] + :aprsdevices: TeleMetrum v2.0 and TeleMega + :configure_section: _configure_altimeter + include::aprs-operation.raw[] + endif::gps+radio[] + + === Configurable Parameters + + Configuring an Altus Metrum altimeter for flight is + very simple. Even on our baro-only TeleMini and + EasyMini boards, the use of a Kalman filter means + there is no need to set a “mach delay”. All of the + configurable parameters can be set using AltosUI. Read + <<_configure_altimeter>> for more information. diff --git a/doc/telegps-application.inc b/doc/telegps-application.inc new file mode 100644 index 00000000..3e6b385e --- /dev/null +++ b/doc/telegps-application.inc @@ -0,0 +1,351 @@ +== TeleGPS Application + + The TeleGPS application provides a graphical user interface for + interacting with the Altus Metrum product family. TeleGPS can + monitor telemetry data, configure devices and many other + tasks. The primary interface window is for displaying data + received over the telemetry link. There are additional + tasks available from the main window menu bar. + + === Telemetry Monitoring + + This is the window brought up when you start the + application. If you have a TeleDongle device connected + to the computer, it will automatically be selected for + telemetry monitoring + + All telemetry data received are automatically recorded + in suitable log files. The name of the files includes + the current date and TeleGPS serial and flight + numbers. + + The radio frequency being monitored by the TeleDongle + device is displayed at the top of the window. You can + configure the frequency by clicking on the frequency + box and selecting the desired frequency. The TeleGPS + application remembers the last frequency selected for + each TeleDongle and selects that automatically the + next time you use that device. + + Below the TeleDongle frequency selector, the window + contains a few significant pieces of information about + the altimeter providing the telemetry data stream: + + * The configured call-sign + + * The device serial number + + * The flight number. TeleGPS remembers how many times + it has flown. + + * The Received Signal Strength Indicator value. This + lets you know how strong a signal TeleDongle is + receiving. The radio inside TeleDongle operates down + to about -100dBm; weaker signals may not be + receivable. The packet link uses error detection and + correction techniques which prevent incorrect data + from being reported. + + * The age of the displayed data, in seconds since the + last successfully received telemetry packet. In + normal operation this will stay in the low single + digits. If the number starts counting up, then you + are no longer receiving data over the radio link + from the flight computer. + + Finally, the largest portion of the window contains a set of + tabs, each of which contain some information about the TeleGPS + board. The final 'table' tab displays many of the raw telemetry + values in one place in a spreadsheet-like format. + + ==== Map + + The Map tab shows the TeleGPS track over time + on top of map data making it easy to locate + the device. + + .TeleGPS Map View + image::telegps-map.png[width="5.5in"] + + The map's default scale is approximately 3m + (10ft) per pixel. The map can be dragged using + the left mouse button. The map will attempt to + keep the rocket roughly centered while data is + being received. + + You can adjust the style of map and the zoom + level with buttons on the right side of the + map window. You can draw a line on the map by + moving the mouse over the map with a button + other than the left one pressed, or by + pressing the left button while also holding + down the shift key. The length of the line in + real-world units will be shown at the start of + the line. + + Images are fetched automatically via the + Google Maps Static API, and cached on disk for + reuse. If map images cannot be downloaded, the + rocket's path will be traced on a dark gray + background instead. + + You can pre-load images for your favorite + launch sites before you leave home; check out + <<_load_maps>>. + + ==== Location + + The Location tab shows the raw GPS data + received from TeleGPS. + + .TeleGPS Location View + image::telegps-location.png[width="5.5in"] + + ==== Status + + The Status tab shows data relative to the + location of TeleGPS when the application first + received telemetry from it. + + .TeleGPS Status View + image::telegps-status.png[width="5.5in"] + + ==== Table + + The Table tab shows detailed information about + the GPS receiver + + .TeleGPS Information Table + image::telegps-table.png[width="5.5in"] + + === TeleGPS Menus + + TeleGPS has three or four menus at the top of + the window: + + File:: + + New Window, Graph Data, Export Data, Load Maps, + Preferences, Close and Exit + + Monitor:: + + Connect Device, Disconnect and Scan Channels + + Device:: + + Download Data, Configure Device and Flash Device + + Frequency:: + + This shows the current monitoring frequency with a + drop-down menu listing other configured + frequencies. You can change the set of frequencies + shown here from the Preferences dialog. This menu is + only shown when the TeleGPS application is connected + to a TeleDongle or TeleBT device. + + + ==== New Window + + This creates another telemetry monitoring window, in case + you have multiple TeleDongle devices connected to the + computer. + + === Graph Data + + The Graph tab shows a plot of the the GPS data + collected. The X axis is time in seconds; there are a + variety of Y axes available for different kinds of + data. This window also allows you to see some + statistics computed from the data, and an overall map + of the entire data record. + + ==== Data Graph + + .TeleGPS Graph + image::telegps-graph-graph.png[width="5.5in"] + + ==== Graph Configuration + + .TeleGPS Graph Configuration + image::telegps-graph-configure.png[width="5.5in"] + + This selects which graph elements to show, and, at the + bottom, lets you switch between metric and imperial + units + + ==== Statistics + + .TeleGPS Statistics + image::telegps-graph-stats.png[width="5.5in"] + + Shows overall data computed from the flight. + + ==== Map + + .TeleGPS Map + image::telegps-graph-map.png[width="6in"] + + Shows a map of the area overlaid with the GPS track. As with + the telemetry monitoring window, you can select the style + of map and zoom level using buttons along the side; + you can scroll the map by dragging within the map pressing + the left button and you can draw a line to measure + distances using either the left button with the shift key, + or any other button. + + === Export Data + + This tool takes the raw data files and makes them + available for external analysis. When you select this + button, you are prompted to select a data file, which + can be either a .eeprom or .telem. The .eeprom files + contain higher resolution and more continuous data, + while .telem files contain receiver signal strength + information. Next, a second dialog appears which is + used to select where to write the resulting file. It + has a selector to choose between CSV and KML file + formats. + + ==== Comma Separated Value Format + + This is a text file containing the data in a + form suitable for import into a spreadsheet or + other external data analysis tool. The first + few lines of the file contain the version and + configuration information from TeleGPS, then + there is a single header line which labels all + of the fields. All of these lines start with a + '#' character which many tools can be + configured to skip over. + + The remaining lines of the file contain the + data, with each field separated by a comma and + at least one space. All of the sensor values + are converted to standard units, with the + barometric data reported in both pressure, + altitude and height above pad units. + + ==== Keyhole Markup Language (for Google Earth) + + This is the format used by Google Earth to provide an overlay + within that application. With this, you can use Google Earth to + see the whole path in 3D. + + include::load-maps.raw[] + + === Preferences + + .TeleGPS Preferences Window + image::telegps-preferences.png[width="2.4in"] + + include::config-ui.raw[] + + === Close + + This closes the current window, leaving any other windows + open and the application running. + + === Exit + + This closes all TeleGPS windows and terminates the + application. + + === Connect Device + + Selecting this item brings up a dialog box listing all + of the connected TeleDongle devices. When you choose + one of these, AltosUI will display telemetry data as + received by the selected TeleDongle device. + + .Device Selection Dialog + image::device-selection.png[width="3.1in"] + + === Disconnect + + Disconnects the currently connected TeleDongle or + TeleBT + + === Scan Channels + + .Radio Scanning Dialog + image::telegps-scan.png[width="3.1in"] + + Scans the configured set of frequencies looking for + telemetry signals. A list of all of the discovered + signals is show; selecting one of those and clicking + on 'Monitor' will select that frequency in the + associated TeleGPS application window. + + === Download Data + + TeleGPS records data to its internal flash memory. + On-board data is recorded at the same rate as + telemetry but is not subject to radio drop-outs. As + such, it generally provides a more complete and + precise record. The 'Download Data' menu entry allows + you to read the flash memory and write it to disk. + + Select the 'Download Data' menu entry to bring up a + list of connected TeleGPS devices. After the device + has been selected, a dialog showing the data stored in + the device will be shown allowing you to select which + entries to download and which to delete. You must + erase flights in order for the space they consume to + be reused by another track. This prevents accidentally + losing data if you neglect to download data before + starting TeleGPS again. Note that if there is no more + space available in the device, then no data will be + recorded. + + The file name for each data log is computed + automatically from the recorded date, altimeter serial + number and flight number information. + + === Configure Device + + .TeleGPS Configuration Dialog + image::telegps-configure.png[width="3.6in"] + + Select this button and then select any connected TeleGPS + device from the list provided. + + The first few lines of the dialog provide information + about the connected device, including the product + name, software version and hardware serial + number. Below that are the individual configuration + entries. + + At the bottom of the dialog, there are four buttons: + + Save:: + This writes any changes to the configuration parameter + block in flash memory. If you don't press this button, + any changes you make will be lost. + + Reset:: + This resets the dialog to the most recently saved + values, erasing any changes you have made. + + Reboot:: + + This reboots the device. Use this to switch from idle + to pad mode by rebooting once the rocket is oriented + for flight, or to confirm changes you think you saved + are really saved. + + Close:: + + This closes the dialog. Any unsaved changes will be + lost. + + The rest of the dialog contains the parameters to be configured. + + include::config-device.raw[] + + === Flash Device + + This reprograms TeleGPS devices with new + firmware. Please read the directions for flashing + devices in <<_updating_device_firmware>>. diff --git a/doc/telegps-dedication.inc b/doc/telegps-dedication.inc new file mode 100644 index 00000000..719c309c --- /dev/null +++ b/doc/telegps-dedication.inc @@ -0,0 +1,19 @@ +[dedication] +== Acknowledgments + + Thanks to Anthony (AJ) Towns for major contributions including + the TeleGPS graphing and site map code and associated documentation. + Free software means that our customers and friends can become our + collaborators, and we certainly appreciate this level of + contribution! + + Have fun using these products, and we hope to meet all of you + out on the rocket flight line somewhere. + + [verse] + Bdale Garbee, KB0G + NAR #87103, TRA #12201 + + [verse] + Keith Packard, KD7SQG + NAR #88757, TRA #12200 diff --git a/doc/telegps-docinfo.xml b/doc/telegps-docinfo.xml new file mode 100644 index 00000000..4ba3f73c --- /dev/null +++ b/doc/telegps-docinfo.xml @@ -0,0 +1,82 @@ +<subtitle>An Owner's Manual for the TeleGPS recording GPS tracker</subtitle> +<author> + <firstname>Bdale</firstname> + <surname>Garbee</surname> + <email>bdale@gag.com</email> +</author> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<copyright> + <year>2015</year> + <holder>Bdale Garbee and Keith Packard</holder> +</copyright> +<mediaobject> + <imageobject> + <imagedata fileref="telegps-v1.0-top.jpg" width="4.0in"/> + </imageobject> +</mediaobject> +<corpauthor> + <inlinemediaobject> + <imageobject> + <imagedata fileref="telegps-oneline.svg" width="3in"/> + </imageobject> + </inlinemediaobject> +</corpauthor> + +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> +<revhistory> + <?dbhtml filename="telegps-revhistory.html"?> + <revision> + <revnumber>1.6.1</revnumber> + <date>15 July 2015</date> + <revremark> + Minor release adding TeleBT v3.0 support. + </revremark> + </revision> + <revision> + <revnumber>1.6</revnumber> + <date>8 January 2015</date> + <revremark> + Major release adding TeleDongle v3.0 support. + </revremark> + </revision> + <revision> + <revnumber>1.5</revnumber> + <date>6 September 2014</date> + <revremark> + Major release adding EasyMega support. + </revremark> + </revision> + <revision> + <revnumber>1.4.2</revnumber> + <date>17 August 2014</date> + <revremark> + Minor release fixing some Windows installation bugs. + </revremark> + </revision> + <revision> + <revnumber>1.4.1</revnumber> + <date>20 June 2014</date> + <revremark> + Minor release fixing some installation bugs. + </revremark> + </revision> + <revision> + <revnumber>1.4</revnumber> + <date>15 June 2014</date> + <revremark> + Initial version + </revremark> + </revision> +</revhistory> diff --git a/doc/telegps-oneline-font.svg b/doc/telegps-oneline-font.svg new file mode 100644 index 00000000..a2cf540b --- /dev/null +++ b/doc/telegps-oneline-font.svg @@ -0,0 +1,304 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="849.46857" + height="136.09171" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="telegps-oneline-font.svg"> + <defs + id="defs4"> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient3175" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient3169"> + <stop + style="stop-color:#ff8a00;stop-opacity:1;" + offset="0" + id="stop3171" /> + <stop + id="stop3445" + offset="0.71698111" + style="stop-color:#c24573;stop-opacity:0.98039216;" /> + <stop + style="stop-color:#8500e7;stop-opacity:0.96078432;" + offset="1" + id="stop3173" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient3171" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient3165"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3167" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3169" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient2838" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3181"> + <stop + style="stop-color:#ff8a00;stop-opacity:1;" + offset="0" + id="stop3183" /> + <stop + id="stop3185" + offset="0.71698111" + style="stop-color:#c24573;stop-opacity:0.98039216;" /> + <stop + style="stop-color:#8500e7;stop-opacity:0.96078432;" + offset="1" + id="stop3187" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient2840" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3190"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3192" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3194" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient2830" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3197"> + <stop + style="stop-color:#ff8a00;stop-opacity:1;" + offset="0" + id="stop3199" /> + <stop + id="stop3201" + offset="0.71698111" + style="stop-color:#c24573;stop-opacity:0.98039216;" /> + <stop + style="stop-color:#8500e7;stop-opacity:0.96078432;" + offset="1" + id="stop3203" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient2832" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3206"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3208" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3210" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient2834" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3213"> + <stop + style="stop-color:#ff8a00;stop-opacity:1;" + offset="0" + id="stop3215" /> + <stop + id="stop3217" + offset="0.71698111" + style="stop-color:#c24573;stop-opacity:0.98039216;" /> + <stop + style="stop-color:#8500e7;stop-opacity:0.96078432;" + offset="1" + id="stop3219" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient2836" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3222"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3224" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3226" /> + </linearGradient> + <radialGradient + r="951.68701" + fy="2305.2668" + fx="951.68713" + cy="2305.2668" + cx="951.68713" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + gradientUnits="userSpaceOnUse" + id="radialGradient3232" + xlink:href="#linearGradient3169" + inkscape:collect="always" /> + <radialGradient + r="951.68701" + fy="1205.2668" + fx="951.68713" + cy="1205.2668" + cx="951.68713" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + gradientUnits="userSpaceOnUse" + id="radialGradient3234" + xlink:href="#linearGradient3165" + inkscape:collect="always" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient4101" + cx="194.54575" + cy="361.16367" + fx="194.54575" + fy="361.16367" + r="70.597672" + gradientTransform="matrix(1,0,0,0.95908583,137.14286,74.776711)" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.979899" + inkscape:cx="157.24908" + inkscape:cy="-0.91832278" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1617" + inkscape:window-height="1038" + inkscape:window-x="729" + inkscape:window-y="416" + inkscape:window-maximized="0" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-261.09094,-353.45446)"> + <path + style="fill:url(#radialGradient4101);fill-opacity:1" + d="m 261.09094,466.61035 1.9122,-1.69399 39.0721,-36.4688 20.74158,22.05252 -40.71991,38.37279 z m 36.24983,1.34654 -14.08636,-15.38433 -15.33887,14.40857 14.50759,15.23741 z m 18.98704,-17.58715 -14.47613,-15.53942 -14.95191,14.42099 14.19976,15.37575 z m 43.2565,3.24033 -5.69326,-6.00917 -2.76929,1.85727 c -5.01515,3.36349 -10.61773,4.75193 -13.55344,3.35884 -0.90785,-0.4308 -11.20677,-10.85557 -16.46128,-16.61505 -6.3177,-6.92484 -17.77225,-18.68338 -18.08204,-21.53696 l -0.25491,-2.34789 -6.68224,-3.00173 -6.68224,-3.00173 -0.12416,-2.54849 c -0.24316,-4.99109 2.61694,-11.66135 7.10652,-16.57368 6.51922,-7.13306 14.23173,-10.81215 21.4071,-10.21178 l 2.49577,0.20881 2.34108,7.3087 2.34109,7.3087 2.0542,0.21626 c 1.12981,0.11895 2.29245,0.36702 2.58364,0.55127 0.29119,0.18424 11.17756,11.55849 16.63562,17.46044 5.67391,6.13537 16.35301,17.71615 16.74619,18.65715 1.36492,3.26672 -0.56522,9.34479 -4.44838,14.00803 -0.92939,1.1161 -1.6875,2.14976 -1.6847,2.29703 0.003,0.14726 2.44601,2.88431 5.42933,6.08233 2.98332,3.19801 5.42421,6.02814 5.42421,6.28919 0,0.66794 -0.91528,1.72591 -1.73982,2.01104 -0.50334,0.17406 -2.27007,-1.42112 -6.38899,-5.76858 z m -13.8944,-6.52384 c 0.96195,-0.49074 2.46683,-1.3673 3.34417,-1.94791 l 1.59519,-1.05564 -1.69025,-1.72225 c -1.71532,-1.74777 -2.09589,-2.99732 -1.1891,-3.90412 0.98407,-0.98406 2.33559,-0.53387 3.9423,1.31314 l 1.57825,1.81431 1.43638,-1.7099 c 1.7115,-2.03742 3.3933,-5.47555 3.39008,-6.9304 -0.0104,-4.68327 -7.01613,-2.68794 -13.36898,3.80766 -4.26282,4.35861 -6.32786,9.57528 -4.26584,10.77629 1.19252,0.69458 3.36009,0.51166 5.2278,-0.44118 z m -37.53066,-44.39022 c 2.23934,-2.70633 7.29399,-6.99375 10.13666,-8.59806 1.69887,-0.95877 2.21231,-1.46174 2.04152,-1.99985 -0.1255,-0.3954 -1.05734,-3.0661 -2.07077,-5.93487 l -1.84259,-5.21596 -1.60649,0.12825 c -4.1301,0.32972 -9.06228,2.86043 -13.29918,6.82384 -4.03277,3.77245 -7.7843,10.20829 -7.89014,13.53572 l -0.0463,1.4539 5.4085,2.47197 5.4085,2.47197 1.02919,-1.54008 c 0.56606,-0.84704 1.79503,-2.46562 2.73105,-3.59683 z m 32.91039,-10.47213 40.55794,-38.76942 c 7.09795,7.71166 14.5366,15.63755 20.65837,22.2503 l -40.53088,38.2414 z m 35.73645,1.02093 -14.2595,-15.3791 -15.29495,14.35785 14.65467,15.14661 z m 18.6801,-17.55816 -14.10162,-15.40128 -15.32812,14.3973 14.52992,15.24342 z" + id="path3063" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccccscssascccssscccscasscsssssccssscssssscssscssccccsccccccccccccccccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:195.13301086px;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" + x="418.66663" + y="488.37537" + id="text3022" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="418.66663" + y="488.37537" + id="tspan3026">TeleGPS</tspan></text> + </g> +</svg> diff --git a/doc/telegps-oneline.svg b/doc/telegps-oneline.svg new file mode 100644 index 00000000..21497899 --- /dev/null +++ b/doc/telegps-oneline.svg @@ -0,0 +1,332 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="444" + height="98" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="telegps-oneline.svg"> + <defs + id="defs4"> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient3175" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient3169"> + <stop + style="stop-color:#ff8a00;stop-opacity:1;" + offset="0" + id="stop3171" /> + <stop + id="stop3445" + offset="0.71698111" + style="stop-color:#c24573;stop-opacity:0.98039216;" /> + <stop + style="stop-color:#8500e7;stop-opacity:0.96078432;" + offset="1" + id="stop3173" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient3171" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient3165"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3167" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3169" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient2838" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3181"> + <stop + style="stop-color:#ff8a00;stop-opacity:1;" + offset="0" + id="stop3183" /> + <stop + id="stop3185" + offset="0.71698111" + style="stop-color:#c24573;stop-opacity:0.98039216;" /> + <stop + style="stop-color:#8500e7;stop-opacity:0.96078432;" + offset="1" + id="stop3187" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient2840" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3190"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3192" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3194" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient2830" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3197"> + <stop + style="stop-color:#ff8a00;stop-opacity:1;" + offset="0" + id="stop3199" /> + <stop + id="stop3201" + offset="0.71698111" + style="stop-color:#c24573;stop-opacity:0.98039216;" /> + <stop + style="stop-color:#8500e7;stop-opacity:0.96078432;" + offset="1" + id="stop3203" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient2832" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3206"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3208" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3210" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient2834" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="2305.2668" + fx="951.68713" + fy="2305.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3213"> + <stop + style="stop-color:#ff8a00;stop-opacity:1;" + offset="0" + id="stop3215" /> + <stop + id="stop3217" + offset="0.71698111" + style="stop-color:#c24573;stop-opacity:0.98039216;" /> + <stop + style="stop-color:#8500e7;stop-opacity:0.96078432;" + offset="1" + id="stop3219" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3165" + id="radialGradient2836" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + cx="951.68713" + cy="1205.2668" + fx="951.68713" + fy="1205.2668" + r="951.68701" /> + <linearGradient + id="linearGradient3222"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3224" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3226" /> + </linearGradient> + <radialGradient + r="951.68701" + fy="2305.2668" + fx="951.68713" + cy="2305.2668" + cx="951.68713" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + gradientUnits="userSpaceOnUse" + id="radialGradient3232" + xlink:href="#linearGradient3169" + inkscape:collect="always" /> + <radialGradient + r="951.68701" + fy="1205.2668" + fx="951.68713" + cy="1205.2668" + cx="951.68713" + gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)" + gradientUnits="userSpaceOnUse" + id="radialGradient3234" + xlink:href="#linearGradient3165" + inkscape:collect="always" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3169" + id="radialGradient4101" + cx="194.54575" + cy="361.16367" + fx="194.54575" + fy="361.16367" + r="70.597672" + gradientTransform="matrix(0.39116682,0,0,0.37516256,264.74942,305.15926)" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.8" + inkscape:cx="199.46382" + inkscape:cy="-0.91832278" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="2060" + inkscape:window-height="1038" + inkscape:window-x="128" + inkscape:window-y="382" + inkscape:window-maximized="0" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-261.09094,-391.54617)"> + <path + style="fill:url(#radialGradient4101);fill-opacity:1" + d="m 313.2338,458.43158 0.74799,-0.66263 15.28371,-14.26539 8.11342,8.62622 -15.92828,15.01016 z m 14.17973,0.52672 -5.51012,-6.01784 -6.00005,5.63616 5.67488,5.96037 z m 7.4271,-6.87951 -5.66258,-6.0785 -5.84869,5.64101 5.55447,6.01448 z m 16.92051,1.26751 -2.22702,-2.35058 -1.08325,0.7265 c -1.96176,1.31568 -4.1533,1.8588 -5.30166,1.31387 -0.35512,-0.16852 -4.38371,-4.24634 -6.4391,-6.49926 -2.47128,-2.70877 -6.95192,-7.30832 -7.0731,-8.42455 l -0.0997,-0.91841 -2.61387,-1.17418 -2.61387,-1.17418 -0.0486,-0.99688 c -0.0951,-1.95235 1.02366,-4.56153 2.77984,-6.48307 2.5501,-2.79022 5.56698,-4.22936 8.37374,-3.99451 l 0.97627,0.0817 0.91575,2.85892 0.91576,2.85892 0.80353,0.0846 c 0.44195,0.0465 0.89673,0.14357 1.01064,0.21564 0.1139,0.0721 4.37229,4.5213 6.5073,6.82994 2.21944,2.39996 6.39675,6.92997 6.55055,7.29806 0.53391,1.27783 -0.22109,3.65537 -1.74006,5.47948 -0.36354,0.43658 -0.66009,0.84091 -0.659,0.89852 10e-4,0.0576 0.9568,1.12825 2.12378,2.37921 1.16697,1.25095 2.12177,2.358 2.12177,2.46012 0,0.26127 -0.35803,0.67512 -0.68056,0.78665 -0.19689,0.0681 -0.88798,-0.55589 -2.49916,-2.25648 z m -5.43503,-2.55191 c 0.37628,-0.19196 0.96494,-0.53484 1.30813,-0.76195 l 0.62398,-0.41293 -0.66117,-0.67369 c -0.67097,-0.68367 -0.81984,-1.17245 -0.46513,-1.52716 0.38493,-0.38494 0.9136,-0.20884 1.54209,0.51365 l 0.61736,0.7097 0.56187,-0.66886 c 0.66948,-0.79697 1.32734,-2.14185 1.32608,-2.71094 -0.004,-1.83194 -2.74447,-1.05143 -5.2295,1.48943 -1.66747,1.70495 -2.47525,3.74553 -1.66865,4.21533 0.46647,0.2717 1.31435,0.20014 2.04494,-0.17258 z m -14.68075,-17.36398 c 0.87596,-1.05862 2.85317,-2.73572 3.96513,-3.36327 0.66454,-0.37504 0.86538,-0.57179 0.79857,-0.78228 -0.0491,-0.15467 -0.4136,-1.19935 -0.81002,-2.32152 l -0.72076,-2.04031 -0.6284,0.0502 c -1.61556,0.12898 -3.54486,1.11891 -5.2022,2.66926 -1.57748,1.47566 -3.04496,3.99315 -3.08636,5.29473 l -0.0181,0.56872 2.11562,0.96695 2.11563,0.96695 0.40259,-0.60243 c 0.22142,-0.33133 0.70215,-0.96447 1.06829,-1.40696 z m 12.87345,-4.09635 15.86492,-15.16531 c 2.77649,3.01655 5.68624,6.11689 8.08087,8.70358 l -15.85433,14.95877 z m 13.97892,0.39936 -5.57785,-6.0158 -5.98287,5.61632 5.73242,5.92485 z m 7.30703,-6.86817 -5.51608,-6.02447 -5.99586,5.63174 5.68363,5.96272 z" + id="path3063" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccccscssascccssscccscasscsssssccssscssssscssscssccccsccccccccccccccccc" /> + <g + id="g4484" + style="fill:#78079a;fill-opacity:1"> + <path + d="m 397.31307,420.68962 11.6021,0 c 2.13722,0 3.66381,-0.99229 3.66381,-3.12952 0,-2.13723 -1.52659,-3.12951 -3.66381,-3.12951 l -29.92119,0 c -2.13723,0 -3.66382,0.99228 -3.66382,3.12951 0,2.13723 1.52659,3.12952 3.66382,3.12952 l 11.60209,0 0,42.51556 c 0,2.36622 1.06862,3.96914 3.3585,3.96914 2.28989,0 3.3585,-1.60292 3.3585,-3.96914 l 0,-42.51556 z" + id="path4214" + inkscape:connector-curvature="0" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" /> + <path + d="m 416.63996,442.82519 c 0.99228,-4.88509 4.50344,-9.31221 11.83108,-9.31221 6.18269,0 10.0755,3.96914 10.38082,9.31221 l -22.2119,0 z m 25.18875,5.19041 c 3.66382,0 3.74015,-0.83963 3.74015,-4.04547 0,-9.61752 -7.55662,-16.25819 -17.02149,-16.25819 -11.37311,0 -19.38771,7.78561 -19.38771,19.23505 0,13.434 8.47258,19.99834 18.54808,19.99834 l 14.65528,0 c 2.0609,0 3.43483,-0.91596 3.43483,-2.90052 0,-1.98457 -1.37393,-2.90053 -3.43483,-2.90053 l -14.50262,0 c -6.25902,0 -12.06007,-4.27445 -11.52576,-13.12868 l 25.49407,0 z" + id="path4216" + inkscape:connector-curvature="0" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" /> + <path + d="m 460.34936,418.17074 c 0,-2.28989 -0.83962,-3.96913 -3.3585,-3.96913 -2.51888,0 -3.3585,1.67924 -3.3585,3.96913 l 0,45.03444 c 0,2.36622 1.06861,3.96914 3.3585,3.96914 2.28989,0 3.3585,-1.60292 3.3585,-3.96914 l 0,-45.03444 z" + id="path4218" + inkscape:connector-curvature="0" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" /> + <path + d="m 476.12335,442.82519 c 0.99228,-4.88509 4.50344,-9.31221 11.83108,-9.31221 6.18269,0 10.0755,3.96914 10.38082,9.31221 l -22.2119,0 z m 25.18875,5.19041 c 3.66382,0 3.74015,-0.83963 3.74015,-4.04547 0,-9.61752 -7.55663,-16.25819 -17.02149,-16.25819 -11.37311,0 -19.38771,7.78561 -19.38771,19.23505 0,13.434 8.47258,19.99834 18.54808,19.99834 l 14.65528,0 c 2.0609,0 3.43483,-0.91596 3.43483,-2.90052 0,-1.98457 -1.37393,-2.90053 -3.43483,-2.90053 l -14.50262,0 c -6.25902,0 -12.06007,-4.27445 -11.52576,-13.12868 l 25.49407,0 z" + id="path4220" + inkscape:connector-curvature="0" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" /> + <path + d="m 547.99836,461.14428 c -15.11326,0 -29.84486,-8.09093 -29.84486,-25.11242 0,-10.53348 5.87738,-15.34224 13.89198,-15.34224 l 17.40314,0 c 2.13723,0 3.66382,-0.99229 3.66382,-3.12952 0,-2.13723 -1.52659,-3.12951 -3.66382,-3.12951 l -18.70074,0 c -12.44172,0 -20.07467,8.93056 -20.07467,21.21962 0,20.9143 17.09781,31.75309 35.95122,31.75309 5.19041,0 8.09093,-0.45797 8.09093,-4.88509 l 0,-29.84485 c 0,-4.42712 -1.83191,-4.96142 -5.64839,-4.96142 l -12.89969,0 c -2.13723,0 -3.66382,0.99228 -3.66382,3.12951 0,2.13723 1.52659,3.12951 3.66382,3.12951 l 11.83108,0 0,27.17332 z" + id="path4222" + inkscape:connector-curvature="0" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" /> + <path + d="m 571.73446,443.8938 c 9.38854,-3.3585 29.53954,-7.02232 29.53954,-20.37999 0,-6.10637 -4.88509,-9.08322 -10.91513,-9.08322 l -22.2119,0 c -2.36621,0 -3.12951,1.52659 -3.12951,3.66382 l 0,45.11077 c 0,2.36622 1.06862,3.96914 3.3585,3.96914 2.28989,0 3.3585,-1.60292 3.3585,-3.96914 l 0,-19.31138 z m 17.40314,-23.20418 c 2.67154,0 4.65611,0.91595 4.65611,3.89281 0,6.86966 -14.34996,9.23587 -22.05925,12.44171 l 0,-16.33452 17.40314,0 z" + id="path4224" + inkscape:connector-curvature="0" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" /> + <path + d="m 615.90185,414.43059 c -6.1827,0 -11.60208,3.51116 -11.60208,10.45715 0,18.70074 34.04297,4.04547 34.04297,22.59355 0,8.16726 -4.80877,13.20502 -15.80021,13.20502 l -14.80793,0 c -2.13722,0 -3.66382,0.99228 -3.66382,3.12951 0,2.13723 1.5266,3.12951 3.66382,3.12951 l 16.79248,0 c 12.97606,0 20.99064,-8.54891 20.99064,-19.6167 0,-24.65445 -34.04298,-12.89969 -34.04298,-22.51722 0,-3.96913 4.12181,-4.12179 6.56433,-4.12179 l 17.09782,0 c 2.13726,0 3.66383,-0.99229 3.66383,-3.12952 0,-2.13723 -1.52657,-3.12951 -3.66383,-3.12951 l -19.23504,0 z" + id="path4226" + inkscape:connector-curvature="0" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:'ITC Benguiat Gothic Std';-inkscape-font-specification:'ITC Benguiat Gothic Std Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#78079a;fill-opacity:1;stroke:none" /> + </g> + </g> +</svg> diff --git a/doc/telegps-quick-start.inc b/doc/telegps-quick-start.inc new file mode 100644 index 00000000..6492743d --- /dev/null +++ b/doc/telegps-quick-start.inc @@ -0,0 +1,23 @@ +== TeleGPS Quick Start Guide + + TeleGPS is designed to be easy to use. Requiring no external + components, flying takes just a few steps. + + 1. First, download and install the software from + http://altusmetrum.org/AltOS. This will make sure that + you have the right device drivers installed. + + 2. Next, plug in the battery and USB cable and connect TeleGPS to + your computer. This will charge the battery and allow you to + configure the device. + + 3. Start the TeleGPS application and set the callsign and frequency + on your TeleGPS device; refer to <<_configure_device>> for instructions. + + 4. Unplug TeleGPS when the battery charger light goes green. This + will enable the radio and logging portions of the TeleGPS + firmware. + + 5. Connect TeleDongle to your computer and start TeleGPS or start + AltosDroid on your android device and connect to TeleBT. Set the + frequency to match the TeleGPS and you should be receiving telemetry. diff --git a/doc/telegps-release-notes.inc b/doc/telegps-release-notes.inc new file mode 100644 index 00000000..dcdabc05 --- /dev/null +++ b/doc/telegps-release-notes.inc @@ -0,0 +1,29 @@ +[appendix] +== Release Notes + + :leveloffset: 2 + include::release-notes-1.6.2.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.6.1.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.6.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.5.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.4.2.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.4.1.raw[] + + <<<< + :leveloffset: 2 + include::release-notes-1.4.raw[] diff --git a/doc/telegps-specs.inc b/doc/telegps-specs.inc new file mode 100644 index 00000000..6ff8c76f --- /dev/null +++ b/doc/telegps-specs.inc @@ -0,0 +1,29 @@ +[appendix] +== Technical Information + + === GPS Receiver + + TeleGPS uses the u-Blox Max-7Q GPS receiver. + + === Micro-controller + + TeleGPS uses an NXP LPC11U14 micro-controller. This + tiny CPU contains 32kB of flash for the application + and 4kB of RAM for temporary data storage. + + === Lithium Polymer Battery + + Shipping restrictions may prevent us from including a + battery battery with TeleGPS. + + === Mechanical Considerations + + TeleGPS is designed to be rugged enough for typical + rocketry applications. The 4 mounting holes on the + board are sized for use with 4-40 or M3 screws. + + === On-board data storage + + TeleGPS has 2MB of non-volatile storage, separate from + the code storage memory. The TeleGPS firmware uses + this to log information during flight. diff --git a/doc/telegps-system-operation.inc b/doc/telegps-system-operation.inc new file mode 100644 index 00000000..c9fce7f0 --- /dev/null +++ b/doc/telegps-system-operation.inc @@ -0,0 +1,30 @@ +[appendix] +== TeleGPS System Operation + + === GFSK Telemetry + + TeleGPS's native telemetry system doesn't use a + 'normal packet radio' mode like APRS because it's not + very efficient. The GFSK modulation we use is FSK + with the base-band pulses passed through a Gaussian + filter before they go into the modulator to limit the + transmitted bandwidth. When combined with forward + error correction and interleaving, this allows us to + have a very robust 19.2 kilobit data link with only + 10-40 milliwatts of transmit power, a whip antenna in + the rocket, and a hand-held Yagi on the ground. We've + had flights to above 21k feet AGL with great + reception, and calculations suggest we should be good + to well over 40k feet AGL with a 5-element yagi on the + ground with our 10mW units and over 100k feet AGL with + the 40mW devices. + + :aprsdevices: TeleGPS + :configure_section: _configure_device + include::aprs-operation.raw[] + + === Configurable Parameters + + Configuring TeleGPS is very simple; the few configurable + parameters can all be set using the TeleGPS application over + USB. Check out <<_configure_device>>. diff --git a/doc/telegps-updating-firmware.inc b/doc/telegps-updating-firmware.inc new file mode 100644 index 00000000..568c4343 --- /dev/null +++ b/doc/telegps-updating-firmware.inc @@ -0,0 +1,43 @@ +[appendix] +== Updating Device Firmware + + TeleGPS is programmed directly over its USB connectors. + + You may wish to begin by ensuring you have current firmware images. + These are distributed as part of the TeleGPS software bundle that + also includes the TeleGPS ground station program. Newer ground + station versions typically work fine with older firmware versions, + so you don't need to update your devices just to try out new + software features. You can always download the most recent + version from http://www.altusmetrum.org/AltOS/ + + === Updating TeleGPS Firmware + + . Attach a battery and power switch to the target + device. Power up the device. + + . Using a Micro USB cable, connect the target device to + your computer's USB socket. + + . Run TeleGPS, and select 'Flash Device' from the + Device menu. + + . Select the target device in the Device Selection + dialog. + + . Select the image you want to flash to the device, + which should have a name in the form + <product>-v<product-version>-<software-version>.ihx, + such as TeleGPS-v1.0-1.4.0.ihx. + + . Make sure the configuration parameters are reasonable + looking. If the serial number and/or RF configuration + values aren't right, you'll need to change them. + + . Hit the 'OK' button and the software should proceed + to flash the device with new firmware, showing a + progress bar. + + . Verify that the device is working by using the + 'Configure Device item to check over the + configuration. diff --git a/doc/telegps-using.inc b/doc/telegps-using.inc new file mode 100644 index 00000000..1dd889cd --- /dev/null +++ b/doc/telegps-using.inc @@ -0,0 +1,81 @@ +== Using TeleGPS Hardware + + === Hooking Up Lithium Polymer Batteries + + TeleGPS has a two pin JST PH series connector to connect up + a single-cell Lithium Polymer cell (3.7V nominal). You can + purchase matching batteries from the Altus Metrum store, or + other vendors, or you can make your own. Pin 1 of the + connector is positive, pin 2 is negative. Spark Fun sells a + cable with the connector attached, which they call a + link:https://www.sparkfun.com/products/9914[JST Jumper 2 Wire Assembly] + + + [WARNING] + Many RC vendors also sell lithium polymer batteries with + this same connector. All that we have found use the opposite + polarity, and if you use them that way, you will damage or + destroy TeleGPS. + + === On-board Data Recording + + TeleGPS logs GPS data at a user-configurable + rate. Data are logged to a 2MB on-board flash memory + part, which can be partitioned into several + equal-sized blocks, one for each flight. 64kB of this + storage are reserved to hold configuration data, + leaving 1984kB for flight data. + + The on-board flash is partitioned into separate flight + logs, each of a fixed maximum size. Increase the + maximum size of each log and you reduce the number of + flights that can be stored. Decrease the size and you + can store more flights. + + To compute the amount of space needed for a single + log, you can divide the expected time (in seconds) by + the sample period (by default, 1 second per sample) + and then multiply the result by 32 bytes per + sample. For instance, a sample period of 1 second and + a flight lasting one hour will take 32 * 3600 = 115200 + bytes. TeleGPS does try to reduce log space used by + not recording position information when it isn't + moving, so actual space consumed may be less than + this. + + The default size allows for four flights of 496kB + each, which provides over four hours of logging at 1 + sample per second. + + TeleGPS will not overwrite existing flight data, so be + sure to download flight data and erase it from the + onboard flash before it fills up. TeleGPS will still + report telemetry even if memory is full, so the only + thing you will lose is the on-board data log. + + === Installation + + The battery connectors are a standard 2-pin JST + connector and match batteries sold by Spark Fun. These + batteries are single-cell Lithium Polymer batteries + that nominally provide 3.7 volts. Other vendors sell + similar batteries for RC aircraft using mating + connectors, however the polarity for those is + generally reversed from the batteries used by Altus + Metrum products. In particular, the Tenergy batteries + supplied for use in Featherweight flight computers are + not compatible with Altus Metrum flight computers or + battery chargers. + + [WARNING] + Check polarity and voltage before connecting any + battery not purchased from Altus Metrum or Spark + Fun. + + TeleGPS uses an integrate GPS patch antenna and won't + receive GPS signals if installed inside a metal or + carbon fiber compartment. Test GPS reception and + telemetry transmission with the system installed and + all other electronics powered up to verify signal + reception and make sure there isn't any interference + from other systems. diff --git a/doc/telegps.txt b/doc/telegps.txt new file mode 100644 index 00000000..47eafe37 --- /dev/null +++ b/doc/telegps.txt @@ -0,0 +1,25 @@ += TeleGPS Owner's Manual +:doctype: book +:numbered: +:telegps: 1 +:radio: 1 +:gps: 1 +:application: TeleGPS + + include::telegps-dedication.raw[] + + include::telegps-quick-start.raw[] + + include::telegps-using.raw[] + + include::telegps-application.raw[] + + include::telegps-system-operation.raw[] + + include::handling.raw[] + + include::telegps-specs.raw[] + + include::telegps-updating-firmware.raw[] + + include::telegps-release-notes.raw[] diff --git a/doc/telegps.xsl b/doc/telegps.xsl deleted file mode 100644 index 8de5c56d..00000000 --- a/doc/telegps.xsl +++ /dev/null @@ -1,1338 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" - "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> -<book> - <title>TeleGPS Owner's Manual</title> - <subtitle>A recording GPS tracker</subtitle> - <bookinfo> - <author> - <firstname>Keith</firstname> - <surname>Packard</surname> - </author> - <copyright> - <year>2015</year> - <holder>Bdale Garbee and Keith Packard</holder> - </copyright> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-v1.0-top.jpg" width="4in"/> - </imageobject> - </mediaobject> - <legalnotice> - <para> - This document is released under the terms of the - <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> - Creative Commons ShareAlike 3.0 - </ulink> - license. - </para> - </legalnotice> - <revhistory> - <revision> - <revnumber>1.6</revnumber> - <date>8 January 2015</date> - <revremark> - Major release adding TeleDongle v3.0 support. - </revremark> - </revision> - <revision> - <revnumber>1.4.1</revnumber> - <date>20 June 2014</date> - <revremark> - Minor release fixing some installation bugs. - </revremark> - </revision> - <revision> - <revnumber>1.4</revnumber> - <date>13 June 2014</date> - <revremark> - Initial release - </revremark> - </revision> - </revhistory> - </bookinfo> - <dedication> - <title>Acknowledgements</title> - <para> - Have fun using these products, and we hope to meet all of you - out on the rocket flight line somewhere. - <literallayout> -Bdale Garbee, KB0G -NAR #87103, TRA #12201 - -Keith Packard, KD7SQG -NAR #88757, TRA #12200 - </literallayout> - </para> - </dedication> - <chapter> - <title>Quick Start Guide</title> - <para> - TeleGPS is designed to be easy to use. Requiring no external - components, flying takes just a few steps. - </para> - <para> - First, download and install the software from <ulink - url="http://altusmetrum.org/AltOS"/>. This will make sure that - you have the right device drivers installed. - </para> - <para> - Next, plug in the battery and USB cable and connect TeleGPS to - your computer. This will charge the battery and allow you to - configure the device. - </para> - <para> - Start the TeleGPS application and set the callsign and frequency - on your TeleGPS device; refer to the Configure TeleGPS section - in the TeleGPS Application chapter for instructions. - </para> - <para> - Unplug TeleGPS when the battery charger light goes green. This - will enable the radio and logging portions of the TeleGPS - firmware. - </para> - <para> - Connect TeleDongle to your computer and start TeleGPS or start - AltosDroid on your android device and connect to TeleBT. Set the - frequency to match the TeleGPS and you should be receiving telemetry. - </para> - </chapter> - <chapter> - <title>Handling Precautions</title> - <para> - All Altus Metrum products are sophisticated electronic devices. - When handled gently and properly installed in an air-frame, they - will deliver impressive results. However, as with all electronic - devices, there are some precautions you must take. - </para> - <para> - The Lithium polymer batteries have an - extraordinary power density. This is great because we can fly with - much less battery mass... but if they are punctured - or their contacts are allowed to short, they can and will release their - energy very rapidly! - Thus we recommend that you take some care when handling TeleGPS - to keep conductive material from coming in contact with the exposed metal elements. - </para> - <para> - As with all other rocketry electronics, Altus Metrum devices must - be protected from exposure to corrosive motor exhaust and ejection - charge gasses. - </para> - </chapter> - <chapter> - <title>TeleGPS Hardware</title> - <section> - <title>Hooking Up Lithium Polymer Batteries</title> - <para> - TeleGPS has a two pin JST PH series connector to connect up - a single-cell Lithium Polymer cell (3.7V nominal). You can - purchase matching batteries from the Altus Metrum store, or - other vendors, or you can make your own. Pin 1 of the - connector is positive, pin 2 is negative. Spark Fun sells a - cable with the connector attached, which they call a <ulink - url="https://www.sparkfun.com/products/9914">JST Jumper 2 - Wire Assembly</ulink>. - </para> - <para> - Many RC vendors also sell lithium polymer batteries with - this same connector. All that we have found use the opposite - polarity, and if you use them that way, you will damage or - destroy TeleGPS. - </para> - </section> - <section> - <title>On-board Data Recording</title> - <para> - TeleGPS logs GPS data at a user-configurable rate. Data are - logged to a 2MB on-board flash memory part, which can be - partitioned into several equal-sized blocks, one for each - flight. 64kB of this storage are reserved to hold - configuration data, leaving 1984kB for flight data. - </para> - <para> - The on-board flash is partitioned into separate flight logs, - each of a fixed maximum size. Increase the maximum size of - each log and you reduce the number of flights that can be - stored. Decrease the size and you can store more flights. - </para> - <para> - To compute the amount of space needed for a single log, you - can divide the expected time (in seconds) by the sample period - (by default, 1 second per sample) and then multiply the result - by 32 bytes per sample. For instance, a sample period of 1 - second and a flight lasting one hour will take 32 * 3600 = - 115200 bytes. TeleGPS does try to reduce log space used by not - recording position information when it isn't moving, so actual - space consumed may be less than this. - </para> - <para> - The default size allows for four flights of 496kB each, which - provides over four hours of logging at 1 sample per second. - </para> - <para> - TeleGPS will not overwrite existing flight data, so be sure to - download flight data and erase it from the onboard flash - before it fills up. TeleGPS will still report telemetry even - if memory is full, so the only thing you will lose is the - on-board data log. - </para> - </section> - <section> - <title>Installation</title> - <para> - The battery connectors are a standard 2-pin JST connector and - match batteries sold by Spark Fun. These batteries are - single-cell Lithium Polymer batteries that nominally provide 3.7 - volts. Other vendors sell similar batteries for RC aircraft - using mating connectors, however the polarity for those is - generally reversed from the batteries used by Altus Metrum - products. In particular, the Tenergy batteries supplied for use - in Featherweight flight computers are not compatible with Altus - Metrum flight computers or battery chargers. <emphasis>Check - polarity and voltage before connecting any battery not purchased - from Altus Metrum or Spark Fun.</emphasis> - </para> - <para> - TeleGPS uses an integrate GPS patch antenna and won't - receive GPS signals if installed inside a metal or carbon - fiber compartment. Test GPS reception and telemetry - transmission with the system installed and all other - electronics powered up to verify signal reception and make - sure there isn't any interference from other systems. - </para> - </section> - </chapter> - <chapter> - <title>System Operation</title> - <section> - <title>GFSK Telemetry</title> - <para> - TeleGPS's native telemetry system doesn't use a 'normal packet - radio' mode like APRS because it's not very efficient. The - GFSK modulation we use is FSK with the base-band pulses passed - through a Gaussian filter before they go into the modulator to - limit the transmitted bandwidth. When combined with forward - error correction and interleaving, this allows us to have a - very robust 19.2 kilobit data link with only 10-40 milliwatts - of transmit power, a whip antenna in the rocket, and a - hand-held Yagi on the ground. We've had flights to above 21k - feet AGL with great reception, and calculations suggest we - should be good to well over 40k feet AGL with a 5-element yagi - on the ground with our 10mW units and over 100k feet AGL with - the 40mW devices. - </para> - </section> - <section> - <title>APRS</title> - <para> - TeleGPS can send APRS if desired, and the - interval between APRS packets can be configured. As each APRS - packet takes a full second to transmit, we recommend an - interval of at least 5 seconds to avoid consuming too much - battery power or radio channel bandwidth. You can configure - the APRS interval using AltosUI; that process is described in - the Configure Altimeter section of the AltosUI chapter. - </para> - <para> - AltOS uses the APRS compressed position report data format, - which provides for higher position precision and shorter - packets than the original APRS format. It also includes - altitude data, which is invaluable when tracking rockets. We - haven't found a receiver which doesn't handle compressed - positions, but it's just possible that you have one, so if you - have an older device that can receive the raw packets but - isn't displaying position information, it's possible that this - is the cause. - </para> - <para> - The APRS packet format includes a comment field that can have - arbitrary text in it. AltOS uses this to send status - information about the flight computer. It sends four fields as - shown in the following table. - </para> - <table frame='all'> - <title>Altus Metrum APRS Comments</title> - <?dbfo keep-together="always"?> - <tgroup cols='3' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Field'/> - <colspec align='center' colwidth='*' colname='Example'/> - <colspec align='center' colwidth='4*' colname='Description'/> - <thead> - <row> - <entry align='center'>Field</entry> - <entry align='center'>Example</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>1</entry> - <entry>L</entry> - <entry>GPS Status U for unlocked, L for locked</entry> - </row> - <row> - <entry>2</entry> - <entry>6</entry> - <entry>Number of Satellites in View</entry> - </row> - <row> - <entry>3</entry> - <entry>B4.0</entry> - <entry>Battery Voltage</entry> - </row> - </tbody> - </tgroup> - </table> - <para> - Here's an example of an APRS comment showing GPS lock with 6 - satellites in view and a battery at 4.0V. - <screen> - L6 B4.0 - </screen> - </para> - <para> - Make sure your primary battery is above 3.8V and GPS is locked - with at least 5 or 6 satellites in view before starting. If GPS - is switching between L and U regularly, then it doesn't have a - good lock and you should wait until it becomes stable. - </para> - <para> - If the GPS receiver loses lock, the APRS data transmitted will - contain the last position for which GPS lock was - available. You can tell that this has happened by noticing - that the GPS status character switches from 'L' to 'U'. Before - GPS has locked, APRS will transmit zero for latitude, - longitude and altitude. - </para> - </section> - <section> - <title>Configurable Parameters</title> - <para> - Configuring TeleGPS is very - simple; the few configurable parameters can all be set - using the TeleGPS application over USB. Read - the Configure TeleGPS section in the TeleGPS Software chapter below - for more information. - </para> - <section> - <title>Radio Frequency</title> - <para> - Altus Metrum boards support radio frequencies in the 70cm - band. By default, the configuration interface provides a - list of 10 “standard” frequencies in 100kHz channels starting at - 434.550MHz. However, the firmware supports use of - any 50kHz multiple within the 70cm band. At any given - launch, we highly recommend coordinating when and by whom each - frequency will be used to avoid interference. And of course, both - TeleGPS and the receiver must be configured to the same - frequency to successfully communicate with each other. - </para> - </section> - <section> - <title>Callsign</title> - <para> - This sets the callsign used for telemetry and APRS to - identify the device. - </para> - </section> - <section> - <title>Telemetry/RDF/APRS Enable</title> - <para> - You can completely disable the radio, if necessary, leaving - TeleGPS only logging data to internal memory. - </para> - </section> - <section> - <title>APRS Interval</title> - <para> - This selects how often APRS packets are transmitted. Set - this to zero to disable APRS without also disabling the - regular telemetry and RDF transmissions. As APRS takes a - full second to transmit a single position report, we - recommend sending packets no more than once every 5 seconds. - </para> - </section> - <section> - <title>Maximum Flight Log</title> - <para> - Changing this value will set the maximum amount of flight - log storage that an individual flight will use. The - available storage is divided into as many flights of the - specified size as can fit in the available space. You can - download and erase individual flight logs. If you fill up - the available storage, future flights will not get logged - until you erase some of the stored ones. - </para> - </section> - <section> - <title>Logging Trigger Motion</title> - <para> - If TeleGPS moves less than this distance over a long period - of time, it will not log that location, saving storage space. - </para> - </section> - <section> - <title>Position Reporting Interval</title> - <para> - This sets how often TeleGPS reports position information via - telemetry and to the on-board log. Reducing this value will - save power and logging memory consumption. - </para> - </section> - </section> - </chapter> - <chapter> - <title>TeleGPS Application</title> - <para> - The TeleGPS application provides a graphical user interface for - interacting with the Altus Metrum product family. TeleGPS can - monitor telemetry data, configure devices and many other - tasks. The primary interface window is for displaying data - received over the telemetry link. There are additional - tasks available from the main window menu bar. This chapter - is split into sections, each of which documents one of the tasks - provided from the top-level toolbar. - </para> - <section> - <title>Telemetry Monitoring</title> - <para> - This is the window brought up when you start the - application. If you have a TeleDongle device connected to the - computer, it will automatically be selected for telemetry monitoring - </para> - <para> - All telemetry data received are automatically recorded in - suitable log files. The name of the files includes the current - date and TeleGPS serial and flight numbers. - </para> - <para> - The radio frequency being monitored by the TeleDongle device - is displayed at the top of the window. You can configure the - frequency by clicking on the frequency box and selecting the - desired frequency. The TeleGPS application remembers the last - frequency selected for each TeleDongle and selects that - automatically the next time you use that device. - </para> - <para> - Below the TeleDongle frequency selector, the window contains a few - significant pieces of information about the altimeter providing - the telemetry data stream: - </para> - <itemizedlist> - <listitem> - <para>The configured call-sign</para> - </listitem> - <listitem> - <para>The device serial number</para> - </listitem> - <listitem> - <para>The flight number. TeleGPS remembers how many - times it has flown. - </para> - </listitem> - <listitem> - <para> - The Received Signal Strength Indicator value. This lets - you know how strong a signal TeleDongle is receiving. The - radio inside TeleDongle operates down to about -100dBm; - weaker signals may not be receivable. The packet link uses - error detection and correction techniques which prevent - incorrect data from being reported. - </para> - </listitem> - <listitem> - <para> - The age of the displayed data, in seconds since the last - successfully received telemetry packet. In normal operation - this will stay in the low single digits. If the number starts - counting up, then you are no longer receiving data over the radio - link from the flight computer. - </para> - </listitem> - </itemizedlist> - <para> - Finally, the largest portion of the window contains a set of - tabs, each of which contain some information about the TeleGPS - board. The final 'table' tab displays many of the raw telemetry - values in one place in a spreadsheet-like format. - </para> - <section> - <title>Map</title> - <para> - The Map tab shows the TeleGPS track over time on top of map - data making it easy to locate the device. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-map.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - The map's default scale is approximately 3m (10ft) per pixel. The map - can be dragged using the left mouse button. The map will attempt - to keep the rocket roughly centered while data is being received. - </para> - <para> - You can adjust the style of map and the zoom level with - buttons on the right side of the map window. You can draw a - line on the map by moving the mouse over the map with a - button other than the left one pressed, or by pressing the - left button while also holding down the shift key. The - length of the line in real-world units will be shown at the - start of the line. - </para> - <para> - Images are fetched automatically via the Google Maps Static API, - and cached on disk for reuse. If map images cannot be downloaded, - the rocket's path will be traced on a dark gray background - instead. - </para> - <para> - You can pre-load images for your favorite launch sites - before you leave home; check out the 'Preload Maps' section below. - </para> - </section> - <section> - <title>Location</title> - <para> - The Location tab shows the raw GPS data received from TeleGPS. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-location.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>Status</title> - <para> - The Status tab shows data relative to the location of - TeleGPS when the application first received telemetry from - it. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-status.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>Table</title> - <para> - The Table tab shows detailed information about the GPS - receiver - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-table.png" width="5.5in"/> - </imageobject> - </mediaobject> - </informalfigure> - </section> - </section> - <!-- - <variablelist> - <varlistentry> - <term></term> - <listitem> - <para> - </para> - </listitem> - </varlistentry> - </variablelist> - --> - <section> - <title>TeleGPS Menus</title> - <para> - TeleGPS has three or four menus at the top of the window: - <variablelist> - <varlistentry> - <term>File</term> - <listitem> - <para> - New Window, Graph Data, Export Data, Load Maps, Preferences, Close and Exit - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Monitor</term> - <listitem> - <para> - Connect Device, Disconnect and Scan Channels - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Device</term> - <listitem> - <para> - Download Data, Configure Device and Flash Device - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Frequency</term> - <listitem> - <para> - This shows the current monitoring frequency with a - drop-down menu listing other configured - frequencies. You can change the set of frequencies - shown here from the Preferences dialog. This menu is - only shown when the TeleGPS application is connected - to a TeleDongle or TeleBT device. - </para> - </listitem> - </varlistentry> - </variablelist> - </para> - <section> - <title>New Window</title> - <para> - This creates another telemetry monitoring window, in case - you have multiple TeleDongle devices connected to the - computer. - </para> - </section> - <section> - <title>Graph Data</title> - <para> - This brings up a file dialog to load a saved log, either - a .telem file of recorded telemetry or .eeprom of saved - data from on-board memory. It looks a bit like the flight - monitoring window, using a selection of tabs to show - different views of the saved data. - </para> - <section> - <title>Graph</title> - <para> - The Graph tab shows a plot of the the GPS data - collected. The X axis is time in seconds; there are a - variety of Y axes available for different kinds of data. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-graph-graph.png" width="6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>Configure Graph</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-graph-configure.png" width="6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - This selects which graph elements to show, and, at the - bottom, lets you switch between metric and imperial units - </para> - </section> - <section> - <title>Statistics</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-graph-stats.png" width="6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Shows overall data computed from the flight. - </para> - </section> - <section> - <title>Map</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-graph-map.png" width="6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Shows a map of the area overlaid with the GPS track. As with - the telemetry monitoring window, you can select the style - of map and zoom level using buttons along the side; - you can scroll the map by dragging within the map pressing - the left button and you can draw a line to measure - distances using either the left button with the shift key, - or any other button. - </para> - </section> - </section> - <section> - <title>Export Data</title> - <para> - This tool takes the raw data files and makes them available for - external analysis. When you select this button, you are prompted to - select a data file, which can be either a .eeprom or .telem. - The .eeprom files contain higher resolution and more continuous data, - while .telem files contain receiver signal strength information. - Next, a second dialog appears which is used to select - where to write the resulting file. It has a selector to choose - between CSV and KML file formats. - </para> - <section> - <title>Comma Separated Value Format</title> - <para> - This is a text file containing the data in a form suitable for - import into a spreadsheet or other external data analysis - tool. The first few lines of the file contain the version and - configuration information from TeleGPS, then - there is a single header line which labels all of the - fields. All of these lines start with a '#' character which - many tools can be configured to skip over. - </para> - <para> - The remaining lines of the file contain the data, with each - field separated by a comma and at least one space. All of - the sensor values are converted to standard units, with the - barometric data reported in both pressure, altitude and - height above pad units. - </para> - </section> - <section> - <title>Keyhole Markup Language (for Google Earth)</title> - <para> - This is the format used by Google Earth to provide an overlay - within that application. With this, you can use Google Earth to - see the whole flight path in 3D. - </para> - </section> - </section> - <section> - <title>Load Maps</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="load-maps.png" width="5.2in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Before using TeleGPS, you can use Load Maps to load map data - in case you don't have access to the internet while - receiving telemetry. - </para> - <para> - There's a drop-down menu of rocket launch sites we know - about; if your favorites aren't there, please let us know - the lat/lon and name of the site. The contents of this list - are actually downloaded from our server at run-time, so as - new sites are sent in, they'll get automatically added to - this list. If the launch site isn't in the list, you can - manually enter the lat/lon values - </para> - <para> - There are four different kinds of maps you can view; you can - select which to download by selecting as many as you like from - the available types: - <variablelist> - <varlistentry> - <term>Hybrid</term> - <listitem> - <para> - A combination of satellite imagery and road data. This - is the default view. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Satellite</term> - <listitem> - <para> - Just the satellite imagery without any annotation. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Roadmap</term> - <listitem> - <para> - Roads, political boundaries and a few geographic features. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Terrain</term> - <listitem> - <para> - Contour intervals and shading that show hills and - valleys. - </para> - </listitem> - </varlistentry> - </variablelist> - </para> - <para> - You can specify the range of zoom levels to download; smaller - numbers show more area with less resolution. The default - level, 0, shows about 3m/pixel. One zoom level change - doubles or halves that number. - </para> - <para> - The Tile Radius value sets how large an area around the center - point to download. Each tile is 512x512 pixels, and the - 'radius' value specifies how many tiles away from the center - will be downloaded. Specify a radius of 0 and you get only the - center tile. A radius of 1 loads a 3x3 grid, centered on the - specified location. - </para> - <para> - Clicking the 'Load Map' button will fetch images from Google - Maps; note that Google limits how many images you can fetch at - once, so if you load more than one launch site, you may get - some gray areas in the map which indicate that Google is tired - of sending data to you. Try again later. - </para> - </section> - <section> - <title>Preferences</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-preferences.png" width="2.4in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <section> - <title>Voice Settings</title> - <para> - AltosUI provides voice announcements during flight so that you - can keep your eyes on the sky and still get information about - the current flight status. However, sometimes you don't want - to hear them. - </para> - <variablelist> - <varlistentry> - <term>Enable</term> - <listitem> - <para>Turns all voice announcements on and off</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Test Voice</term> - <listitem> - <para> - Plays a short message allowing you to verify - that the audio system is working and the volume settings - are reasonable - </para> - </listitem> - </varlistentry> - </variablelist> - </section> - <section> - <title>Log Directory</title> - <para> - AltosUI logs all telemetry data and saves all TeleMetrum flash - data to this directory. This directory is also used as the - staring point when selecting data files for display or export. - </para> - <para> - Click on the directory name to bring up a directory choosing - dialog, select a new directory and click 'Select Directory' to - change where AltosUI reads and writes data files. - </para> - </section> - <section> - <title>Callsign</title> - <para> - This value is transmitted in each command packet sent from - TeleDongle and received from an altimeter. It is not used in - telemetry mode, as the callsign configured in the altimeter board - is included in all telemetry packets. Configure this - with the AltosUI operators call sign as needed to comply with - your local radio regulations. - </para> - <para> - Note that to successfully command a flight computer over the radio - (to configure the altimeter, monitor idle, or fire pyro charges), - the callsign configured here must exactly match the callsign - configured in the flight computer. This matching is case - sensitive. - </para> - </section> - <section> - <title>Imperial Units</title> - <para> - This switches between metric units (meters) and imperial - units (feet and miles). This affects the display of values - use during flight monitoring, configuration, data graphing - and all of the voice announcements. It does not change the - units used when exporting to CSV files, those are always - produced in metric units. - </para> - </section> - <section> - <title>Serial Debug</title> - <para> - This causes all communication with a connected device to be - dumped to the console from which AltosUI was started. If - you've started it from an icon or menu entry, the output - will simply be discarded. This mode can be useful to debug - various serial communication issues. - </para> - </section> - <section> - <title>Font Size</title> - <para> - Selects the set of fonts used in the flight monitor - window. Choose between the small, medium and large sets. - </para> - </section> - <section> - <title>Look & Feel</title> - <para> - Adjust the style of the windows. By default, the TeleGPS - application attempts to blend in with the native style. - </para> - </section> - <section> - <title>Manage Frequencies</title> - <para> - This brings up a dialog where you can configure the set of - frequencies shown in the various frequency menus. You can - add as many as you like, or even reconfigure the default - set. Changing this list does not affect the frequency - settings of any devices, it only changes the set of - frequencies shown in the menus. - </para> - </section> - </section> - <section> - <title>Close</title> - <para> - This closes the current window, leaving any other windows - open and the application running. - </para> - </section> - <section> - <title>Exit</title> - <para> - This closes all TeleGPS windows and terminates the application. - </para> - </section> - <section> - <title>Connect Device</title> - <para> - Selecting this item brings up a dialog box listing all of - the connected TeleDongle devices. When you choose one of - these, AltosUI will display telemetry data as received by - the selected TeleDongle device. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="device-selection.png" width="3.1in"/> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>Disconnect</title> - <para> - Disconnects the currently connected TeleDongle or TeleBT - </para> - </section> - <section> - <title>Scan Channels</title> - <para> - Scans the configured set of frequencies looking for - telemetry signals. A list of all of the discovered signals - is show; selecting one of those and clicking on 'Monitor' - will select that frequency in the associated TeleGPS - application window. - </para> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-scan.png" width="3.1in"/> - </imageobject> - </mediaobject> - </informalfigure> - </section> - <section> - <title>Download Data</title> - <para> - TeleGPS records data to its internal flash memory. - On-board data is recorded at the same rate as telemetry - but is not subject to radio drop-outs. As - such, it generally provides a more complete and precise record. - The 'Download Data' menu entry allows you to read the - flash memory and write it to disk. - </para> - <para> - Select the 'Download Data' menu entry to bring up a list of - connected TeleGPS devices. After the device has been - selected, a dialog showing the data stored in the - device will be shown allowing you to select which entries to - download and which to delete. You must erase flights in order for the space they - consume to be reused by another track. This prevents - accidentally losing data if you neglect to download - data before starting TeleGPS again. Note that if there is no more - space available in the device, then no data will be recorded. - </para> - <para> - The file name for each data log is computed automatically - from the recorded date, altimeter serial number and flight - number information. - </para> - </section> - <section> - <title>Configure Device</title> - <informalfigure> - <mediaobject> - <imageobject> - <imagedata fileref="telegps-configure.png" width="3.6in" scalefit="1"/> - </imageobject> - </mediaobject> - </informalfigure> - <para> - Select this button and then select any connected TeleGPS - device from the list provided. - </para> - <para> - The first few lines of the dialog provide information about the - connected device, including the product name, - software version and hardware serial number. Below that are the - individual configuration entries. - </para> - <para> - At the bottom of the dialog, there are four buttons: - </para> - <variablelist> - <varlistentry> - <term>Save</term> - <listitem> - <para> - This writes any changes to the - configuration parameter block in flash memory. If you don't - press this button, any changes you make will be lost. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Reset</term> - <listitem> - <para> - This resets the dialog to the most recently saved values, - erasing any changes you have made. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Reboot</term> - <listitem> - <para> - This reboots the device. This will restart logging for - a new flight number, if any log information has been - saved for the current flight. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Close</term> - <listitem> - <para> - This closes the dialog. Any unsaved changes will be - lost. - </para> - </listitem> - </varlistentry> - </variablelist> - <para> - The rest of the dialog contains the parameters to be configured. - </para> - <section> - <title>Frequency</title> - <para> - This configures which of the frequencies to use for both - telemetry and packet command mode. Note that if you set this - value via packet command mode, the TeleDongle frequency will - also be automatically reconfigured to match so that - communication will continue afterwards. - </para> - </section> - <section> - <title>RF Calibration</title> - <para> - The radios in every Altus Metrum device are calibrated at the - factory to ensure that they transmit and receive on the - specified frequency. If you need to you can adjust the calibration - by changing this value. Do not do this without understanding what - the value means, read the appendix on calibration and/or the source - code for more information. To change a TeleDongle's calibration, - you must reprogram the unit completely. - </para> - </section> - <section> - <title>Telemetry/RDF/APRS Enable</title> - <para> - Enables the radio for transmission during flight. When - disabled, the radio will not transmit anything during flight - at all. - </para> - </section> - <section> - <title>APRS Interval</title> - <para> - How often to transmit GPS information via APRS (in - seconds). When set to zero, APRS transmission is - disabled. This option is available on TeleMetrum v2 and - TeleMega boards. TeleMetrum v1 boards cannot transmit APRS - packets. Note that a single APRS packet takes nearly a full - second to transmit, so enabling this option will prevent - sending any other telemetry during that time. - </para> - </section> - <section> - <title>Callsign</title> - <para> - This sets the call sign included in each telemetry packet. Set this - as needed to conform to your local radio regulations. - </para> - </section> - <section> - <title>Maximum Log Size</title> - <para> - This sets the space (in kilobytes) allocated for each data - log. The available space will be divided into chunks of this - size. A smaller value will allow more logs to be stored, - a larger value will record data for longer times. - </para> - </section> - <section> - <title>Logging Trigger Motion</title> - <para> - If TeleGPS moves less than this distance over a long period - of time, it will not log that location, saving storage space. - </para> - </section> - <section> - <title>Position Reporting Interval</title> - <para> - This sets how often TeleGPS reports position information via - telemetry and to the on-board log. Reducing this value will - save power and logging memory consumption. - </para> - </section> - </section> - <section> - <title>Flash Device</title> - <para> - This reprograms TeleGPS devices with new firmware. Please - read the directions for flashing devices in the Updating - Device Firmware chapter below. - </para> - </section> - </section> - </chapter> - <chapter> - <title>Updating Device Firmware</title> - <para> - TeleGPS is programmed directly over its USB connectors. - </para> - <para> - You may wish to begin by ensuring you have current firmware images. - These are distributed as part of the TeleGPS software bundle that - also includes the TeleGPS ground station program. Newer ground - station versions typically work fine with older firmware versions, - so you don't need to update your devices just to try out new - software features. You can always download the most recent - version from <ulink url="http://www.altusmetrum.org/AltOS/"/>. - </para> - <section> - <title> - Updating TeleGPS Firmware - </title> - <orderedlist inheritnum='inherit' numeration='arabic'> - <listitem> - <para> - Attach a battery and power switch to the target - device. Power up the device. - </para> - </listitem> - <listitem> - <para> - Using a Micro USB cable, connect the target device to your - computer's USB socket. - </para> - </listitem> - <listitem> - <para> - Run TeleGPS, and select 'Flash Device' from the Device menu. - </para> - </listitem> - <listitem> - <para> - Select the target device in the Device Selection dialog. - </para> - </listitem> - <listitem> - <para> - Select the image you want to flash to the device, which - should have a name in the form - <product>-v<product-version>-<software-version>.ihx, such - as TeleGPS-v1.0-1.4.0.ihx. - </para> - </listitem> - <listitem> - <para> - Make sure the configuration parameters are reasonable - looking. If the serial number and/or RF configuration - values aren't right, you'll need to change them. - </para> - </listitem> - <listitem> - <para> - Hit the 'OK' button and the software should proceed to flash - the device with new firmware, showing a progress bar. - </para> - </listitem> - <listitem> - <para> - Verify that the device is working by using the 'Configure - Altimeter' item to check over the configuration. - </para> - </listitem> - </orderedlist> -<!-- - <section> - <title>Recovering From Self-Flashing Failure</title> - <para> - If the firmware loading fails, it can leave the device - unable to boot. Not to worry, you can force the device to - start the boot loader instead, which will let you try to - flash the device again. - </para> - <para> - On each device, connecting two pins from one of the exposed - connectors will force the boot loader to start, even if the - regular operating system has been corrupted in some way. - </para> - <variablelist> - <varlistentry> - <term>TeleMega</term> - <listitem> - <para> - Connect pin 6 and pin 1 of the companion connector. Pin 1 - can be identified by the square pad around it, and then - the pins could sequentially across the board. Be very - careful to <emphasis>not</emphasis> short pin 8 to - anything as that is connected directly to the battery. Pin - 7 carries 3.3V and the board will crash if that is - connected to pin 1, but shouldn't damage the board. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>TeleMetrum v2</term> - <listitem> - <para> - Connect pin 6 and pin 1 of the companion connector. Pin 1 - can be identified by the square pad around it, and then - the pins could sequentially across the board. Be very - careful to <emphasis>not</emphasis> short pin 8 to - anything as that is connected directly to the battery. Pin - 7 carries 3.3V and the board will crash if that is - connected to pin 1, but shouldn't damage the board. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>EasyMini</term> - <listitem> - <para> - Connect pin 6 and pin 1 of the debug connector, which is - the six holes next to the beeper. Pin 1 can be identified - by the square pad around it, and then the pins could - sequentially across the board, making Pin 6 the one on the - other end of the row. - </para> - </listitem> - </varlistentry> - </variablelist> - </section> - --> - </section> - </chapter> - <chapter> - <title>Technical Information</title> - <section> - <title>GPS Receiver</title> - <para> - TeleGPS uses the u-Blox Max-7Q GPS receiver. - </para> - </section> - <section> - <title>Micro-controller</title> - <para> - TeleGPS uses an NXP LPC11U14 micro-controller. This tiny - CPU contains 32kB of flash for the application and 4kB of RAM for - temporary data storage. - </para> - </section> - <section> - <title>Lithium Polymer Battery</title> - <para> - Shipping restrictions may prevent us from including a battery - battery with TeleGPS. - </para> - </section> - <section> - <title>Mechanical Considerations</title> - <para> - TeleGPS is designed to be rugged enough for typical rocketry - applications. The 4 mounting holes on the board are sized for - use with 4-40 or M3 screws. - </para> - </section> - <section> - <title>On-board data storage</title> - <para> - TeleGPS has 2MB of non-volatile storage, separate from the - code storage memory. The TeleGPS firmware uses this to log - information during flight. - </para> - </section> - </chapter> - <appendix> - <title>Release Notes</title> - <simplesect> - <title>Version 1.6</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.6.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.4.1</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.4.1.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - <simplesect> - <title>Version 1.4</title> - <xi:include - xmlns:xi="http://www.w3.org/2001/XInclude" - href="release-notes-1.4.xsl" - xpointer="xpointer(/article/*)"/> - </simplesect> - </appendix> -</book> -<!-- LocalWords: Altusmetrum TeleGPS ---> diff --git a/doc/telemega-outline.txt b/doc/telemega-outline.txt new file mode 100644 index 00000000..1af91894 --- /dev/null +++ b/doc/telemega-outline.txt @@ -0,0 +1,9 @@ += TeleMega Outline and Hole Pattern +:doctype: article + + This image, when printed, provides a precise template for the + mounting holes in TeleMega. TeleMega has overall dimensions of + 1.250 x 3.250 inches, and the mounting holes are sized for use + with 4-40 or M3 screws. + + image::telemega.svg[align="center"] diff --git a/doc/telemega-outline.xsl b/doc/telemega-outline.xsl deleted file mode 100644 index 5d3411e9..00000000 --- a/doc/telemega-outline.xsl +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" - "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> -<article> - <title>TeleMega Outline and Hole Pattern</title> - <para> - This image, when printed, provides a precise template for the - mounting holes in TeleMega. TeleMega has overall dimensions - of 1.250 x 3.250 inches, and the mounting holes are sized for - use with 4-40 or M3 screws. - </para> - <informalfigure> - <mediaobject id="TeleMegaTemplate"> - <imageobject> - <imagedata format="SVG" fileref="telemega.svg" - scalefit="0" scale="100" align="center" /> - </imageobject> - </mediaobject> - </informalfigure> -</article> - -<!-- LocalWords: Altusmetrum ---> diff --git a/doc/telemega.inc b/doc/telemega.inc new file mode 100644 index 00000000..55f77bc4 --- /dev/null +++ b/doc/telemega.inc @@ -0,0 +1,135 @@ +== TeleMega + + .TeleMega Board + image::telemega-v1.0-top.jpg[width="5.5in"] + + TeleMega is a 1¼ inch by 3¼ inch circuit board. It was + designed to easily fit in a 38mm coupler. Like TeleMetrum, + TeleMega has an accelerometer and so it must be mounted so that + the board is aligned with the flight axis. It can be mounted + either antenna up or down. + + TeleMega v2.0 has a few minor changes from v1.0: + + * Companion connector matches EasyMega functions + * Serial port connector replaced with servo connector with + support for up to 4 PWM channels. + * Radio switched from cc1120 to cc1200. + + None of these affect operation using the stock firmware, but + they do mean that the device needs different firmware to + operate correctly, so make sure you load the right firmware + when reflashing the device. + + === TeleMega Screw Terminals + + TeleMega has two sets of nine screw terminals on the end of + the board opposite the telemetry antenna. They are as follows: + + .TeleMega Screw Terminals + [options="header",grid="all",cols="2,3,10"] + |==== + |Terminal #|Terminal Name|Description + + |Top 1 + |Switch Input + |Switch connection to positive battery terminal + + |Top 2 + |Switch Output + |Switch connection to flight computer + + |Top 3 + |GND + |Ground connection for use with external active switch + + |Top 4 + |Main - + |Main pyro channel connection to pyro circuit + + |Top 5 + |Main + + |Main pyro channel common connection to battery + + + |Top 6 + |Apogee - + |Apogee pyro channel connection to pyro circuit + + |Top 7 + |Apogee + + |Apogee pyro channel common connection to battery + + + |Top 8 + |D - + |D pyro channel connection to pyro circuit + + |Top 9 + |D + + |D pyro channel common connection to battery + + + |Bottom 1 + |GND + |Ground connection for negative pyro battery terminal + + |Bottom 2 + |Pyro + |Positive pyro battery terminal + + |Bottom 3 + |Lipo + |Power switch output. Use to connect main battery to pyro battery input + + |Bottom 4 + |A - + |A pyro channel connection to pyro circuit + + |Bottom 5 + |A + + |A pyro channel common connection to battery + + + |Bottom 6 + |B - + |B pyro channel connection to pyro circuit + + |Bottom 7 + |B + + |B pyro channel common connection to battery + + + |Bottom 8 + |C - + |C pyro channel connection to pyro circuit + + |Bottom 9 + |C + + |C pyro channel common connection to battery + + |==== + + === Using a Separate Pyro Battery with TeleMega + + TeleMega provides explicit support for an external pyro + battery. All that is required is to remove the jumper + between the lipo terminal (Bottom 3) and the pyro terminal + (Bottom 2). Then hook the negative pyro battery terminal to ground + (Bottom 1) and the positive pyro battery to the pyro battery + input (Bottom 2). You can then use the existing pyro screw + terminals to hook up all of the pyro charges. + + === Using Only One Battery With TeleMega + + Because TeleMega has built-in support for a separate pyro + battery, if you want to fly with just one battery running + both the computer and firing the charges, you need to + connect the flight computer battery to the pyro + circuit. TeleMega has two screw terminals for this—hook a + wire from the Lipo terminal (Bottom 3) to the Pyro terminal + (Bottom 2). + + === Using an Active Switch with TeleMega + + As explained above, an external active switch requires three + connections, one to the positive battery terminal, one to + the flight computer positive input and one to ground. + + The positive battery terminal is available on Top terminal + 1, the positive flight computer input is on Top terminal + 2. Ground is on Top terminal 3. diff --git a/doc/telemetrum-outline.txt b/doc/telemetrum-outline.txt new file mode 100644 index 00000000..ab6871f9 --- /dev/null +++ b/doc/telemetrum-outline.txt @@ -0,0 +1,9 @@ += TeleMetrum Outline and Hole Pattern +:doctype: article + + This image, when printed, provides a precise template for the + mounting holes in TeleMetrum. TeleMetrum has overall dimensions of + 1.000 x 2.750 inches, and the mounting holes are sized for use + with 4-40 or M3 screws. + + image::telemetrum.svg[align="center"] diff --git a/doc/telemetrum-outline.xsl b/doc/telemetrum-outline.xsl deleted file mode 100644 index 4a0ade47..00000000 --- a/doc/telemetrum-outline.xsl +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" - "/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> -<article> - <title>TeleMetrum Outline and Hole Pattern</title> - <para> - This image, when printed, provides a precise template for the - mounting holes in TeleMetrum. TeleMetrum has overall dimensions - of 1.000 x 2.750 inches, and the mounting holes are sized for - use with 4-40 or M3 screws. - </para> - <informalfigure> - <mediaobject id="TeleMetrumTemplate"> - <imageobject> - <imagedata format="SVG" fileref="telemetrum.svg" - scalefit="0" scale="100" align="center" /> - </imageobject> - </mediaobject> - </informalfigure> -</article> - -<!-- LocalWords: Altusmetrum ---> diff --git a/doc/telemetrum-v2.0-th.jpg b/doc/telemetrum-v2.0-th.jpg Binary files differnew file mode 100644 index 00000000..ceec699d --- /dev/null +++ b/doc/telemetrum-v2.0-th.jpg diff --git a/doc/telemetrum.inc b/doc/telemetrum.inc new file mode 100644 index 00000000..7c9dadb5 --- /dev/null +++ b/doc/telemetrum.inc @@ -0,0 +1,85 @@ +== TeleMetrum + + .TeleMetrum v2 Board + image::telemetrum-v2.0-th.jpg[width="5.5in"] + + .TeleMetrum v1 Board + image::telemetrum-v1.1-thside.jpg[width="5.5in"] + + TeleMetrum is a 1 inch by 2¾ inch circuit board. It was designed to + fit inside coupler for 29mm air-frame tubing, but using it in a tube that + small in diameter may require some creativity in mounting and wiring + to succeed! The presence of an accelerometer means TeleMetrum should + be aligned along the flight axis of the airframe, and by default the ¼ + wave UHF wire antenna should be on the nose-cone end of the board. The + antenna wire is about 7 inches long, and wiring for a power switch and + the e-matches for apogee and main ejection charges depart from the + fin can end of the board, meaning an ideal “simple” avionics + bay for TeleMetrum should have at least 10 inches of interior length. + + There are two generations of the TeleMetrum design. The + major changes in the v2 generation are: + + * uBlox GPS chip certified for altitude records + + * Higher power radio (40mW vs 10mW) + + * APRS support + + Otherwise, they're the same size, with mounting holes and + screw terminals in the same position. + + === TeleMetrum Screw Terminals + + TeleMetrum has six screw terminals on the end of the board + opposite the telemetry antenna. Two are for the power + switch, and two each for the apogee and main igniter + circuits. Using the picture above and starting from the top, + the terminals are as follows: + + .TeleMetrum Screw Terminals + [options="header",grid="all",cols="2,3,10"] + |========================= + |Terminal #|Terminal Name|Description + |1 |Switch Output |Switch connection to flight computer + |2 |Switch Input |Switch connection to positive battery terminal + |3 |Main + |Main pyro channel common connection to battery + + |4 |Main - |Main pyro channel connection to pyro circuit + |5 |Apogee + |Apogee pyro channel common connection to battery + + |6 |Apogee - |Apogee pyro channel connection to pyro circuit + |======================== + + === Using a Separate Pyro Battery with TeleMetrum + + As described above, using an external pyro battery involves + connecting the negative battery terminal to the flight + computer ground, connecting the positive battery terminal to + one of the igniter leads and connecting the other igniter + lead to the per-channel pyro circuit connection. + + To connect the negative battery terminal to the TeleMetrum + ground, insert a small piece of wire, 24 to 28 gauge + stranded, into the GND hole just above the screw terminal + strip and solder it in place. + + Connecting the positive battery terminal to the pyro + charges must be done separate from TeleMetrum, by soldering + them together or using some other connector. + + + The other lead from each pyro charge is then inserted into + the appropriate per-pyro channel screw terminal (terminal 4 for the + Main charge, terminal 6 for the Apogee charge). + + === Using an Active Switch with TeleMetrum + + As explained above, an external active switch requires three + connections, one to the positive battery terminal, one to + the flight computer positive input and one to ground. + + + The positive battery terminal is available on screw terminal + 2, the positive flight computer input is on terminal 1. To + hook a lead to ground, solder a piece of wire, 24 to 28 + gauge stranded, to the GND hole just above terminal 1. + diff --git a/doc/telemetry-docinfo.xml b/doc/telemetry-docinfo.xml new file mode 100644 index 00000000..19f90ca4 --- /dev/null +++ b/doc/telemetry-docinfo.xml @@ -0,0 +1,28 @@ +<subtitle>Packet Definitions</subtitle> +<author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <email>keithp@keithp.com</email> +</author> +<date>1 July 2011</date> +<copyright> + <year>2011</year> + <holder>Keith Packard</holder> +</copyright> +<legalnotice> + <para> + This document is released under the terms of the + <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> + Creative Commons ShareAlike 3.0 + </ulink> + license. + </para> +</legalnotice> +<revhistory> + <?dbhtml filename="telemetry-revhistory.html"?> + <revision> + <revnumber>0.1</revnumber> + <date>1 July 2011</date> + <revremark>Initial content</revremark> + </revision> +</revhistory> diff --git a/doc/telemetry.txt b/doc/telemetry.txt new file mode 100644 index 00000000..36d2edba --- /dev/null +++ b/doc/telemetry.txt @@ -0,0 +1,571 @@ += AltOS Telemetry +:doctype: article +:toc: +:numbered: + +== Packet Format Design + + AltOS telemetry data is split into multiple different packets, + all the same size, but each includs an identifier so that the + ground station can distinguish among different types. A single + flight board will transmit multiple packet types, each type on + a different schedule. The ground software need look for only a + single packet size, and then decode the information within the + packet and merge data from multiple packets to construct the + full flight computer state. + + Each AltOS packet is 32 bytes long. This size was chosen based + on the known telemetry data requirements. The power of two + size allows them to be stored easily in flash memory without + having them split across blocks or leaving gaps at the end. + + All packet types start with a five byte header which encodes + the device serial number, device clock value and the packet + type. The remaining 27 bytes encode type-specific data. + +== Packet Formats + + This section first defines the packet header common to all packets + and then the per-packet data layout. + + === Packet Header + + .Telemetry Packet Header + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |0 |uint16_t |serial |Device serial Number + |2 |uint16_t |tick |Device time in 100ths of a second + |4 |uint8_t |type |Packet type + |5 + |==== + + Each packet starts with these five bytes which serve to identify + which device has transmitted the packet, when it was transmitted + and what the rest of the packet contains. + + === TeleMetrum v1.x, TeleMini and TeleNano Sensor Data + + .Sensor Packet Type + [options="border",cols="1,3"] + |==== + |Type |Description + |0x01 |TeleMetrum v1.x Sensor Data + |0x02 |TeleMini Sensor Data + |0x03 |TeleNano Sensor Data + |==== + + TeleMetrum v1.x, TeleMini and TeleNano share this same + packet format for sensor data. Each uses a distinct + packet type so that the receiver knows which data + values are valid and which are undefined. + + Sensor Data packets are transmitted once per second on + the ground, 10 times per second during ascent and once + per second during descent and landing + + .Sensor Packet Contents + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |5 |uint8_t |state |Flight state + |6 |int16_t |accel |accelerometer (TM only) + |8 |int16_t |pres |pressure sensor + |10 |int16_t |temp |temperature sensor + |12 |int16_t |v_batt |battery voltage + |14 |int16_t |sense_d |drogue continuity sense (TM/Tm) + |16 |int16_t |sense_m |main continuity sense (TM/Tm) + |18 |int16_t |acceleration |m/s² * 16 + |20 |int16_t |speed |m/s * 16 + |22 |int16_t |height |m + |24 |int16_t |ground_pres |Average barometer reading on ground + |26 |int16_t |ground_accel |TM + |28 |int16_t |accel_plus_g |TM + |30 |int16_t |accel_minus_g |TM + |32 + |==== + + === TeleMega Sensor Data + + .TeleMega Packet Type + [options="border",cols="1,3"] + |==== + |Type |Description + |0x08 |TeleMega IMU Sensor Data + |0x09 |TeleMega Kalman and Voltage Data + |==== + + TeleMega has a lot of sensors, and so it splits the sensor + data into two packets. The raw IMU data are sent more often; + the voltage values don't change very fast, and the Kalman + values can be reconstructed from the IMU data. + + IMU Sensor Data packets are transmitted once per second on the + ground, 10 times per second during ascent and once per second + during descent and landing + + Kalman and Voltage Data packets are transmitted once per second on the + ground, 5 times per second during ascent and once per second + during descent and landing + + The high-g accelerometer is reported separately from the data + for the 9-axis IMU (accel/gyro/mag). The 9-axis IMU is mounted + so that the X axis is "across" the board (along the short + axis0, the Y axis is "along" the board (along the long axis, + with the high-g accelerometer) and the Z axis is "through" the + board (perpendicular to the board). Rotation measurements are + around the respective axis, so Y rotation measures the spin + rate of the rocket while X and Z rotation measure the tilt + rate. + + The overall tilt angle of the rocket is computed by first + measuring the orientation of the rocket on the pad using the 3 + axis accelerometer, and then integrating the overall tilt rate + from the 3 axis gyroscope to compute the total orientation + change of the airframe since liftoff. + + .TeleMega IMU Sensor Packet Contents + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |5 |uint8_t |orient |Angle from vertical in degrees + |6 |int16_t |accel |High G accelerometer + |8 |int32_t |pres |pressure (Pa * 10) + |12 |int16_t |temp |temperature (°C * 100) + |14 |int16_t |accel_x |X axis acceleration (across) + |16 |int16_t |accel_y |Y axis acceleration (along) + |18 |int16_t |accel_z |Z axis acceleration (through) + |20 |int16_t |gyro_x |X axis rotation (across) + |22 |int16_t |gyro_y |Y axis rotation (along) + |24 |int16_t |gyro_z |Z axis rotation (through) + |26 |int16_t |mag_x |X field strength (across) + |28 |int16_t |mag_y |Y field strength (along) + |30 |int16_t |mag_z |Z field strength (through) + |32 + |==== + + .TeleMega Kalman and Voltage Data Packet Contents + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |5 |uint8_t |state |Flight state + |6 |int16_t |v_batt |battery voltage + |8 |int16_t |v_pyro |pyro battery voltage + |10 |int8_t[6] |sense |pyro continuity sense + |16 |int32_t |ground_pres |Average barometer reading on ground + |20 |int16_t |ground_accel |Average accelerometer reading on ground + |22 |int16_t |accel_plus_g |Accel calibration at +1g + |24 |int16_t |accel_minus_g |Accel calibration at -1g + |26 |int16_t |acceleration |m/s² * 16 + |28 |int16_t |speed |m/s * 16 + |30 |int16_t |height |m + |32 + |==== + + === TeleMetrum v2 Sensor Data + + .TeleMetrum v2 Packet Type + [options="border",cols="1,3"] + |==== + |Type |Description + |0x0A |TeleMetrum v2 Sensor Data + |0x0B |TeleMetrum v2 Calibration Data + |==== + + TeleMetrum v2 has higher resolution barometric data than + TeleMetrum v1, and so the constant calibration data is + split out into a separate packet. + + TeleMetrum v2 Sensor Data packets are transmitted once per second on the + ground, 10 times per second during ascent and once per second + during descent and landing + + TeleMetrum v2 Calibration Data packets are always transmitted once per second. + + .TeleMetrum v2 Sensor Packet Contents + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |5 |uint8_t |state |Flight state + |6 |int16_t |accel |accelerometer + |8 |int32_t |pres |pressure sensor (Pa * 10) + |12 |int16_t |temp |temperature sensor (°C * 100) + |14 |int16_t |acceleration |m/s² * 16 + |16 |int16_t |speed |m/s * 16 + |18 |int16_t |height |m + |20 |int16_t |v_batt |battery voltage + |22 |int16_t |sense_d |drogue continuity sense + |24 |int16_t |sense_m |main continuity sense + |26 |pad[6] |pad bytes | + |32 + |==== + + .TeleMetrum v2 Calibration Data Packet Contents + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |5 |pad[3] |pad bytes | + |8 |int32_t |ground_pres |Average barometer reading on ground + |12 |int16_t |ground_accel |Average accelerometer reading on ground + |14 |int16_t |accel_plus_g |Accel calibration at +1g + |16 |int16_t |accel_minus_g |Accel calibration at -1g + |18 |pad[14] |pad bytes | + |32 + |==== + + === Configuration Data + + .Configuration Packet Type + [options="border",cols="1,3"] + |==== + |Type |Description + |0x04 |Configuration Data + |==== + + This provides a description of the software installed on the + flight computer as well as any user-specified configuration data. + + Configuration data packets are transmitted once per second + during all phases of the flight + + .Configuration Packet Contents + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |5 |uint8_t |type |Device type + |6 |uint16_t |flight |Flight number + |8 |uint8_t |config_major |Config major version + |9 |uint8_t |config_minor |Config minor version + |10 |uint16_t |apogee_delay |Apogee deploy delay in seconds + |12 |uint16_t |main_deploy |Main deploy alt in meters + |14 |uint16_t |flight_log_max |Maximum flight log size (kB) + |16 |char |callsign[8] |Radio operator identifier + |24 |char |version[8] |Software version identifier + |32 + |==== + + === GPS Location + + .GPS Packet Type + [options="border",cols="1,3"] + |==== + |Type |Description + |0x05 |GPS Location + |==== + + This packet provides all of the information available from the + GPS receiver—position, time, speed and precision + estimates. + + GPS Location packets are transmitted once per second during + all phases of the flight + + .GPS Location Packet Contents + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |5 |uint8_t |flags |See GPS Flags table below + |6 |int16_t |altitude |m + |8 |int32_t |latitude |degrees * 107 + |12 |int32_t |longitude |degrees * 107 + |16 |uint8_t |year | + |17 |uint8_t |month | + |18 |uint8_t |day | + |19 |uint8_t |hour | + |20 |uint8_t |minute | + |21 |uint8_t |second | + |22 |uint8_t |pdop |* 5 + |23 |uint8_t |hdop |* 5 + |24 |uint8_t |vdop |* 5 + |25 |uint8_t |mode |See GPS Mode table below + |26 |uint16_t |ground_speed |cm/s + |28 |int16_t |climb_rate |cm/s + |30 |uint8_t |course |/ 2 + |31 |uint8_t |unused[1] | + |32 + |==== + + Packed into a one byte field are status flags and the + count of satellites used to compute the position + fix. Note that this number may be lower than the + number of satellites being tracked; the receiver will + not use information from satellites with weak signals + or which are close enough to the horizon to have + significantly degraded position accuracy. + + .GPS Flags + [options="border",cols="1,2,7"] + |==== + |Bits |Name |Description + |0-3 |nsats |Number of satellites in solution + |4 |valid |GPS solution is valid + |5 |running |GPS receiver is operational + |6 |date_valid |Reported date is valid + |7 |course_valid |ground speed, course and climb rates are valid + |==== + + Here are all of the valid GPS operational modes. Altus + Metrum products will only ever report 'N' (not valid), + 'A' (Autonomous) modes or 'E' (Estimated). The + remaining modes are either testing modes or require + additional data. + + .GPS Mode + [options="border",cols="1,3,7"] + |==== + |Mode |Name |Description + |N |Not Valid |All data are invalid + |A |Autonomous mode | + Data are derived from satellite data + + |D |Differential Mode | + Data are augmented with differential data from a + known ground station. The SkyTraq unit in TeleMetrum + does not support this mode + + |E |Estimated | + Data are estimated using dead reckoning from the + last known data + + |M |Manual | + Data were entered manually + + |S |Simulated | + GPS receiver testing mode + + |==== + + === GPS Satellite Data + + .GPS Satellite Data Packet Type + [options="border",cols="1,3"] + |==== + |Type |Description + |0x06 |GPS Satellite Data + |==== + + This packet provides space vehicle identifiers and + signal quality information in the form of a C/N1 + number for up to 12 satellites. The order of the svids + is not specified. + + GPS Satellite data are transmitted once per second + during all phases of the flight. + + .GPS Satellite Data Contents + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |5 |uint8_t |channels |Number of reported satellite information + |6 |sat_info_t |sats[12] |See Per-Satellite data table below + |30 |uint8_t |unused[2] | + |32 + |==== + + .GPS Per-Satellite data (sat_info_t) + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |0 |uint8_t |svid |Space Vehicle Identifier + |1 |uint8_t |c_n_1 |C/N1 signal quality indicator + |2 + |==== + + === Companion Data + + .Companion Data Packet Type + [options="border",cols="1,3"] + |==== + |Type |Description + |0x07 |Companion Data + |==== + + When a companion board is attached to TeleMega or + TeleMetrum, it can provide telemetry data to be + included in the downlink. The companion board can + provide up to 12 16-bit data values. + + The companion board itself specifies the transmission + rate. On the ground and during descent, that rate is + limited to one packet per second. During ascent, that + rate is limited to 10 packets per second. + + .Companion Data Contents + [options="border",cols="2,3,3,9"] + |==== + |Offset |Data Type |Name |Description + |5 |uint8_t |board_id |Type of companion board attached + |6 |uint8_t |update_period |How often telemetry is sent, in 1/100ths of a second + |7 |uint8_t |channels |Number of data channels supplied + |8 |uint16_t[12] |companion_data |Up to 12 channels of 16-bit companion data + |32 + |==== + +== Data Transmission + + Altus Metrum devices use Texas Instruments sub-GHz digital + radio products. Ground stations use parts with HW FEC while + some flight computers perform FEC in software. TeleGPS is + transmit-only. + + .Altus Metrum Radio Parts + [options="border",cols="1,4,4"] + |==== + |Part Number |Description |Used in + + |CC1111 + |10mW transceiver with integrated SoC + |TeleDongle v0.2, TeleBT v1.0, TeleMetrum v1.x, TeleMini + + |CC1120 + |35mW transceiver with SW FEC + |TeleMetrum v2, TeleMega + + |CC1200 + |35mW transceiver with HW FEC + |TeleDongle v3.0, TeleBT v3.0 + + |CC115L + |14mW transmitter with SW FEC + |TeleGPS + + |==== + + === Modulation Scheme + + Texas Instruments provides a tool for computing + modulation parameters given a desired modulation + format and basic bit rate. + + While we might like to use something with better + low-signal performance like BPSK, the radios we use + don't support that, but do support Gaussian frequency + shift keying (GFSK). Regular frequency shift keying + (FSK) encodes the signal by switching the carrier + between two frequencies. The Gaussian version is + essentially the same, but the shift between + frequencies gently follows a gaussian curve, rather + than switching immediately. This tames the bandwidth + of the signal without affecting the ability to + transmit data. + + For AltOS, there are three available bit rates, + 38.4kBaud, 9.6kBaud and 2.4kBaud resulting in the + following signal parmeters: + + .Modulation Scheme + [options="border",cols="1,1,1"] + |==== + |Rate |Deviation |Receiver Bandwidth + |38.4kBaud |20.5kHz |100kHz + |9.6kBaud |5.125kHz |25kHz + |2.4kBaud |1.5kHz |5kHz + |==== + + === Error Correction + + The cc1111 and cc1200 provide forward error correction + in hardware; on the cc1120 and cc115l that's done in + software. AltOS uses this to improve reception of weak + signals. As it's a rate 1/2 encoding, each bit of data + takes two bits when transmitted, so the effective data + rate is half of the raw transmitted bit rate. + + .Error Correction + [options="border",cols="1,1,1"] + |==== + |Parameter |Value |Description + + |Error Correction + |Convolutional coding + |1/2 rate, constraint length m=4 + + |Interleaving + |4 x 4 + |Reduce effect of noise burst + + |Data Whitening + |XOR with 9-bit PNR + |Rotate right with bit 8 = bit 0 xor bit 5, initial value 111111111 + + |==== + +== TeleDongle serial packet format + + TeleDongle does not do any interpretation of the packet data, + instead it is configured to receive packets of a specified + length (32 bytes in this case). For each received packet, + TeleDongle produces a single line of text. This line starts with + the string "TELEM " and is followed by a list of hexadecimal + encoded bytes. + + .... + TELEM 224f01080b05765e00701f1a1bbeb8d7b60b070605140c000600000000000000003fa988 + .... + + The hexadecimal encoded string of bytes contains a length byte, + the packet data, two bytes added by the cc1111 radio receiver + hardware and finally a checksum so that the host software can + validate that the line was transmitted without any errors. + + .TeleDongle serial Packet Format + + [options="border",cols="2,1,1,5"] + |==== + |Offset |Name |Example |Description + + |0 + |length + |22 + |Total length of data bytes in the line. Note that + this includes the added RSSI and status bytes + + |1 ·· length-3 + |packet + |4f ·· 00 + |Bytes of actual packet data + + |length-2 + |rssi + |3f + |Received signal strength. dBm = rssi / 2 - 74 + + |length-1 + |lqi + |a9 + |Link Quality Indicator and CRC status. Bit 7 + is set when the CRC is correct + + |length + |checksum + |88 + |(0x5a + sum(bytes 1 ·· length-1)) % 256 + + |==== + +== History and Motivation + + The original AltoOS telemetry mechanism encoded everything + available piece of information on the TeleMetrum hardware into a + single unified packet. Initially, the packets contained very + little data—some raw sensor readings along with the current GPS + coordinates when a GPS receiver was connected. Over time, the + amount of data grew to include sensor calibration data, GPS + satellite information and a host of internal state information + designed to help diagnose flight failures in case of a loss of + the on-board flight data. + + Because every packet contained all of the data, packets were + huge—95 bytes long. Much of the information was also specific to + the TeleMetrum hardware. With the introduction of the TeleMini + flight computer, most of the data contained in the telemetry + packets was unavailable. Initially, a shorter, but still + comprehensive packet was implemented. This required that the + ground station be pre-configured as to which kind of packet to + expect. + + The development of several companion boards also made the + shortcomings evident—each companion board would want to include + telemetry data in the radio link; with the original design, the + packet would have to hold the new data as well, requiring + additional TeleMetrum and ground station changes. diff --git a/doc/telemetry.xsl b/doc/telemetry.xsl deleted file mode 100644 index 2e0b3ea1..00000000 --- a/doc/telemetry.xsl +++ /dev/null @@ -1,1230 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" -"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd"> - -<article> - <articleinfo> - <title>AltOS Telemetry</title> - <subtitle>Packet Definitions</subtitle> - <author> - <firstname>Keith</firstname> - <surname>Packard</surname> - </author> - <copyright> - <year>2011</year> - <holder>Keith Packard</holder> - </copyright> - <legalnotice> - <para> - This document is released under the terms of the - <ulink url="http://creativecommons.org/licenses/by-sa/3.0/"> - Creative Commons ShareAlike 3.0 - </ulink> - license. - </para> - </legalnotice> - <revhistory> - <revision> - <revnumber>0.1</revnumber> - <date>01 July 2011</date> - <revremark>Initial content</revremark> - </revision> - </revhistory> - </articleinfo> - <section> - <title>Packet Format Design</title> - <para> - AltOS telemetry data is split into multiple different packets, - all the same size, but each includs an identifier so that the - ground station can distinguish among different types. A single - flight board will transmit multiple packet types, each type on a - different schedule. The ground software need look for only a - single packet size, and then decode the information within the - packet and merge data from multiple packets to construct the - full flight computer state. - </para> - <para> - Each AltOS packet is 32 bytes long. This size was chosen based - on the known telemetry data requirements. The power of two size - allows them to be stored easily in flash memory without having - them split across blocks or leaving gaps at the end. - </para> - <para> - All packet types start with a five byte header which encodes the - device serial number, device clock value and the packet - type. The remaining 27 bytes encode type-specific data. - </para> - </section> - <section> - <title>Packet Formats</title> - <para> - This section first defines the packet header common to all packets - and then the per-packet data layout. - </para> - <section> - <title>Packet Header</title> - <table frame='all'> - <title>Telemetry Packet Header</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0</entry> - <entry>uint16_t</entry> - <entry>serial</entry> - <entry>Device serial Number</entry> - </row> - <row> - <entry>2</entry> - <entry>uint16_t</entry> - <entry>tick</entry> - <entry>Device time in 100ths of a second</entry> - </row> - <row> - <entry>4</entry> - <entry>uint8_t</entry> - <entry>type</entry> - <entry>Packet type</entry> - </row> - <row> - <entry>5</entry> - </row> - </tbody> - </tgroup> - </table> - <para> - Each packet starts with these five bytes which serve to identify - which device has transmitted the packet, when it was transmitted - and what the rest of the packet contains. - </para> - </section> - <section> - <title>TeleMetrum v1.x, TeleMini and TeleNano Sensor Data</title> - <informaltable frame='none' label='' tocentry='0'> - <tgroup cols='2' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='left' colwidth='3*' colname='Description'/> - <thead> - <row> - <entry>Type</entry> - <entry>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0x01</entry> - <entry>TeleMetrum v1.x Sensor Data</entry> - </row> - <row> - <entry>0x02</entry> - <entry>TeleMini Sensor Data</entry> - </row> - <row> - <entry>0x03</entry> - <entry>TeleNano Sensor Data</entry> - </row> - </tbody> - </tgroup> - </informaltable> - <para> - TeleMetrum v1.x, TeleMini and TeleNano share this same packet - format for sensor data. Each uses a distinct packet type so - that the receiver knows which data values are valid and which - are undefined. - </para> - <para> - Sensor Data packets are transmitted once per second on the - ground, 10 times per second during ascent and once per second - during descent and landing - </para> - <table frame='all'> - <title>Sensor Packet Contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>5</entry><entry>uint8_t</entry><entry>state</entry><entry>Flight state</entry> - </row> - <row> - <entry>6</entry><entry>int16_t</entry><entry>accel</entry><entry>accelerometer (TM only)</entry> - </row> - <row> - <entry>8</entry><entry>int16_t</entry><entry>pres</entry><entry>pressure sensor</entry> - </row> - <row> - <entry>10</entry><entry>int16_t</entry><entry>temp</entry><entry>temperature sensor</entry> - </row> - <row> - <entry>12</entry><entry>int16_t</entry><entry>v_batt</entry><entry>battery voltage</entry> - </row> - <row> - <entry>14</entry><entry>int16_t</entry><entry>sense_d</entry><entry>drogue continuity sense (TM/Tm)</entry> - </row> - <row> - <entry>16</entry><entry>int16_t</entry><entry>sense_m</entry><entry>main continuity sense (TM/Tm)</entry> - </row> - <row> - <entry>18</entry><entry>int16_t</entry><entry>acceleration</entry><entry>m/s² * 16</entry> - </row> - <row> - <entry>20</entry><entry>int16_t</entry><entry>speed</entry><entry>m/s * 16</entry> - </row> - <row> - <entry>22</entry><entry>int16_t</entry><entry>height</entry><entry>m</entry> - </row> - <row> - <entry>24</entry><entry>int16_t</entry><entry>ground_pres</entry><entry>Average barometer reading on ground</entry> - </row> - <row> - <entry>26</entry><entry>int16_t</entry><entry>ground_accel</entry><entry>TM</entry> - </row> - <row> - <entry>28</entry><entry>int16_t</entry><entry>accel_plus_g</entry><entry>TM</entry> - </row> - <row> - <entry>30</entry><entry>int16_t</entry><entry>accel_minus_g</entry><entry>TM</entry> - </row> - <row> - <entry>32</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>TeleMega Sensor Data</title> - <informaltable frame='none' label='' tocentry='0'> - <tgroup cols='2' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='left' colwidth='3*' colname='Description'/> - <thead> - <row> - <entry>Type</entry> - <entry>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0x08</entry> - <entry>TeleMega IMU Sensor Data</entry> - </row> - <row> - <entry>0x09</entry> - <entry>TeleMega Kalman and Voltage Data</entry> - </row> - </tbody> - </tgroup> - </informaltable> - <para> - TeleMega has a lot of sensors, and so it splits the sensor - data into two packets. The raw IMU data are sent more often; - the voltage values don't change very fast, and the Kalman - values can be reconstructed from the IMU data. - </para> - <para> - IMU Sensor Data packets are transmitted once per second on the - ground, 10 times per second during ascent and once per second - during descent and landing - </para> - <para> - Kalman and Voltage Data packets are transmitted once per second on the - ground, 5 times per second during ascent and once per second - during descent and landing - </para> - <para> - The high-g accelerometer is reported separately from the data - for the 9-axis IMU (accel/gyro/mag). The 9-axis IMU is mounted - so that the X axis is "across" the board (along the short - axis0, the Y axis is "along" the board (along the long axis, - with the high-g accelerometer) and the Z axis is "through" the - board (perpendicular to the board). Rotation measurements are - around the respective axis, so Y rotation measures the spin - rate of the rocket while X and Z rotation measure the tilt - rate. - </para> - <para> - The overall tilt angle of the rocket is computed by first - measuring the orientation of the rocket on the pad using the 3 - axis accelerometer, and then integrating the overall tilt rate - from the 3 axis gyroscope to compute the total orientation - change of the airframe since liftoff. - </para> - <table frame='all'> - <title>TeleMega IMU Sensor Packet Contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>5</entry><entry>uint8_t</entry><entry>orient</entry><entry>Angle from vertical in degrees</entry> - </row> - <row> - <entry>6</entry><entry>int16_t</entry><entry>accel</entry><entry>High G accelerometer</entry> - </row> - <row> - <entry>8</entry><entry>int32_t</entry><entry>pres</entry><entry>pressure (Pa * 10)</entry> - </row> - <row> - <entry>12</entry><entry>int16_t</entry><entry>temp</entry><entry>temperature (°C * 100)</entry> - </row> - <row> - <entry>14</entry><entry>int16_t</entry><entry>accel_x</entry><entry>X axis acceleration (across)</entry> - </row> - <row> - <entry>16</entry><entry>int16_t</entry><entry>accel_y</entry><entry>Y axis acceleration (along)</entry> - </row> - <row> - <entry>18</entry><entry>int16_t</entry><entry>accel_z</entry><entry>Z axis acceleration (through)</entry> - </row> - <row> - <entry>20</entry><entry>int16_t</entry><entry>gyro_x</entry><entry>X axis rotation (across)</entry> - </row> - <row> - <entry>22</entry><entry>int16_t</entry><entry>gyro_y</entry><entry>Y axis rotation (along)</entry> - </row> - <row> - <entry>24</entry><entry>int16_t</entry><entry>gyro_z</entry><entry>Z axis rotation (through)</entry> - </row> - <row> - <entry>26</entry><entry>int16_t</entry><entry>mag_x</entry><entry>X field strength (across)</entry> - </row> - <row> - <entry>28</entry><entry>int16_t</entry><entry>mag_y</entry><entry>Y field strength (along)</entry> - </row> - <row> - <entry>30</entry><entry>int16_t</entry><entry>mag_z</entry><entry>Z field strength (through)</entry> - </row> - <row> - <entry>32</entry> - </row> - </tbody> - </tgroup> - </table> - <table frame='all'> - <title>TeleMega Kalman and Voltage Data Packet Contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>5</entry><entry>uint8_t</entry><entry>state</entry><entry>Flight state</entry> - </row> - <row> - <entry>6</entry><entry>int16_t</entry><entry>v_batt</entry><entry>battery voltage</entry> - </row> - <row> - <entry>8</entry><entry>int16_t</entry><entry>v_pyro</entry><entry>pyro battery voltage</entry> - </row> - <row> - <entry>10</entry><entry>int8_t[6]</entry><entry>sense</entry><entry>pyro continuity sense</entry> - </row> - <row> - <entry>16</entry><entry>int32_t</entry><entry>ground_pres</entry><entry>Average barometer reading on ground</entry> - </row> - <row> - <entry>20</entry><entry>int16_t</entry><entry>ground_accel</entry><entry>Average accelerometer reading on ground</entry> - </row> - <row> - <entry>22</entry><entry>int16_t</entry><entry>accel_plus_g</entry><entry>Accel calibration at +1g</entry> - </row> - <row> - <entry>24</entry><entry>int16_t</entry><entry>accel_minus_g</entry><entry>Accel calibration at -1g</entry> - </row> - <row> - <entry>26</entry><entry>int16_t</entry><entry>acceleration</entry><entry>m/s² * 16</entry> - </row> - <row> - <entry>28</entry><entry>int16_t</entry><entry>speed</entry><entry>m/s * 16</entry> - </row> - <row> - <entry>30</entry><entry>int16_t</entry><entry>height</entry><entry>m</entry> - </row> - <row> - <entry>32</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>TeleMetrum v2 Sensor Data</title> - <informaltable frame='none' label='' tocentry='0'> - <tgroup cols='2' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='left' colwidth='3*' colname='Description'/> - <thead> - <row> - <entry>Type</entry> - <entry>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0x0A</entry> - <entry>TeleMetrum v2 Sensor Data</entry> - </row> - <row> - <entry>0x0B</entry> - <entry>TeleMetrum v2 Calibration Data</entry> - </row> - </tbody> - </tgroup> - </informaltable> - <para> - TeleMetrum v2 has higher resolution barometric data than - TeleMetrum v1, and so the constant calibration data is - split out into a separate packet. - </para> - <para> - TeleMetrum v2 Sensor Data packets are transmitted once per second on the - ground, 10 times per second during ascent and once per second - during descent and landing - </para> - <para> - TeleMetrum v2 Calibration Data packets are always transmitted once per second. - </para> - <table frame='all'> - <title>TeleMetrum v2 Sensor Packet Contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>5</entry><entry>uint8_t</entry><entry>state</entry><entry>Flight state</entry> - </row> - <row> - <entry>6</entry><entry>int16_t</entry><entry>accel</entry><entry>accelerometer</entry> - </row> - <row> - <entry>8</entry><entry>int32_t</entry><entry>pres</entry><entry>pressure sensor (Pa * 10)</entry> - </row> - <row> - <entry>12</entry><entry>int16_t</entry><entry>temp</entry><entry>temperature sensor (°C * 100)</entry> - </row> - - <row> - <entry>14</entry><entry>int16_t</entry><entry>acceleration</entry><entry>m/s² * 16</entry> - </row> - <row> - <entry>16</entry><entry>int16_t</entry><entry>speed</entry><entry>m/s * 16</entry> - </row> - <row> - <entry>18</entry><entry>int16_t</entry><entry>height</entry><entry>m</entry> - </row> - - <row> - <entry>20</entry><entry>int16_t</entry><entry>v_batt</entry><entry>battery voltage</entry> - </row> - <row> - <entry>22</entry><entry>int16_t</entry><entry>sense_d</entry><entry>drogue continuity sense</entry> - </row> - <row> - <entry>24</entry><entry>int16_t</entry><entry>sense_m</entry><entry>main continuity sense</entry> - </row> - <row> - <entry>26</entry><entry>pad[6]</entry><entry>pad bytes</entry><entry></entry> - </row> - <row> - <entry>32</entry> - </row> - </tbody> - </tgroup> - </table> - <table frame='all'> - <title>TeleMetrum v2 Calibration Data Packet Contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>5</entry><entry>pad[3]</entry><entry>pad bytes</entry><entry></entry> - </row> - <row> - <entry>8</entry><entry>int32_t</entry><entry>ground_pres</entry><entry>Average barometer reading on ground</entry> - </row> - <row> - <entry>12</entry><entry>int16_t</entry><entry>ground_accel</entry><entry>Average accelerometer reading on ground</entry> - </row> - <row> - <entry>14</entry><entry>int16_t</entry><entry>accel_plus_g</entry><entry>Accel calibration at +1g</entry> - </row> - <row> - <entry>16</entry><entry>int16_t</entry><entry>accel_minus_g</entry><entry>Accel calibration at -1g</entry> - </row> - <row> - <entry>18</entry><entry>pad[14]</entry><entry>pad bytes</entry><entry></entry> - </row> - <row> - <entry>32</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>Configuration Data</title> - <informaltable frame='none' label='' tocentry='0'> - <tgroup cols='2' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='left' colwidth='3*' colname='Description'/> - <thead> - <row> - <entry>Type</entry> - <entry>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0x04</entry> - <entry>Configuration Data</entry> - </row> - </tbody> - </tgroup> - </informaltable> - <para> - This provides a description of the software installed on the - flight computer as well as any user-specified configuration data. - </para> - <para> - Configuration data packets are transmitted once per second - during all phases of the flight - </para> - <table frame='all'> - <title>Sensor Packet Contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>5</entry><entry>uint8_t</entry><entry>type</entry><entry>Device type</entry> - </row> - <row> - <entry>6</entry><entry>uint16_t</entry><entry>flight</entry><entry>Flight number</entry> - </row> - <row> - <entry>8</entry><entry>uint8_t</entry><entry>config_major</entry><entry>Config major version</entry> - </row> - <row> - <entry>9</entry><entry>uint8_t</entry><entry>config_minor</entry><entry>Config minor version</entry> - </row> - <row> - <entry>10</entry><entry>uint16_t</entry><entry>apogee_delay</entry> - <entry>Apogee deploy delay in seconds</entry> - </row> - <row> - <entry>12</entry><entry>uint16_t</entry><entry>main_deploy</entry><entry>Main deploy alt in meters</entry> - </row> - <row> - <entry>14</entry><entry>uint16_t</entry><entry>flight_log_max</entry> - <entry>Maximum flight log size (kB)</entry> - </row> - <row> - <entry>16</entry><entry>char</entry><entry>callsign[8]</entry><entry>Radio operator identifier</entry> - </row> - <row> - <entry>24</entry><entry>char</entry><entry>version[8]</entry><entry>Software version identifier</entry> - </row> - <row> - <entry>32</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>GPS Location</title> - <informaltable frame='none' label='' tocentry='0'> - <tgroup cols='2' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='left' colwidth='3*' colname='Description'/> - <thead> - <row> - <entry>Type</entry> - <entry>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0x05</entry> - <entry>GPS Location</entry> - </row> - </tbody> - </tgroup> - </informaltable> - <para> - This packet provides all of the information available from the - GPS receiver—position, time, speed and precision - estimates. - </para> - <para> - GPS Location packets are transmitted once per second during - all phases of the flight - </para> - <table frame='all'> - <title>GPS Location Packet Contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>5</entry><entry>uint8_t</entry><entry>flags</entry> - <entry>See GPS Flags table below</entry> - </row> - <row> - <entry>6</entry><entry>int16_t</entry><entry>altitude</entry><entry>m</entry> - </row> - <row> - <entry>8</entry><entry>int32_t</entry><entry>latitude</entry><entry>degrees * 10<superscript>7</superscript></entry> - </row> - <row> - <entry>12</entry><entry>int32_t</entry><entry>longitude</entry><entry>degrees * 10<superscript>7</superscript></entry> - </row> - <row> - <entry>16</entry><entry>uint8_t</entry><entry>year</entry> - </row> - <row> - <entry>17</entry><entry>uint8_t</entry><entry>month</entry> - </row> - <row> - <entry>18</entry><entry>uint8_t</entry><entry>day</entry> - </row> - <row> - <entry>19</entry><entry>uint8_t</entry><entry>hour</entry> - </row> - <row> - <entry>20</entry><entry>uint8_t</entry><entry>minute</entry> - </row> - <row> - <entry>21</entry><entry>uint8_t</entry><entry>second</entry> - </row> - <row> - <entry>22</entry><entry>uint8_t</entry><entry>pdop</entry><entry>* 5</entry> - </row> - <row> - <entry>23</entry><entry>uint8_t</entry><entry>hdop</entry><entry>* 5</entry> - </row> - <row> - <entry>24</entry><entry>uint8_t</entry><entry>vdop</entry><entry>* 5</entry> - </row> - <row> - <entry>25</entry><entry>uint8_t</entry><entry>mode</entry> - <entry>See GPS Mode table below</entry> - </row> - <row> - <entry>26</entry><entry>uint16_t</entry><entry>ground_speed</entry><entry>cm/s</entry> - </row> - <row> - <entry>28</entry><entry>int16_t</entry><entry>climb_rate</entry><entry>cm/s</entry> - </row> - <row> - <entry>30</entry><entry>uint8_t</entry><entry>course</entry><entry>/ 2</entry> - </row> - <row> - <entry>31</entry><entry>uint8_t</entry><entry>unused[1]</entry> - </row> - <row> - <entry>32</entry> - </row> - </tbody> - </tgroup> - </table> - <para> - Packed into a one byte field are status flags and the count of - satellites used to compute the position fix. Note that this - number may be lower than the number of satellites being - tracked; the receiver will not use information from satellites - with weak signals or which are close enough to the horizon to - have significantly degraded position accuracy. - </para> - <table frame='all'> - <title>GPS Flags</title> - <tgroup cols='3' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='bits'/> - <colspec align='left' colwidth='2*' colname='name'/> - <colspec align='left' colwidth='7*' colname='description'/> - <thead> - <row> - <entry align='center'>Bits</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0-3</entry> - <entry>nsats</entry> - <entry>Number of satellites in solution</entry> - </row> - <row> - <entry>4</entry> - <entry>valid</entry> - <entry>GPS solution is valid</entry> - </row> - <row> - <entry>5</entry> - <entry>running</entry> - <entry>GPS receiver is operational</entry> - </row> - <row> - <entry>6</entry> - <entry>date_valid</entry> - <entry>Reported date is valid</entry> - </row> - <row> - <entry>7</entry> - <entry>course_valid</entry> - <entry>ground speed, course and climb rates are valid</entry> - </row> - </tbody> - </tgroup> - </table> - <para> - Here are all of the valid GPS operational modes. Altus Metrum - products will only ever report 'N' (not valid), 'A' - (Autonomous) modes or 'E' (Estimated). The remaining modes - are either testing modes or require additional data. - </para> - <table frame='all'> - <title>GPS Mode</title> - <tgroup cols='3' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='value'/> - <colspec align='center' colwidth='3*' colname='name'/> - <colspec align='left' colwidth='7*' colname='description'/> - <thead> - <row> - <entry align='center'>Mode</entry> - <entry align='center'>Name</entry> - <entry align='center'>Decsription</entry> - </row> - </thead> - <tbody> - <row> - <entry>N</entry> - <entry>Not Valid</entry> - <entry>All data are invalid</entry> - </row> - <row> - <entry>A</entry> - <entry>Autonomous mode</entry> - <entry>Data are derived from satellite data</entry> - </row> - <row> - <entry>D</entry> - <entry>Differential Mode</entry> - <entry> - Data are augmented with differential data from a - known ground station. The SkyTraq unit in TeleMetrum - does not support this mode - </entry> - </row> - <row> - <entry>E</entry> - <entry>Estimated</entry> - <entry> - Data are estimated using dead reckoning from the - last known data - </entry> - </row> - <row> - <entry>M</entry> - <entry>Manual</entry> - <entry>Data were entered manually</entry> - </row> - <row> - <entry>S</entry> - <entry>Simulated</entry> - <entry>GPS receiver testing mode</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>GPS Satellite Data</title> - <informaltable frame='none' label='' tocentry='0'> - <tgroup cols='2' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='left' colwidth='3*' colname='Description'/> - <thead> - <row> - <entry>Type</entry> - <entry>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0x06</entry> - <entry>GPS Satellite Data</entry> - </row> - </tbody> - </tgroup> - </informaltable> - <para> - This packet provides space vehicle identifiers and signal - quality information in the form of a C/N1 number for up to 12 - satellites. The order of the svids is not specified. - </para> - <para> - GPS Satellite data are transmitted once per second during all - phases of the flight. - </para> - <table frame='all'> - <title>GPS Satellite Data Contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='right' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>5</entry><entry>uint8_t</entry><entry>channels</entry> - <entry>Number of reported satellite information</entry> - </row> - <row> - <entry>6</entry><entry>sat_info_t</entry><entry>sats[12]</entry> - <entry>See Per-Satellite data table below</entry> - </row> - <row> - <entry>30</entry><entry>uint8_t</entry><entry>unused[2]</entry> - </row> - <row> - <entry>32</entry> - </row> - </tbody> - </tgroup> - </table> - <table frame='all'> - <title>GPS Per-Satellite data (sat_info_t)</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='right' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0</entry><entry>uint8_t</entry><entry>svid</entry> - <entry>Space Vehicle Identifier</entry> - </row> - <row> - <entry>1</entry><entry>uint8_t</entry><entry>c_n_1</entry> - <entry>C/N1 signal quality indicator</entry> - </row> - <row> - <entry>2</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>Companion Data Data</title> - <informaltable frame='none' label='' tocentry='0'> - <tgroup cols='2' align='center' colsep='1' rowsep='1'> - <colspec align='center' colwidth='*' colname='Offset'/> - <colspec align='left' colwidth='3*' colname='Description'/> - <thead> - <row> - <entry>Type</entry> - <entry>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0x07</entry> - <entry>Companion Data Data</entry> - </row> - </tbody> - </tgroup> - </informaltable> - <para> - When a companion board is attached to TeleMega or TeleMetrum, - it can provide telemetry data to be included in the - downlink. The companion board can provide up to 12 16-bit data - values. - </para> - <para> - The companion board itself specifies the transmission rate. On - the ground and during descent, that rate is limited to one - packet per second. During ascent, that rate is limited to 10 - packets per second. - </para> - <table frame='all'> - <title>Companion Data Contents</title> - <tgroup cols='4' align='center' colsep='1' rowsep='1'> - <colspec align='right' colwidth='*' colname='Offset'/> - <colspec align='center' colwidth='3*' colname='Data Type'/> - <colspec align='left' colwidth='3*' colname='Name'/> - <colspec align='left' colwidth='9*' colname='Description'/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Data Type</entry> - <entry align='center'>Name</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>5</entry><entry>uint8_t</entry><entry>board_id</entry> - <entry>Type of companion board attached</entry> - </row> - <row> - <entry>6</entry><entry>uint8_t</entry><entry>update_period</entry> - <entry>How often telemetry is sent, in 1/100ths of a second</entry> - </row> - <row> - <entry>7</entry><entry>uint8_t</entry><entry>channels</entry> - <entry>Number of data channels supplied</entry> - </row> - <row> - <entry>8</entry><entry>uint16_t[12]</entry><entry>companion_data</entry> - <entry>Up to 12 channels of 16-bit companion data</entry> - </row> - <row> - <entry>32</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - </section> - <section> - <title>Data Transmission</title> - <para> - Altus Metrum devices use Texas Instruments sub-GHz digital radio - products. Ground stations use parts with HW FEC while some - flight computers perform FEC in software. TeleGPS is - transmit-only. - </para> - <table> - <title>Altus Metrum Radio Parts</title> - <tgroup cols='3'> - <colspec align="center" colwidth="*" colname="Part Number"/> - <colspec align="center" colwidth="*" colname="Description"/> - <colspec align="left" colwidth="*" colname="Used in"/> - <thead> - <row> - <entry align="center">Part Number</entry> - <entry align="center">Description</entry> - <entry align="center">Used in</entry> - </row> - </thead> - <tbody> - <row> - <entry>CC1111</entry><entry>10mW transceiver with integrated SoC</entry> - <entry>TeleDongle v0.2, TeleBT v1.0, TeleMetrum v1.x, TeleMini</entry> - </row> - <row> - <entry>CC1120</entry><entry>35mW transceiver with SW FEC</entry> - <entry>TeleMetrum v2, TeleMega</entry> - </row> - <row> - <entry>CC1200</entry><entry>35mW transceiver with HW FEC</entry> - <entry>TeleDongle v3.0, TeleBT v3.0</entry> - </row> - <row> - <entry>CC115L</entry><entry>14mW transmitter with SW FEC</entry> - <entry>TeleGPS</entry> - </row> - </tbody> - </tgroup> - </table> - <section> - <title>Modulation Scheme</title> - <para> - Texas Instruments provides a tool for computing modulation - parameters given a desired modulation format and basic bit - rate. - - While we might like to use something with better low-signal - performance like BPSK, the radios we use don't support that, - but do support Gaussian frequency shift keying (GFSK). Regular - frequency shift keying (FSK) encodes the signal by switching - the carrier between two frequencies. The Gaussian version is - essentially the same, but the shift between frequencies gently - follows a gaussian curve, rather than switching - immediately. This tames the bandwidth of the signal without - affecting the ability to transmit data. - - For AltOS, there are three available bit rates, 38.4kBaud, - 9.6kBaud and 2.4kBaud resulting in the following signal - parmeters: - - </para> - <table> - <title>Modulation Scheme</title> - <tgroup cols='3'> - <colspec align="center" colwidth="*" colname="rate"/> - <colspec align="center" colwidth="*" colname="deviation"/> - <colspec align="center" colwidth="*" colname="bandwidth"/> - <thead> - <row> - <entry align='center'>Rate</entry> - <entry align='center'>Deviation</entry> - <entry align='center'>Receiver Bandwidth</entry> - </row> - </thead> - <tbody> - <row> - <entry>38.4kBaud</entry> - <entry>20.5kHz</entry> - <entry>100kHz</entry> - </row> - <row> - <entry>9.6kBaud</entry> - <entry>5.125kHz</entry> - <entry>25kHz</entry> - </row> - <row> - <entry>2.4kBaud</entry> - <entry>1.5kHz</entry> - <entry>5kHz</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>Error Correction</title> - <para> - The cc1111 and cc1200 provide forward error correction in - hardware; on the cc1120 and cc115l that's done in - software. AltOS uses this to improve reception of weak - signals. As it's a rate 1/2 encoding, each bit of data takes - two bits when transmitted, so the effective data rate is half - of the raw transmitted bit rate. - </para> - <table> - <title>Error Correction</title> - <tgroup cols='3'> - <colspec align="center" colwidth="*" colname="parameter"/> - <colspec align="center" colwidth="*" colname="value"/> - <colspec align="center" colwidth="*" colname="description"/> - <thead> - <row> - <entry align='center'>Parameter</entry> - <entry align='center'>Value</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>Error Correction</entry> - <entry>Convolutional coding</entry> - <entry>1/2 rate, constraint length m=4</entry> - </row> - <row> - <entry>Interleaving</entry> - <entry>4 x 4</entry> - <entry>Reduce effect of noise burst</entry> - </row> - <row> - <entry>Data Whitening</entry> - <entry>XOR with 9-bit PNR</entry> - <entry>Rotate right with bit 8 = bit 0 xor bit 5, initial - value 111111111</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - </section> - <section> - <title>TeleDongle packet format</title> - <para> - TeleDongle does not do any interpretation of the packet data, - instead it is configured to receive packets of a specified - length (32 bytes in this case). For each received packet, - TeleDongle produces a single line of text. This line starts with - the string "TELEM " and is followed by a list of hexadecimal - encoded bytes. - </para> - <programlisting>TELEM 224f01080b05765e00701f1a1bbeb8d7b60b070605140c000600000000000000003fa988</programlisting> - <para> - The hexadecimal encoded string of bytes contains a length byte, - the packet data, two bytes added by the cc1111 radio receiver - hardware and finally a checksum so that the host software can - validate that the line was transmitted without any errors. - </para> - <table> - <title>Packet Format</title> - <tgroup cols='4'> - <colspec align="center" colwidth="2*" colname="offset"/> - <colspec align="center" colwidth="*" colname="name"/> - <colspec align="center" colwidth="*" colname="value"/> - <colspec align="center" colwidth="5*" colname="description"/> - <thead> - <row> - <entry align='center'>Offset</entry> - <entry align='center'>Name</entry> - <entry align='center'>Example</entry> - <entry align='center'>Description</entry> - </row> - </thead> - <tbody> - <row> - <entry>0</entry> - <entry>length</entry> - <entry>22</entry> - <entry>Total length of data bytes in the line. Note that - this includes the added RSSI and status bytes</entry> - </row> - <row> - <entry>1 ·· length-3</entry> - <entry>packet</entry> - <entry>4f ·· 00</entry> - <entry>Bytes of actual packet data</entry> - </row> - <row> - <entry>length-2</entry> - <entry>rssi</entry> - <entry>3f</entry> - <entry>Received signal strength. dBm = rssi / 2 - 74</entry> - </row> - <row> - <entry>length-1</entry> - <entry>lqi</entry> - <entry>a9</entry> - <entry>Link Quality Indicator and CRC status. Bit 7 - is set when the CRC is correct</entry> - </row> - <row> - <entry>length</entry> - <entry>checksum</entry> - <entry>88</entry> - <entry>(0x5a + sum(bytes 1 ·· length-1)) % 256</entry> - </row> - </tbody> - </tgroup> - </table> - </section> - <section> - <title>History and Motivation</title> - <para> - The original AltoOS telemetry mechanism encoded everything - available piece of information on the TeleMetrum hardware into a - single unified packet. Initially, the packets contained very - little data—some raw sensor readings along with the current GPS - coordinates when a GPS receiver was connected. Over time, the - amount of data grew to include sensor calibration data, GPS - satellite information and a host of internal state information - designed to help diagnose flight failures in case of a loss of - the on-board flight data. - </para> - <para> - Because every packet contained all of the data, packets were - huge—95 bytes long. Much of the information was also specific to - the TeleMetrum hardware. With the introduction of the TeleMini - flight computer, most of the data contained in the telemetry - packets was unavailable. Initially, a shorter, but still - comprehensive packet was implemented. This required that the - ground station be pre-configured as to which kind of packet to - expect. - </para> - <para> - The development of several companion boards also made the - shortcomings evident—each companion board would want to include - telemetry data in the radio link; with the original design, the - packet would have to hold the new data as well, requiring - additional TeleMetrum and ground station changes. - </para> - </section> -</article> diff --git a/doc/telemini-outline.txt b/doc/telemini-outline.txt new file mode 100644 index 00000000..1992adf0 --- /dev/null +++ b/doc/telemini-outline.txt @@ -0,0 +1,9 @@ += TeleMini Outline and Hole Pattern +:doctype: article + + This image, when printed, provides a precise template for the + mounting holes in TeleMini. TeleMini has overall dimensions of + 0.500 x 1.500 inches, and the mounting holes are sized for use + with 2-56 or M2 screws. + + image::telemini.svg[align="center"] diff --git a/doc/telemini-v1.0.inc b/doc/telemini-v1.0.inc new file mode 100644 index 00000000..e0d674f6 --- /dev/null +++ b/doc/telemini-v1.0.inc @@ -0,0 +1,93 @@ +== TeleMini v1.0 + + .TeleMini v1.0 Board + image::telemini-v1-top.jpg[width="5.5in"] + + TeleMini v1.0 is ½ inches by 1½ inches. It was + designed to fit inside an 18mm air-frame tube, but using it in + a tube that small in diameter may require some creativity in + mounting and wiring to succeed! Since there is no + accelerometer, TeleMini can be mounted in any convenient + orientation. The default ¼ wave UHF wire antenna attached to + the center of one end of the board is about 7 inches long. Two + wires for the power switch are connected to holes in the + middle of the board. Screw terminals for the e-matches for + apogee and main ejection charges depart from the other end of + the board, meaning an ideal “simple” avionics bay for TeleMini + should have at least 9 inches of interior length. + + === TeleMini v1.0 Screw Terminals + + TeleMini v1.0 has four screw terminals on the end of the + board opposite the telemetry antenna. Two are for the apogee + and two are for main igniter circuits. There are also wires + soldered to the board for the power switch. Using the + picture above and starting from the top for the terminals + and from the left for the power switch wires, the + connections are as follows: + + .TeleMini v1.0 Screw Terminals + [options="header",grid="all",cols="2,3,10"] + |==== + |Terminal #|Terminal Name|Description + + |1 + |Apogee - + |Apogee pyro channel connection to pyro circuit + + |2 + |Apogee + + |Apogee pyro channel common connection to battery + + + |3 + |Main - + |Main pyro channel connection to pyro circuit + + |4 + |Main + + |Main pyro channel common connection to battery + + + |Left + |Switch Output + |Switch connection to flight computer + + |Right + |Switch Input + |Switch connection to positive battery terminal + |==== + + === Using a Separate Pyro Battery with TeleMini v1.0 + + As described above, using an external pyro battery involves + connecting the negative battery terminal to the flight + computer ground, connecting the positive battery terminal to + one of the igniter leads and connecting the other igniter + lead to the per-channel pyro circuit connection. Because + there is no solid ground connection to use on TeleMini, this + is not recommended. + + The only available ground connection on TeleMini v1.0 are + the two mounting holes next to the telemetry + antenna. Somehow connect a small piece of wire to one of + those holes and hook it to the negative pyro battery terminal. + + Connecting the positive battery terminal to the pyro + charges must be done separate from TeleMini v1.0, by soldering + them together or using some other connector. + + The other lead from each pyro charge is then inserted into + the appropriate per-pyro channel screw terminal (terminal 3 for the + Main charge, terminal 1 for the Apogee charge). + + === Using an Active Switch with TeleMini v1.0 + + As explained above, an external active switch requires three + connections, one to the positive battery terminal, one to + the flight computer positive input and one to ground. Again, + because TeleMini doesn't have any good ground connection, + this is not recommended. + + The positive battery terminal is available on the Right + power switch wire, the positive flight computer input is on + the left power switch wire. Hook a lead to either of the + mounting holes for a ground connection. diff --git a/doc/telemini-v2-top.jpg b/doc/telemini-v2-top.jpg Binary files differdeleted file mode 100644 index bc8ae45b..00000000 --- a/doc/telemini-v2-top.jpg +++ /dev/null diff --git a/doc/telemini.pdf b/doc/telemini.pdf Binary files differdeleted file mode 100644 index 9d7f0237..00000000 --- a/doc/telemini.pdf +++ /dev/null diff --git a/doc/titlepage.templates.xml b/doc/titlepage.templates.tmpl index 59fa5ba1..f437fb76 100644 --- a/doc/titlepage.templates.xml +++ b/doc/titlepage.templates.tmpl @@ -36,6 +36,8 @@ start-indent="0pt" text-align="center"> + <mediaobject space-before="1em"/> + <title t:named-template="component.title" param:node="ancestor-or-self::article[1]" keep-with-next.within-column="always" @@ -44,6 +46,8 @@ <subtitle/> + <date/> + <corpauthor space-before="0.5em" font-size="&hsize2;"/> <authorgroup space-before="0.5em" @@ -55,17 +59,17 @@ because only the first editor generates the list of editors. <editor t:predicate="[position() = 1]"/> --> - <othercredit space-before="0.5em"/> - <releaseinfo space-before="0.5em"/> - <copyright space-before="0.5em"/> + <othercredit space-before="0.15in"/> + <releaseinfo space-before="0.15in"/> + <copyright space-before="0.15in"/> <legalnotice text-align="start" margin-left="0.5in" margin-right="0.5in" font-family="{$body.fontset}"/> - <pubdate space-before="0.5em"/> - <revision space-before="0.5em"/> - <revhistory space-before="0.5em"/> - <abstract space-before="0.5em" + <pubdate space-before="0.15in"/> + <revision space-before="0.15in"/> + <revhistory space-before="0.15in"/> + <abstract space-before="0.15in" text-align="start" margin-left="0.5in" margin-right="0.5in" @@ -101,7 +105,7 @@ <subtitle font-family="{$title.fontset}" text-align="center"/> - <corpauthor/> + <corpauthor space-before="0.25in"/> <authorgroup/> <author/> <othercredit/> @@ -130,35 +134,37 @@ <!-- ==================================================================== --> - <t:titlepage t:element="book" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:named-template="division.title" - param:node="ancestor-or-self::book[1]" - text-align="center" - font-size="&hsize5;" - space-before="&hsize5space;" - font-weight="bold" - font-family="{$title.fontset}"/> - <subtitle - text-align="center" - font-size="&hsize4;" - space-before="&hsize4space;" - font-family="{$title.fontset}"/> - <corpauthor font-size="&hsize3;" - keep-with-next.within-column="always" - space-before="2in"/> - <authorgroup space-before="2in"/> - <author font-size="&hsize3;" - space-before="&hsize2space;" - keep-with-next.within-column="always"/> - <!-- If you add editor, include this t:predicate attribute - because only the first editor generates the list of editors. - <editor t:predicate="[position() = 1]"/> - --> - <mediaobject space-before="1.5in"/> - <itermset/> - </t:titlepage-content> +<t:titlepage t:element="book" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:named-template="division.title" + param:node="ancestor-or-self::book[1]" + text-align="center" + font-size="&hsize5;" + space-before="&hsize5space;" + font-weight="bold" + font-family="{$title.fontset}"/> + <subtitle + text-align="center" + font-size="&hsize4;" + space-before="&hsize4space;" + font-family="{$title.fontset}"/> +<!-- + <corpauthor font-size="&hsize3;" + keep-with-next.within-column="always" + space-before="2in"/> + --> + <authorgroup space-before="2in"/> + <author font-size="&hsize3;" + space-before="&hsize2space;" + keep-with-next.within-column="always"/> + <!-- If you add editor, include this t:predicate attribute + because only the first editor generates the list of editors. + <editor t:predicate="[position() = 1]"/> + --> + <mediaobject space-before="1.5in"/> + <itermset/> + </t:titlepage-content> <t:titlepage-content t:side="verso"> <title @@ -166,7 +172,6 @@ font-size="&hsize2;" font-weight="bold" font-family="{$title.fontset}"/> - <corpauthor/> <authorgroup t:named-template="verso.authorgroup"/> <author/> <!-- If you add editor, include this t:predicate attribute @@ -174,11 +179,13 @@ <editor t:predicate="[position() = 1]"/> --> <othercredit/> - <releaseinfo space-before="0.5em"/> + <releaseinfo space-before="0.15in"/> <pubdate space-before="1em"/> <copyright/> <abstract/> <legalnotice font-size="8pt"/> + <corpauthor text-align="center" space-before="0.5in"/> + <revhistory space-before="0.5in"/> </t:titlepage-content> <t:titlepage-separator> diff --git a/doc/updating-firmware.inc b/doc/updating-firmware.inc new file mode 100644 index 00000000..11ea1283 --- /dev/null +++ b/doc/updating-firmware.inc @@ -0,0 +1,368 @@ +[appendix] +== Updating Device Firmware + + ifdef::telemega[] + TeleMega, TeleMetrum v2, EasyMega, EasyMini and TeleDongle v3 + are all + endif::telemega[] + ifndef::telemega[] + EasyMini is + endif::telemega[] + programmed directly over their USB connectors (self + programming). + ifdef::telemega[] + TeleMetrum v1, TeleMini and TeleDongle v0.2 are + all programmed by using another device as a programmer (pair + programming). It's important to recognize which kind of devices + you have before trying to reprogram them. + endif::telemega[] + + You may wish to begin by ensuring you have current firmware + images. These are distributed as part of the AltOS software + bundle that also includes the AltosUI ground station program. + Newer ground station versions typically work fine with older + firmware versions, so you don't need to update your devices + just to try out new software features. You can always + download the most recent version from + http://www.altusmetrum.org/AltOS/ + + ifdef::telemega[] + === Updating TeleMega, TeleMetrum v2, EasyMega, EasyMini or TeleDongle v3 Firmware + endif::telemega[] + ifndef::telemega[] + === Updating EasyMini Firmware + endif::telemega[] + + Self-programmable devices are reprogrammed by + connecting them to your computer over USB. + + . Attach a battery if necessary and power switch to + the target device. Power up the device. + + . Using a Micro USB cable, connect the target device to your + computer's USB socket. + + . Run AltosUI, and select 'Flash Image' from the File menu. + + . Select the target device in the Device Selection dialog. + + . Select the image you want to flash to the device, + which should have a name in the form + <product>-v<product-version>-<software-version>.ihx, + such as EasyMini-v1.0-1.6.0.ihx. + + . Make sure the configuration parameters are + reasonable looking. If the serial number and/or RF + configuration values aren't right, you'll need to + change them. + + . Hit the 'OK' button and the software should proceed + to flash the device with new firmware, showing a + progress bar. + + . Verify that the device is working by using the + 'Configure Altimeter' or 'Configure Groundstation' + item to check over the configuration. + + ==== Recovering From Self-Flashing Failure + + If the firmware loading fails, it can leave the device + unable to boot. Not to worry, you can force the device to + start the boot loader instead, which will let you try to + flash the device again. + + On each device, connecting two pins from one of the exposed + connectors will force the boot loader to start, even if the + regular operating system has been corrupted in some way. + + ifdef::telemega[] + TeleMega:: + + Connect pin 6 and pin 1 of the companion + connector. Pin 1 can be identified by the square pad + around it, and then the pins could sequentially across + the board. Be very careful to *not* short pin 8 to + anything as that is connected directly to the + battery. Pin 7 carries 3.3V and the board will crash + if that is connected to pin 1, but shouldn't damage + the board. + endif::telemega[] + + ifdef::easymega[] + EasyMega:: + + Connect pin 6 and pin 1 of the companion + connector. Pin 1 can be identified by the square pad + around it, and then the pins could sequentially across + the board. Be very careful to *not* short pin 8 to + anything as that is connected directly to the + battery. Pin 7 carries 3.3V and the board will crash + if that is connected to pin 1, but shouldn't damage + the board. + endif::easymega[] + + ifdef::telemetrum[] + TeleMetrum v2:: + + Connect pin 6 and pin 1 of the companion + connector. Pin 1 can be identified by the square pad + around it, and then the pins could sequentially across + the board. Be very careful to *not* short pin 8 to + anything as that is connected directly to the + battery. Pin 7 carries 3.3V and the board will crash + if that is connected to pin 1, but shouldn't damage + the board. + endif::telemetrum[] + + ifdef::easymini[] + EasyMini:: + + Connect pin 6 and pin 1 of the debug connector, which + is the six holes next to the beeper. Pin 1 can be + identified by the square pad around it, and then the + pins could sequentially across the board, making Pin 6 + the one on the other end of the row. + endif::easymini[] + + ifdef::telemetrum[] + TeleDongle v3:: + + Connect pin 32 on the CPU to ground. Pin 32 is closest + to the USB wires on the row of pins towards the center + of the board. Ground is available on the capacitor + next to it, on the end towards the USB wires. + endif::telemetrum[] + + Once you've located the right pins: + + . Turn the altimeter power off. + + . Connect a battery. + + . Connect the indicated terminals together with a + short piece of wire. Take care not to accidentally + connect anything else. + + . Connect USB + + . Turn the board power on. + + The board should now be visible over USB as + 'AltosFlash' and be ready to receive firmware. Once + the board has been powered up, you can remove the + piece of wire. + + ifdef::telemetrum,telemini[] + === Pair Programming + + The big concept to understand is that you have to use + a TeleMetrum v1.0, TeleBT v1.0 or TeleDongle v0.2 as a + programmer to update a pair programmed device. Due to + limited memory resources in the cc1111, we don't + support programming directly over USB for these + devices. + + If you need to update the firmware on a TeleDongle + v0.2, we recommend updating the altimeter first, + before updating TeleDongle. However, note that + TeleDongle rarely need to be updated. Any firmware + version 1.0.1 or later will work, version 1.2.1 may + have improved receiver performance slightly. + + ==== Updating TeleMetrum v1.x Firmware + + . Find the 'programming cable' that you got as + part of the starter kit, that has a red + 8-pin MicroMaTch connector on one end and a + red 4-pin MicroMaTch connector on the other + end. + + . Take the 2 screws out of the TeleDongle v0.2 + or TeleBT v1.0 case to get access to the + circuit board. + + . Plug the 8-pin end of the programming cable + to the matching connector on the TeleDongle + v0.2 or TeleBT v1.0, and the 4-pin end to + the matching connector on the TeleMetrum. + Note that each MicroMaTch connector has an + alignment pin that goes through a hole in + the PC board when you have the cable + oriented correctly. + + . Attach a battery to the TeleMetrum board. + + . Plug the TeleDongle v0.2 or TeleBT v1.0 into + your computer's USB port, and power up the + TeleMetrum. + + . Run AltosUI, and select 'Flash Image' from + the File menu. + + . Pick the TeleDongle v0.2 or TeleBT v1.0 + device from the list, identifying it as the + programming device. + + . Select the image you want put on the + TeleMetrum, which should have a name in the + form telemetrum-v1.2-1.0.0.ihx. It should + be visible in the default directory, if not + you may have to poke around your system to + find it. + + . Make sure the configuration parameters are + reasonable looking. If the serial number + and/or RF configuration values aren't right, + you'll need to change them. + + . Hit the 'OK' button and the software should + proceed to flash the TeleMetrum with new + firmware, showing a progress bar. + + . Confirm that the TeleMetrum board seems to + have updated OK, which you can do by + plugging in to it over USB and using a + terminal program to connect to the board and + issue the 'v' command to check the version, + etc. + + If something goes wrong, give it another try. + + ==== Updating TeleMini Firmware + + You'll need a special 'programming cable' to + reprogram the TeleMini. You can make your own + using an 8-pin MicroMaTch connector on one end + and a set of four pins on the other. + + . Take the 2 screws out of the TeleDongle v0.2 + or TeleBT v1.0 case to get access to the + circuit board. + + . Plug the 8-pin end of the programming cable + to the matching connector on the TeleDongle + v0.2 or TeleBT v1.0, and the 4-pins into the + holes in the TeleMini circuit board. Note + that the MicroMaTch connector has an + alignment pin that goes through a hole in + the PC board when you have the cable + oriented correctly, and that pin 1 on the + TeleMini board is marked with a square pad + while the other pins have round pads. + + . Attach a battery to the TeleMini board. + + . Plug the TeleDongle v0.2 or TeleBT v1.0 into + your computer's USB port, and power up the + TeleMini + + . Run AltosUI, and select 'Flash Image' from + the File menu. + + . Pick the TeleDongle v0.2 or TeleBT v1.0 + device from the list, identifying it as the + programming device. + + . Select the image you want put on the + TeleMini, which should have a name in the + form telemini-v1.0-1.0.0.ihx. It should be + visible in the default directory, if not you + may have to poke around your system to find + it. + + . Make sure the configuration parameters are + reasonable looking. If the serial number + and/or RF configuration values aren't right, + you'll need to change them. + + . Hit the 'OK' button and the software should + proceed to flash the TeleMini with new + firmware, showing a progress bar. + + . Confirm that the TeleMini board seems to + have updated OK, which you can do by + configuring it over the radio link through + the TeleDongle, or letting it come up in + “flight” mode and listening for telemetry. + + If something goes wrong, give it another try. + + ==== Updating TeleDongle v0.2 Firmware + + Updating TeleDongle v0.2 firmware is just like + updating TeleMetrum v1.x or TeleMini firmware, but you + use either a TeleMetrum v1.x, TeleDongle v0.2 or + TeleBT v1.0 as the programmer. + + . Find the 'programming cable' that you got as part of + the starter kit, that has a red 8-pin MicroMaTch + connector on one end and a red 4-pin MicroMaTch + connector on the other end. + + . Find the USB cable that you got as part of the + starter kit, and plug the “mini” end in to the + mating connector on TeleMetrum v1.x, TeleDongle v0.2 + or TeleBT v1.0. + + . Take the 2 screws out of the TeleDongle v0.2 or + TeleBT v1.0 case to get access to the circuit board. + + . Plug the 8-pin end of the programming cable to the + matching connector on the programmer, and the 4-pin + end to the matching connector on the TeleDongle + v0.2. Note that each MicroMaTch connector has an + alignment pin that goes through a hole in the PC + board when you have the cable oriented correctly. + + . Attach a battery to the TeleMetrum v1.x board if + you're using one. + + . Plug both the programmer and the TeleDongle into + your computer's USB ports, and power up the + programmer. + + . Run AltosUI, and select 'Flash Image' from the File + menu. + + . Pick the programmer device from the list, + identifying it as the programming device. + + + . Select the image you want put on the TeleDongle + v0.2, which should have a name in the form + teledongle-v0.2-1.0.0.ihx. It should be visible in + the default directory, if not you may have to poke + around your system to find it. + + . Make sure the configuration parameters are + reasonable looking. If the serial number and/or RF + configuration values aren't right, you'll need to + change them. The TeleDongle v0.2 serial number is + on the “bottom” of the circuit board, and can + usually be read through the translucent blue plastic + case without needing to remove the board from the + case. + + . Hit the 'OK' button and the software should proceed + to flash the TeleDongle v0.2 with new firmware, + showing a progress bar. + + . Confirm that the TeleDongle v0.2 board seems to have + updated OK, which you can do by plugging in to it + over USB and using a terminal program to connect to + the board and issue the 'v' command to check the + version, etc. Once you're happy, remove the + programming cable and put the cover back on the + TeleDongle v0.2. + + If something goes wrong, give it another try. + + Be careful removing the programming cable from the + locking 8-pin connector on TeleMetrum. You'll need a + fingernail or perhaps a thin screwdriver or knife + blade to gently pry the locking ears out slightly to + extract the connector. We used a locking connector on + TeleMetrum to help ensure that the cabling to + companion boards used in a rocket don't ever come + loose accidentally in flight. + endif::telemetrum,telemini[] diff --git a/doc/usage.inc b/doc/usage.inc new file mode 100644 index 00000000..8349f86c --- /dev/null +++ b/doc/usage.inc @@ -0,0 +1,312 @@ +== Using Altus Metrum Hardware + + Here are general instructions for hooking up an Altus Metrum + flight computer. Instructions specific to each model will be + found in the section devoted to that model below. + + === Wiring and Electrical Interference + + To prevent electrical interference from affecting the + operation of the flight computer, it's important to always + twist pairs of wires connected to the board. Twist the switch + leads, the pyro leads and the battery leads. This reduces + interference through a mechanism called common mode rejection. + + === Hooking Up Lithium Polymer Batteries + + All Altus Metrum flight computers have a two pin JST PH + series connector to connect up a single-cell Lithium Polymer + cell (3.7V nominal). You can purchase matching batteries + from the Altus Metrum store, or other vendors, or you can + make your own. Pin 1 of the connector is positive, pin 2 is + negative. Spark Fun sells a cable with the connector + attached, which they call a + link:https://www.sparkfun.com/products/9914[JST Jumper 2 Wire Assembly] + + [WARNING] + Many RC vendors also sell lithium polymer batteries with + this same connector. All that we have found use the opposite + polarity, and if you use them that way, you will damage or + destroy the flight computer. + + === Hooking Up Pyro Charges + + Altus Metrum flight computers always have two screws for + each pyro charge. This means you shouldn't need to put two + wires into a screw terminal or connect leads from pyro + charges together externally. + + On the flight computer, one lead from each charge is hooked + to the positive battery terminal through the power switch. + The other lead is connected through the pyro circuit, which + is connected to the negative battery terminal when the pyro + circuit is fired. + + === Hooking Up a Power Switch + + Altus Metrum flight computers need an external power switch + to turn them on. This disconnects both the computer and the + pyro charges from the battery, preventing the charges from + firing when in the Off position. The switch is in-line with + the positive battery terminal. + + === Understanding Beeps + + Altus Metrum flight computers include a beeper to + provide information about the state of the system. + ifdef::telemini[] + TeleMini doesn't have room for a beeper, so instead it + uses an LED, which works the same, except for every + beep is replaced with the flash of the LED. + endif::telemini[] + + Here's a short summary of all of the modes and the + beeping + ifdef::telemini[(or flashing, in the case of TeleMini v1)] + that accompanies each mode. In the description of the + beeping pattern, “dit” means a short beep while "dah" + means a long beep (three times as long). “Brap” means + a long dissonant tone. + + .AltOS Modes + [options="border",cols="1,1,2,2"] + |==== + |Mode Name + |Abbreviation + |Beeps + |Description + + |Startup + |S + |battery voltage in decivolts + |Calibrating sensors, detecting orientation. + + |Idle + |I + |dit dit + |Ready to accept commands over USB + ifdef::radio[or radio link.] + + |Pad + |P + |dit dah dah dit + |Waiting for launch. Not listening for commands. + + |Boost + |B + |dah dit dit dit + |Accelerating upwards. + + |Fast + |F + |dit dit dah dit + |Decelerating, but moving faster than 200m/s. + + |Coast + |C + |dah dit dah dit + |Decelerating, moving slower than 200m/s + + |Drogue + |D + |dah dit dit + |Descending after apogee. Above main height. + + |Main + |M + |dah dah + |Descending. Below main height. + + |Landed + |L + |dit dah dit dit + |Stable altitude for at least ten seconds. + + + |Sensor error + |X + |dah dit dit dah + |Error detected during sensor calibration. + |==== + + Here's a summary of all of the Pad and Idle mode + indications. In Idle mode, you'll hear one of these + just once after the two short dits indicating idle + mode. In Pad mode, after the dit dah dah dit + indicating Pad mode, you'll hear these once every five + seconds. + + .Pad/Idle Indications + [options="header",cols="1,1,3"] + |==== + |Name |Beeps |Description + + |Neither + |brap + |No continuity detected on either apogee or main igniters. + + |Apogee + |dit + |Continuity detected only on apogee igniter. + + |Main + |dit dit + |Continuity detected only on main igniter. + + + |Both + |dit dit dit + |Continuity detected on both igniters. + + + |Storage Full + |warble + |On-board data logging storage is full. This will + not prevent the flight computer from safely + controlling the flight or transmitting telemetry + signals, but no record of the flight will be + stored in on-board flash. + |==== + + ifdef::radio[] + For devices with a radio transmitter, in addition to + the digital and APRS telemetry signals, you can also + receive audio tones with a standard amateur + 70cm FM receiver. While on the pad, you will hear + igniter status once every five seconds. + + .Pad Radio Indications + [options="header",cols="1,1,3"] + |==== + |Name |Beeps |Description + + |Neither + |½ second tone + |No continuity detected on either apogee or main igniters. + + |Apogee + |dit + |Continuity detected only on apogee igniter. + + |Main + |dit dit + |Continuity detected only on main igniter. + + + |Both + |dit dit dit + |Continuity detected on both igniters. + + |==== + + During ascent, the tones will be muted to allow the + telemetry data to consume the full radio bandwidth. + + During descent and after landing, a ½ second tone will + be transmitted every five seconds. This can be used to + find the rocket using RDF techniques when the signal + is too weak to receive GPS information via telemetry + or APRS. + endif::radio[] + + === Turning On the Power + + Connect a battery and power switch and turn the switch + to "on". The flight computer will signal power on by + reporting the battery voltage and then perform an internal self + test and sensor calibration. + + Once the self test and calibration are complete, there + are two modes that an Altus Metrum flight computer can + operate in: + + Flight/Pad:: + The flight computer is waiting to detect + launch and then fly the rocket. In this mode, the USB + link is + ifdef::radio[disabled, and the radio goes into transmit-only mode.] + ifndef::radio[disabled.] + The only way to get out of this + mode is to power the flight computer down. + + Idle:: + The flight computer is ready to communicate over USB + ifdef::radio[and in packet mode over the radio.] + You can configure + the flight computer, download data or display + the current state. + + ifdef::telemetrum,easymega,telemega[] + For flight computers with accelerometers (TeleMetrum, + EasyMega and TeleMega), the mode is selected by the + orientation of the board during the self test + interval. If the board is pointing upwards as if ready + to fly, it will enter Flight/Pad mode. Otherwise, it will + enter Idle mode. + endif::telemetrum,easymega,telemega[] + + ifdef::easymini[] + For EasyMini, if the USB cable is connected to a + computer, it will enter Idle mode. Otherwise, it will + enter Flight/Pad mode. + endif::easymini[] + + ifdef::telemini[] + For TeleMini v1.0, if a packet link is waiting to + connect when the device is powered on, it will enter + Idle mode, otherwise it will enter Flight/Pad mode. + endif::telemini[] + + You can see in <<_understanding_beeps>> + how to tell which mode the flight computer is in. + + === Using an External Active Switch Circuit + + You can use an active switch circuit, such as the + Featherweight Magnetic Switch, with any Altus Metrum + flight computer. These require three connections, one to + the battery, one to the positive power input on the flight + computer and one to ground. Find instructions on how to + hook these up for each flight computer below. Then follow + the instructions that come with your active switch to + connect it up. + + === Using a Separate Pyro Battery + + As mentioned above in <<_hooking_up_pyro_charges>>, one + lead for each of the pyro charges is connected through + the power switch directly to the positive battery + terminal. The other lead is connected to the pyro + circuit, which connects it to the negative battery + terminal when the pyro circuit is fired. The pyro + circuit on all of the flight computers is designed to + handle up to 16V. + + To use a separate pyro battery, connect the negative pyro + battery terminal to the flight computer ground terminal, + the positive battery terminal to the igniter and the other + igniter lead to the negative pyro terminal on the flight + computer. When the pyro channel fires, it will complete the + circuit between the negative pyro terminal and the ground + terminal, firing the igniter. Specific instructions on how + to hook this up for each flight computer will be found + in the section below for that flight computer. + + === Using a Different Kind of Battery + + EasyMini + ifdef::telemini[and TeleMini v2 are] + ifndef::telemini[is] + designed to use either a + lithium polymer battery or any other battery producing + between 4 and 12 volts, such as a rectangular 9V + battery. + + ifdef::telemega,easymega,telemetrum[] + [WARNING] + TeleMega, EasyMega and TeleMetrum are only designed to + operate off a single-cell Lithium Polymer battery and + cannot be used with any other kind. Connecting a + different kind of battery to any of these will destroy + the board. + endif::telemega,easymega,telemetrum[] diff --git a/doc/using-am-products.inc b/doc/using-am-products.inc new file mode 100644 index 00000000..1969529f --- /dev/null +++ b/doc/using-am-products.inc @@ -0,0 +1,171 @@ +== Using Altus Metrum Products + + ifdef::radio[] + === Being Legal + + In the US, you need an + link:http://www.altusmetrum.org/Radio/[amateur radio license] + or other authorization to legally operate the radio + transmitters that are part of our products. + endif::radio[] + + + === In the Rocket + + In the rocket itself, you just need a flight computer + and a single-cell, 3.7 volt nominal Li-Po rechargeable + battery. + ifdef::telemetrum,telemega,easymega[] + An 850mAh battery weighs less than a 9V + alkaline battery, and will run a TeleMetrum, TeleMega + or EasyMega for hours. + endif::telemetrum,telemega,easymega[] + A 110mAh battery weighs less + than a triple A battery and is a good choice for use + with + ifdef::telemini[TeleMini or] + EasyMini. + + ifdef::radio[] + By default, we ship TeleMini, TeleMetrum and TeleMega + flight computers with a simple wire antenna. If your + electronics bay or the air-frame it resides within is + made of carbon fiber, which is opaque to RF signals, + you may prefer to install an SMA connector so that you + can run a coaxial cable to an antenna mounted + elsewhere in the rocket. However, note that the GPS + antenna is fixed on all current products, so you + really want to install the flight computer in a bay + made of RF-transparent materials if at all possible. + endif::radio[] + + === On the Ground + + ifdef::radio[] + To receive the data stream from the rocket, you need + an antenna and short feed-line connected to one of our + link:http://www.altusmetrum.org/TeleDongle/[TeleDongle] + units. If possible, use an SMA to BNC adapter instead + of feedline between the antenna feedpoint and + TeleDongle, as this will give you the best + performance. The TeleDongle in turn plugs directly + into the USB port on a notebook computer. Because + TeleDongle looks like a simple serial port, your + computer does not require special device + drivers... just plug it in. + endif::radio[] + + The GUI tool, AltosUI, is written in Java and runs + across Linux, Mac OS and Windows. There's also a suite + of C tools for Linux which can perform most of the + same tasks. + + ifdef::radio[] + Alternatively, a TeleBT attached with an SMA to BNC + adapter at the feed point of a hand-held yagi used in + conjunction with an Android device running AltosDroid + makes an outstanding ground station. + endif::radio[] + + After the flight, + ifdef::radio[] + you can use the radio link to + extract the more detailed data logged in either + TeleMetrum or TeleMini devices, or + endif::radio[] + you can use a + USB cable to plug into the flight computer board directly. + A USB cable is also how you + charge the Li-Po battery, so you'll want one of those + anyway. The same cable used by lots of digital + cameras and other modern electronic stuff will work + fine. + + ifdef::gps[] + If your rocket lands out of sight, you may enjoy + having a hand-held GPS receiver, so that you can put + in a way-point for the last reported rocket position + before touch-down. This makes looking for your rocket + a lot like Geo-Caching... just go to the way-point and + look around starting from there. AltosDroid on an + Android device with GPS receiver works great for this, + too! + endif::gps[] + + ifdef::radio[] + You may also enjoy having a ham radio “HT” that covers + the 70cm band... you can use that with your antenna to + direction-find the rocket on the ground the same way + you can use a Walston or Beeline tracker. This can be + handy if the rocket is hiding in sage brush or a tree, + or if the last GPS position doesn't get you close + enough because the rocket dropped into a canyon, or + the wind is blowing it across a dry lake bed, or + something like that... Keith currently uses a Yaesu + FT1D, Bdale has a Yaesu VX-7R, which is a nicer radio + in most ways but doesn't support APRS. + + So, to recap, on the ground the hardware you'll need includes: + + . an antenna and feed-line or adapter + . a TeleDongle + . a notebook computer + . optionally, a hand-held GPS receiver + . optionally, an HT or receiver covering 435 MHz + + The best hand-held commercial directional antennas we've found for radio + direction finding rockets are from + link:http://www.arrowantennas.com/[Arrow Antennas]. + + The 440-3 and 440-5 are both good choices for finding + a TeleMetrum- or TeleMini- equipped rocket when used + with a suitable 70cm HT. TeleDongle and an SMA to BNC + adapter fit perfectly between the driven element and + reflector of Arrow antennas. + endif::radio[] + + === Data Analysis + + Our software makes it easy to log the data from each + flight, both the telemetry received during the flight + itself, and the more complete data log recorded in the + flash memory on the altimeter board. Once this data + is on your computer, our post-flight tools make it + easy to quickly get to the numbers everyone wants, + like apogee altitude, max acceleration, and max + velocity. You can also generate and view a standard + set of plots showing the altitude, acceleration, and + velocity of the rocket during flight. And you can + even export a flight log in a format usable with Google + Maps and Google Earth for visualizing the flight path + in two or three dimensions! + + Our ultimate goal is to emit a set of files for each + flight that can be published as a web page per flight, + or just viewed on your local disk with a web browser. + + === Future Plans + + ifdef::telemetrum,telemega,easymega[] + We have designed and prototyped several “companion + boards” that can attach to the companion connector on + TeleMetrum, TeleMega and EasyMega flight computers to + collect more data, provide more pyro channels, and so + forth. We do not yet know if or when any of these + boards will be produced in enough quantity to sell. + If you have specific interests for data collection or + control of events in your rockets beyond the + capabilities of our existing productions, please let + us know! + endif::telemetrum,telemega,easymega[] + + Because all of our work is open, both the hardware + designs and the software, if you have some great idea + for an addition to the current Altus Metrum family, + feel free to dive in and help! Or let us know what + you'd like to see that we aren't already working on, + and maybe we'll get excited about it too... + + Watch our link:http://altusmetrum.org/[web site] for + more news and information as our family of products + evolves! diff --git a/doc/xorg-fo.xsl b/doc/xorg-fo.xsl deleted file mode 100644 index 4b8c619f..00000000 --- a/doc/xorg-fo.xsl +++ /dev/null @@ -1,121 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<!-- - X.Org DocBook/XML customization - - DocBook XSL Stylesheets FO Parameters - http://docbook.sourceforge.net/release/xsl/current/doc/fo/ ---> - -<xsl:stylesheet - version='1.0' - xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:fo="http://www.w3.org/1999/XSL/Format" - > -<xsl:import href="file:///usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl"/> -<xsl:include href="titlepage.templates.xsl"/> - - - <!-- Reference Pages HTML/FO Parameters --> - - - <xsl:param name="function.parens" select="1"/> - - <!-- ANSI-style function synopses are generated for a funcsynopsis element --> - <xsl:param name="funcsynopsis.style" select="ansi"/> - - <!-- Linking HTML/FO Parameters --> - - <!-- open new PDF documents in new tab, don't replace doc in current window --> - <xsl:attribute-set name="olink.properties"> - <xsl:attribute name="show-destination">new</xsl:attribute> - </xsl:attribute-set> - - <!-- Miscellaneous HTML/FO Parameters--> - - <!-- SVG will be considered an acceptable image format --> - <xsl:param name="use.svg" select="1"/> - - <!-- ToC/LoT/Index Generation --> - <!-- put page breaks before and after the Table of Contents, - so that the ToC is on a page by itself - Reference: http://www.sagehill.net/docbookxsl/PrintToc.html - --> - <xsl:attribute-set name="toc.margin.properties"> - <xsl:attribute name="break-before">page</xsl:attribute> - <xsl:attribute name="break-after">page</xsl:attribute> - </xsl:attribute-set> - - <!-- Pagination and General Styles FO Parameters --> - <!-- - Speed up ps & pdf creation by not creating pages with "draft" image, - thus not needing to wait for http fetch of draft.png from docbook website. - --> - <xsl:param name="draft.mode" select="no"/> - - <!-- Processor Extensions FO Parameters--> - - <!-- PDF bookmarks extensions for FOP version 0.90 and later will be used. --> - <xsl:param name="fop.extensions" select="0"></xsl:param> - <xsl:param name="fop1.extensions" select="1"></xsl:param> - - <!-- Cross Refrences FO Parameters--> - - <!-- Make links in pdf output blue so it's easier to tell they're internal - links - --> - <xsl:attribute-set name="xref.properties"> - <xsl:attribute name="color">blue</xsl:attribute> - </xsl:attribute-set> - - <!-- Make links in pdf output green so it's easier to tell they're external - links - --> - <xsl:attribute-set name="olink.properties"> - <xsl:attribute name="color">green</xsl:attribute> - </xsl:attribute-set> - - <!-- Linking to a target inside a pdf document. - This feature is only available as of docbook-xsl-1.76.1. - When set to zero, the link will point to the document --> - <xsl:param name="insert.olink.pdf.frag" select="0"></xsl:param> - - - <!-- Font Families FO Parameters --> - - <!-- - Since a number of documents, especially the credits section in the - ReleaseNotes, use characters not found in the fop default base-14 - PostScript fonts, set the fonts for the fop generated documents to - use the free DejaVu and GNU Unifont fonts which cover a much wider - range of characters. - - DejaVu is available from http://dejavu-fonts.org/ - GNU Unifont is available from http://unifoundry.com/unifont.html - - To set fop font paths to find them after installing, see - http://xmlgraphics.apache.org/fop/1.0/fonts.html#basics - --> - <xsl:param name="body.font.family">DejaVu Serif</xsl:param> - <xsl:param name="symbol.font.family">serif,Symbol,AR PL UMing CN,AR PL ShanHeiSun Uni,GNU Unifont</xsl:param> - - <!-- Paragraph template bits --> - - <!-- make it possible to turn off hyphenation when it's giving us probs --> - <xsl:template match="para[@hyphenate='false']"> - <fo:block hyphenate="false" xsl:use-attribute-sets="normal.para.spacing"> - <xsl:call-template name="anchor"/> - <xsl:apply-templates/> - </fo:block> - </xsl:template> - - <!-- force line break --> - <xsl:template match="processing-instruction('linebreak')"> - <fo:block/> - </xsl:template> - - <xsl:attribute-set name="informalfigure.properties"> - <xsl:attribute name="text-align">center</xsl:attribute> - </xsl:attribute-set> - -</xsl:stylesheet> diff --git a/micropeak/MicroData.java b/micropeak/MicroData.java index 62f03c9d..085b0131 100644 --- a/micropeak/MicroData.java +++ b/micropeak/MicroData.java @@ -20,8 +20,8 @@ package org.altusmetrum.micropeak; import java.lang.*; import java.io.*; import java.util.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; class MicroIterator implements Iterator<MicroDataPoint> { int i; diff --git a/micropeak/MicroDataPoint.java b/micropeak/MicroDataPoint.java index 1c36fefe..0157f05d 100644 --- a/micropeak/MicroDataPoint.java +++ b/micropeak/MicroDataPoint.java @@ -17,7 +17,7 @@ package org.altusmetrum.micropeak; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*; public class MicroDataPoint implements AltosUIDataPoint { public double time; diff --git a/micropeak/MicroDeviceDialog.java b/micropeak/MicroDeviceDialog.java index a6d0f321..6e45359b 100644 --- a/micropeak/MicroDeviceDialog.java +++ b/micropeak/MicroDeviceDialog.java @@ -21,7 +21,7 @@ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*; public class MicroDeviceDialog extends AltosDeviceDialog { diff --git a/micropeak/MicroDownload.java b/micropeak/MicroDownload.java index 7314cc7f..53d70b1b 100644 --- a/micropeak/MicroDownload.java +++ b/micropeak/MicroDownload.java @@ -23,8 +23,8 @@ import javax.swing.*; import java.io.*; import java.util.concurrent.*; import java.util.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class MicroDownload extends AltosUIDialog implements Runnable, ActionListener, MicroSerialLog, WindowListener { MicroPeak owner; diff --git a/micropeak/MicroExport.java b/micropeak/MicroExport.java index d3cfc3b8..c5b5d3d6 100644 --- a/micropeak/MicroExport.java +++ b/micropeak/MicroExport.java @@ -23,8 +23,8 @@ import java.util.ArrayList; import java.awt.*; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class MicroExport extends JFileChooser { diff --git a/micropeak/MicroFile.java b/micropeak/MicroFile.java index d48598cb..5712d6b6 100644 --- a/micropeak/MicroFile.java +++ b/micropeak/MicroFile.java @@ -19,8 +19,8 @@ package org.altusmetrum.micropeak; import java.io.*; import java.util.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class MicroFile { diff --git a/micropeak/MicroFileChooser.java b/micropeak/MicroFileChooser.java index d72d956a..01ce284b 100644 --- a/micropeak/MicroFileChooser.java +++ b/micropeak/MicroFileChooser.java @@ -20,8 +20,8 @@ package org.altusmetrum.micropeak; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.io.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class MicroFileChooser extends JFileChooser { JFrame frame; diff --git a/micropeak/MicroFrame.java b/micropeak/MicroFrame.java index 9b0f1e7c..21f839b6 100644 --- a/micropeak/MicroFrame.java +++ b/micropeak/MicroFrame.java @@ -21,7 +21,7 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*; public class MicroFrame extends AltosUIFrame { static String[] micro_icon_names = { diff --git a/micropeak/MicroGraph.java b/micropeak/MicroGraph.java index c7a2d345..c4dcb29c 100644 --- a/micropeak/MicroGraph.java +++ b/micropeak/MicroGraph.java @@ -22,8 +22,8 @@ import java.util.ArrayList; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; import org.jfree.ui.*; import org.jfree.chart.*; diff --git a/micropeak/MicroPeak.java b/micropeak/MicroPeak.java index 2df81621..1b7327e4 100644 --- a/micropeak/MicroPeak.java +++ b/micropeak/MicroPeak.java @@ -23,8 +23,8 @@ import javax.swing.*; import java.io.*; import java.util.concurrent.*; import java.util.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class MicroPeak extends MicroFrame implements ActionListener, ItemListener { diff --git a/micropeak/MicroRaw.java b/micropeak/MicroRaw.java index 6aae0bde..c3504834 100644 --- a/micropeak/MicroRaw.java +++ b/micropeak/MicroRaw.java @@ -20,8 +20,8 @@ package org.altusmetrum.micropeak; import java.awt.*; import java.io.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class MicroRaw extends JTextArea { diff --git a/micropeak/MicroSave.java b/micropeak/MicroSave.java index d8fe59c2..e964ee9e 100644 --- a/micropeak/MicroSave.java +++ b/micropeak/MicroSave.java @@ -24,8 +24,8 @@ import javax.swing.filechooser.FileNameExtensionFilter; import java.io.*; import java.util.concurrent.*; import java.util.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class MicroSave extends JFileChooser { diff --git a/micropeak/MicroSerial.java b/micropeak/MicroSerial.java index 8d20718f..f5a98929 100644 --- a/micropeak/MicroSerial.java +++ b/micropeak/MicroSerial.java @@ -20,7 +20,7 @@ package org.altusmetrum.micropeak; import java.util.*; import java.io.*; import libaltosJNI.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*; public class MicroSerial extends InputStream { SWIGTYPE_p_altos_file file; diff --git a/micropeak/MicroSerialLog.java b/micropeak/MicroSerialLog.java index c7a0525d..e808dee2 100644 --- a/micropeak/MicroSerialLog.java +++ b/micropeak/MicroSerialLog.java @@ -20,7 +20,7 @@ package org.altusmetrum.micropeak; import java.util.*; import java.io.*; import libaltosJNI.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*; public interface MicroSerialLog { diff --git a/micropeak/MicroStats.java b/micropeak/MicroStats.java index 8d83fe3e..9e8f1938 100644 --- a/micropeak/MicroStats.java +++ b/micropeak/MicroStats.java @@ -18,8 +18,8 @@ package org.altusmetrum.micropeak; import java.io.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class MicroStats { double coast_height; diff --git a/micropeak/MicroStatsTable.java b/micropeak/MicroStatsTable.java index 35d10eee..ad7b206c 100644 --- a/micropeak/MicroStatsTable.java +++ b/micropeak/MicroStatsTable.java @@ -19,8 +19,8 @@ package org.altusmetrum.micropeak; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class MicroStatsTable extends JComponent implements AltosFontListener { GridBagLayout layout; diff --git a/micropeak/MicroUSB.java b/micropeak/MicroUSB.java index 3a7891cb..f6568d36 100644 --- a/micropeak/MicroUSB.java +++ b/micropeak/MicroUSB.java @@ -19,8 +19,8 @@ package org.altusmetrum.micropeak; import java.util.*; import libaltosJNI.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class MicroUSB extends altos_device implements AltosDevice { diff --git a/src/Makefile b/src/Makefile index dc74bf8c..ebe1df9c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -29,6 +29,7 @@ ARMM3DIRS=\ easymega-v1.0 easymega-v1.0/flash-loader \ telemega-v0.1 telemega-v0.1/flash-loader \ telemega-v1.0 telemega-v1.0/flash-loader \ + telemega-v2.0 telemega-v2.0/flash-loader \ telemetrum-v2.0 telemetrum-v2.0/flash-loader \ megadongle-v0.1 megadongle-v0.1/flash-loader \ telegps-v0.3 telegps-v0.3/flash-loader \ diff --git a/src/drivers/ao_companion.c b/src/drivers/ao_companion.c index 7e02939b..5f07e8b0 100644 --- a/src/drivers/ao_companion.c +++ b/src/drivers/ao_companion.c @@ -23,6 +23,10 @@ #define ao_spi_fast(b) #endif +#if !HAS_COMPANION +#error HAS_COMPANION not set in ao_companion.c +#endif + #define COMPANION_SELECT() do { \ ao_spi_get_bit(AO_COMPANION_CS_PORT, \ AO_COMPANION_CS_PIN, \ diff --git a/src/drivers/ao_lco.c b/src/drivers/ao_lco.c index b8698a80..6c192537 100644 --- a/src/drivers/ao_lco.c +++ b/src/drivers/ao_lco.c @@ -36,28 +36,70 @@ static uint8_t ao_lco_debug; #define AO_LCO_BOX_DIGIT_1 1 #define AO_LCO_BOX_DIGIT_10 2 +#define AO_LCO_DRAG_RACE_START_TIME AO_SEC_TO_TICKS(5) +#define AO_LCO_DRAG_RACE_STOP_TIME AO_SEC_TO_TICKS(2) + +#define AO_LCO_VALID_LAST 1 +#define AO_LCO_VALID_EVER 2 + static uint8_t ao_lco_min_box, ao_lco_max_box; -static uint8_t ao_lco_pad; -static uint8_t ao_lco_box; +static uint8_t ao_lco_selected[AO_PAD_MAX_BOXES]; +static uint8_t ao_lco_valid[AO_PAD_MAX_BOXES]; +static uint8_t ao_lco_channels[AO_PAD_MAX_BOXES]; +static uint16_t ao_lco_tick_offset[AO_PAD_MAX_BOXES]; + +/* UI values */ static uint8_t ao_lco_armed; static uint8_t ao_lco_firing; -static uint8_t ao_lco_valid; -static uint8_t ao_lco_got_channels; -static uint16_t ao_lco_tick_offset; +static uint16_t ao_lco_fire_tick; +static uint8_t ao_lco_fire_down; +static uint8_t ao_lco_drag_race; +static uint8_t ao_lco_pad; +static int16_t ao_lco_box; + +#define AO_LCO_BOX_DRAG 0x1000 static struct ao_pad_query ao_pad_query; +static uint8_t ao_lco_display_mutex; + static void ao_lco_set_pad(uint8_t pad) { - ao_seven_segment_set(AO_LCO_PAD_DIGIT, pad); + ao_mutex_get(&ao_lco_display_mutex); + ao_seven_segment_set(AO_LCO_PAD_DIGIT, pad | (ao_lco_drag_race << 4)); + ao_mutex_put(&ao_lco_display_mutex); } +#define SEVEN_SEGMENT_d ((0 << 0) | \ + (0 << 1) | \ + (1 << 2) | \ + (1 << 3) | \ + (1 << 4) | \ + (1 << 5) | \ + (1 << 6)) + + +#define SEVEN_SEGMENT_r ((0 << 0) | \ + (0 << 1) | \ + (0 << 2) | \ + (1 << 3) | \ + (1 << 4) | \ + (0 << 5) | \ + (0 << 6)) + static void -ao_lco_set_box(uint8_t box) +ao_lco_set_box(uint16_t box) { - ao_seven_segment_set(AO_LCO_BOX_DIGIT_1, box % 10); - ao_seven_segment_set(AO_LCO_BOX_DIGIT_10, box / 10); + ao_mutex_get(&ao_lco_display_mutex); + if (box == AO_LCO_BOX_DRAG) { + ao_seven_segment_direct(AO_LCO_BOX_DIGIT_10, SEVEN_SEGMENT_d | (ao_lco_drag_race << 7)); + ao_seven_segment_direct(AO_LCO_BOX_DIGIT_1, SEVEN_SEGMENT_r | (ao_lco_drag_race << 7)); + } else { + ao_seven_segment_set(AO_LCO_BOX_DIGIT_1, box % 10 | (ao_lco_drag_race << 4)); + ao_seven_segment_set(AO_LCO_BOX_DIGIT_10, box / 10 | (ao_lco_drag_race << 4)); + } + ao_mutex_put(&ao_lco_display_mutex); } static void @@ -68,18 +110,23 @@ ao_lco_set_voltage(uint16_t decivolts) tenths = decivolts % 10; ones = (decivolts / 10) % 10; tens = (decivolts / 100) % 10; + ao_mutex_get(&ao_lco_display_mutex); ao_seven_segment_set(AO_LCO_PAD_DIGIT, tenths); ao_seven_segment_set(AO_LCO_BOX_DIGIT_1, ones | 0x10); ao_seven_segment_set(AO_LCO_BOX_DIGIT_10, tens); + ao_mutex_put(&ao_lco_display_mutex); } static void ao_lco_set_display(void) { - if (ao_lco_pad == 0) { + if (ao_lco_pad == 0 && ao_lco_box != AO_LCO_BOX_DRAG) { ao_lco_set_voltage(ao_pad_query.battery); } else { - ao_lco_set_pad(ao_lco_pad); + if (ao_lco_box == AO_LCO_BOX_DRAG) + ao_lco_set_pad(ao_lco_drag_race); + else + ao_lco_set_pad(ao_lco_pad); ao_lco_set_box(ao_lco_box); } } @@ -91,42 +138,205 @@ ao_lco_set_display(void) static uint8_t ao_lco_box_mask[MASK_SIZE(AO_PAD_MAX_BOXES)]; static uint8_t -ao_lco_box_present(uint8_t box) +ao_lco_box_present(uint16_t box) { + if (box == AO_LCO_BOX_DRAG) + return 1; + if (box >= AO_PAD_MAX_BOXES) return 0; return (ao_lco_box_mask[MASK_ID(box)] >> MASK_SHIFT(box)) & 1; } static uint8_t -ao_lco_pad_present(uint8_t pad) +ao_lco_pad_present(uint8_t box, uint8_t pad) { - if (!ao_lco_got_channels || !ao_pad_query.channels) - return pad == 0; /* voltage measurement is always valid */ if (pad == 0) return 1; + if (!ao_lco_channels[box]) + return 0; if (pad > AO_PAD_MAX_CHANNELS) return 0; - return (ao_pad_query.channels >> (pad - 1)) & 1; + return (ao_lco_channels[box] >> (pad - 1)) & 1; } static uint8_t -ao_lco_pad_first(void) +ao_lco_pad_first(uint8_t box) { uint8_t pad; for (pad = 1; pad <= AO_PAD_MAX_CHANNELS; pad++) - if (ao_lco_pad_present(pad)) + if (ao_lco_pad_present(box, pad)) return pad; return 0; } +static struct ao_task ao_lco_drag_task; +static uint8_t ao_lco_drag_active; +static uint8_t ao_lco_drag_beep_count; +static uint8_t ao_lco_drag_beep_on; +static uint16_t ao_lco_drag_beep_time; +static uint16_t ao_lco_drag_warn_time; + +#define AO_LCO_DRAG_BEEP_TIME AO_MS_TO_TICKS(50) +#define AO_LCO_DRAG_WARN_TIME AO_SEC_TO_TICKS(5) + +static void +ao_lco_drag_beep_start(void) +{ + ao_beep(AO_BEEP_HIGH); + PRINTD("beep start\n"); + ao_lco_drag_beep_on = 1; + ao_lco_drag_beep_time = ao_time() + AO_LCO_DRAG_BEEP_TIME; +} + +static void +ao_lco_drag_beep_stop(void) +{ + ao_beep(0); + PRINTD("beep stop\n"); + ao_lco_drag_beep_on = 0; + if (ao_lco_drag_beep_count) { + --ao_lco_drag_beep_count; + if (ao_lco_drag_beep_count) + ao_lco_drag_beep_time = ao_time() + AO_LCO_DRAG_BEEP_TIME; + } +} + +static void +ao_lco_drag_beep(uint8_t beeps) +{ + PRINTD("beep %d\n", beeps); + if (!ao_lco_drag_beep_count) + ao_lco_drag_beep_start(); + ao_lco_drag_beep_count += beeps; +} + +static uint16_t +ao_lco_drag_beep_check(uint16_t now, uint16_t delay) +{ + PRINTD("beep check count %d delta %d\n", + ao_lco_drag_beep_count, + (int16_t) (now - ao_lco_drag_beep_time)); + if (ao_lco_drag_beep_count) { + if ((int16_t) (now - ao_lco_drag_beep_time) >= 0) { + if (ao_lco_drag_beep_on) + ao_lco_drag_beep_stop(); + else + ao_lco_drag_beep_start(); + } + } + + if (ao_lco_drag_beep_count) { + if (delay > AO_LCO_DRAG_BEEP_TIME) + delay = AO_LCO_DRAG_BEEP_TIME; + } + return delay; +} + +static void +ao_lco_drag_enable(void) +{ + PRINTD("Drag enable\n"); + ao_lco_drag_race = 1; + memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); + ao_lco_drag_beep(5); + ao_lco_set_display(); + ao_lco_fire_down = 0; +} + +static void +ao_lco_drag_disable(void) +{ + PRINTD("Drag disable\n"); + ao_lco_drag_race = 0; + memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); + ao_lco_drag_beep(2); + ao_lco_set_display(); + ao_lco_fire_down = 0; +} + +static uint16_t +ao_lco_drag_button_check(uint16_t now, uint16_t delay) +{ + uint16_t button_delay = ~0; + + /* + * Check to see if the button has been held down long enough + * to switch in/out of drag race mode + */ + if (ao_lco_fire_down) { + if (ao_lco_drag_race) { + if ((int16_t) (now - ao_lco_fire_tick) >= AO_LCO_DRAG_RACE_STOP_TIME) + ao_lco_drag_disable(); + else + button_delay = ao_lco_fire_tick + AO_LCO_DRAG_RACE_STOP_TIME - now; + } else { + if ((int16_t) (now - ao_lco_fire_tick) >= AO_LCO_DRAG_RACE_START_TIME) + ao_lco_drag_enable(); + else + button_delay = ao_lco_fire_tick + AO_LCO_DRAG_RACE_START_TIME - now; + } + if (delay > button_delay) + delay = button_delay; + } + return delay; +} + +static uint16_t +ao_lco_drag_warn_check(uint16_t now, uint16_t delay) +{ + uint16_t warn_delay = ~0; + + if (ao_lco_drag_race) { + if ((int16_t) (now - ao_lco_drag_warn_time) >= 0) { + ao_lco_drag_beep(1); + ao_lco_drag_warn_time = now + AO_LCO_DRAG_WARN_TIME; + } + warn_delay = ao_lco_drag_warn_time - now; + } + if (delay > warn_delay) + delay = warn_delay; + return delay; +} + +static void +ao_lco_drag_monitor(void) +{ + uint16_t delay = ~0; + uint16_t now; + + for (;;) { + PRINTD("Drag monitor active %d delay %d\n", ao_lco_drag_active, delay); + if (delay == (uint16_t) ~0) + ao_sleep(&ao_lco_drag_active); + else + ao_sleep_for(&ao_lco_drag_active, delay); + + delay = ~0; + if (!ao_lco_drag_active) + continue; + + now = ao_time(); + delay = ao_lco_drag_button_check(now, delay); + delay = ao_lco_drag_warn_check(now, delay); + delay = ao_lco_drag_beep_check(now, delay); + + /* check to see if there's anything left to do here */ + if (!ao_lco_fire_down && !ao_lco_drag_race && !ao_lco_drag_beep_count) { + delay = ~0; + ao_lco_drag_active = 0; + } + } +} + static void ao_lco_input(void) { static struct ao_event event; - int8_t dir, new_box, new_pad; + int8_t dir, new_pad; + int16_t new_box; ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(200)); for (;;) { @@ -148,7 +358,7 @@ ao_lco_input(void) new_pad = AO_PAD_MAX_CHANNELS; if (new_pad == ao_lco_pad) break; - } while (!ao_lco_pad_present(new_pad)); + } while (!ao_lco_pad_present(ao_lco_box, new_pad)); if (new_pad != ao_lco_pad) { ao_lco_pad = new_pad; ao_lco_set_display(); @@ -160,18 +370,26 @@ ao_lco_input(void) dir = (int8_t) event.value; new_box = ao_lco_box; do { - new_box += dir; - if (new_box > ao_lco_max_box) - new_box = ao_lco_min_box; - else if (new_box < ao_lco_min_box) - new_box = ao_lco_max_box; + if (new_box == AO_LCO_BOX_DRAG) { + if (dir < 0) + new_box = ao_lco_max_box; + else + new_box = ao_lco_min_box; + } else { + new_box += dir; + if (new_box > ao_lco_max_box) + new_box = AO_LCO_BOX_DRAG; + else if (new_box < ao_lco_min_box) + new_box = AO_LCO_BOX_DRAG; + } if (new_box == ao_lco_box) break; } while (!ao_lco_box_present(new_box)); if (ao_lco_box != new_box) { ao_lco_box = new_box; ao_lco_pad = 1; - ao_lco_got_channels = 0; + if (ao_lco_box != AO_LCO_BOX_DRAG) + ao_lco_channels[ao_lco_box] = 0; ao_lco_set_display(); } } @@ -183,13 +401,53 @@ ao_lco_input(void) case AO_BUTTON_ARM: ao_lco_armed = event.value; PRINTD("Armed %d\n", ao_lco_armed); + if (ao_lco_armed) { + if (ao_lco_drag_race) { + uint8_t box; + + for (box = ao_lco_min_box; box <= ao_lco_max_box; box++) { + if (ao_lco_selected[box]) { + ao_wakeup(&ao_lco_armed); + break; + } + } + } else { + memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); + if (ao_lco_pad != 0 && ao_lco_box != AO_LCO_BOX_DRAG) + ao_lco_selected[ao_lco_box] = (1 << (ao_lco_pad - 1)); + else + ao_lco_armed = 0; + } + } ao_wakeup(&ao_lco_armed); break; case AO_BUTTON_FIRE: if (ao_lco_armed) { + ao_lco_fire_down = 0; ao_lco_firing = event.value; PRINTD("Firing %d\n", ao_lco_firing); ao_wakeup(&ao_lco_armed); + } else { + if (event.value) { + if (ao_lco_box == AO_LCO_BOX_DRAG) { + ao_lco_fire_down = 1; + ao_lco_fire_tick = ao_time(); + ao_lco_drag_active = 1; + } + if (ao_lco_drag_race) { + if (ao_lco_pad != 0 && ao_lco_box != AO_LCO_BOX_DRAG) { + ao_lco_selected[ao_lco_box] ^= (1 << (ao_lco_pad - 1)); + PRINTD("Toggle box %d pad %d (pads now %x) to drag race\n", + ao_lco_pad, ao_lco_box, ao_lco_selected[ao_lco_box]); + ao_lco_drag_beep(ao_lco_pad); + } + } + ao_wakeup(&ao_lco_drag_active); + } else { + ao_lco_fire_down = 0; + if (ao_lco_drag_active) + ao_wakeup(&ao_lco_drag_active); + } } break; } @@ -225,37 +483,38 @@ static AO_LED_TYPE continuity_led[AO_LED_CONTINUITY_NUM] = { #endif }; -static void -ao_lco_update(void) +static uint8_t +ao_lco_get_channels(uint8_t box, struct ao_pad_query *query) { int8_t r; - uint8_t c; - r = ao_lco_query(ao_lco_box, &ao_pad_query, &ao_lco_tick_offset); + r = ao_lco_query(box, query, &ao_lco_tick_offset[box]); if (r == AO_RADIO_CMAC_OK) { - c = ao_lco_got_channels; - ao_lco_got_channels = 1; - ao_lco_valid = 1; - if (!c) { - if (ao_lco_pad != 0) - ao_lco_pad = ao_lco_pad_first(); - ao_lco_set_display(); - } - if (ao_lco_pad == 0) - ao_lco_set_display(); + ao_lco_channels[box] = query->channels; + ao_lco_valid[box] = AO_LCO_VALID_LAST | AO_LCO_VALID_EVER; } else - ao_lco_valid = 0; - -#if 0 - PRINTD("lco_query success arm_status %d i0 %d i1 %d i2 %d i3 %d\n", - query.arm_status, - query.igniter_status[0], - query.igniter_status[1], - query.igniter_status[2], - query.igniter_status[3]); -#endif - PRINTD("ao_lco_update valid %d\n", ao_lco_valid); + ao_lco_valid[box] &= ~AO_LCO_VALID_LAST; + PRINTD("ao_lco_get_channels(%d) rssi %d valid %d ret %d offset %d\n", box, ao_radio_cmac_rssi, ao_lco_valid[box], r, ao_lco_tick_offset[box]); ao_wakeup(&ao_pad_query); + return ao_lco_valid[box]; +} + +static void +ao_lco_update(void) +{ + if (ao_lco_box != AO_LCO_BOX_DRAG) { + uint8_t previous_valid = ao_lco_valid[ao_lco_box]; + + if (ao_lco_get_channels(ao_lco_box, &ao_pad_query) & AO_LCO_VALID_LAST) { + if (!(previous_valid & AO_LCO_VALID_EVER)) { + if (ao_lco_pad != 0) + ao_lco_pad = ao_lco_pad_first(ao_lco_box); + ao_lco_set_display(); + } + if (ao_lco_pad == 0) + ao_lco_set_display(); + } + } } static void @@ -281,7 +540,6 @@ ao_lco_box_set_present(uint8_t box) static void ao_lco_search(void) { - uint16_t tick_offset; int8_t r; int8_t try; uint8_t box; @@ -293,9 +551,9 @@ ao_lco_search(void) if ((box % 10) == 0) ao_lco_set_box(box); for (try = 0; try < 3; try++) { - tick_offset = 0; - r = ao_lco_query(box, &ao_pad_query, &tick_offset); - PRINTD("box %d result %d\n", box, r); + ao_lco_tick_offset[box] = 0; + r = ao_lco_query(box, &ao_pad_query, &ao_lco_tick_offset[box]); + PRINTD("box %d result %d offset %d\n", box, r, ao_lco_tick_offset[box]); if (r == AO_RADIO_CMAC_OK) { ++boxes; ao_lco_box_set_present(box); @@ -309,8 +567,8 @@ ao_lco_search(void) ao_lco_box = ao_lco_min_box; else ao_lco_min_box = ao_lco_max_box = ao_lco_box = 0; - ao_lco_valid = 0; - ao_lco_got_channels = 0; + memset(ao_lco_valid, 0, sizeof (ao_lco_valid)); + memset(ao_lco_channels, 0, sizeof (ao_lco_channels)); ao_lco_pad = 1; ao_lco_set_display(); } @@ -319,37 +577,53 @@ static void ao_lco_igniter_status(void) { uint8_t c; + uint8_t t = 0; for (;;) { ao_sleep(&ao_pad_query); - PRINTD("RSSI %d VALID %d\n", ao_radio_cmac_rssi, ao_lco_valid); - if (!ao_lco_valid) { - ao_led_on(AO_LED_RED); - ao_led_off(AO_LED_GREEN|AO_LED_AMBER); - continue; - } - if (ao_radio_cmac_rssi < -90) { - ao_led_on(AO_LED_AMBER); - ao_led_off(AO_LED_RED|AO_LED_GREEN); + PRINTD("RSSI %d VALID %d\n", ao_radio_cmac_rssi, ao_lco_box == AO_LCO_BOX_DRAG ? -1 : ao_lco_valid[ao_lco_box]); + if (ao_lco_box == AO_LCO_BOX_DRAG) { + ao_led_off(AO_LED_RED|AO_LED_GREEN|AO_LED_AMBER); + for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) + ao_led_off(continuity_led[c]); } else { - ao_led_on(AO_LED_GREEN); - ao_led_off(AO_LED_RED|AO_LED_AMBER); - } - if (ao_pad_query.arm_status) - ao_led_on(AO_LED_REMOTE_ARM); - else - ao_led_off(AO_LED_REMOTE_ARM); - for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) { - uint8_t status; - - if (ao_pad_query.channels & (1 << c)) - status = ao_pad_query.igniter_status[c]; - else - status = AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_OPEN; - if (status == AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN) - ao_led_on(continuity_led[c]); + if (!(ao_lco_valid[ao_lco_box] & AO_LCO_VALID_LAST)) { + ao_led_on(AO_LED_RED); + ao_led_off(AO_LED_GREEN|AO_LED_AMBER); + continue; + } + if (ao_radio_cmac_rssi < -90) { + ao_led_on(AO_LED_AMBER); + ao_led_off(AO_LED_RED|AO_LED_GREEN); + } else { + ao_led_on(AO_LED_GREEN); + ao_led_off(AO_LED_RED|AO_LED_AMBER); + } + if (ao_pad_query.arm_status) + ao_led_on(AO_LED_REMOTE_ARM); else - ao_led_off(continuity_led[c]); + ao_led_off(AO_LED_REMOTE_ARM); + + for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) { + uint8_t status; + + if (ao_lco_drag_race) { + if (ao_lco_selected[ao_lco_box] & (1 << c) && t) + ao_led_on(continuity_led[c]); + else + ao_led_off(continuity_led[c]); + } else { + if (ao_pad_query.channels & (1 << c)) + status = ao_pad_query.igniter_status[c]; + else + status = AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_OPEN; + if (status == AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN) + ao_led_on(continuity_led[c]); + else + ao_led_off(continuity_led[c]); + } + } + t = 1-t; } } } @@ -374,34 +648,33 @@ static void ao_lco_monitor(void) { uint16_t delay; + uint8_t box; ao_lco_search(); ao_add_task(&ao_lco_input_task, ao_lco_input, "lco input"); ao_add_task(&ao_lco_arm_warn_task, ao_lco_arm_warn, "lco arm warn"); ao_add_task(&ao_lco_igniter_status_task, ao_lco_igniter_status, "lco igniter status"); + ao_add_task(&ao_lco_drag_task, ao_lco_drag_monitor, "drag race"); for (;;) { - PRINTD("monitor armed %d firing %d offset %d\n", - ao_lco_armed, ao_lco_firing, ao_lco_tick_offset); + PRINTD("monitor armed %d firing %d\n", + ao_lco_armed, ao_lco_firing); if (ao_lco_armed && ao_lco_firing) { - PRINTD("Firing box %d pad %d: valid %d\n", - ao_lco_box, ao_lco_pad, ao_lco_valid); - if (!ao_lco_valid) - ao_lco_update(); - if (ao_lco_valid && ao_lco_pad) - ao_lco_ignite(ao_lco_box, 1 << (ao_lco_pad - 1), ao_lco_tick_offset); - } else if (ao_lco_armed) { - PRINTD("Arming box %d pad %d\n", - ao_lco_box, ao_lco_pad); - if (!ao_lco_valid) - ao_lco_update(); - if (ao_lco_pad) { - ao_lco_arm(ao_lco_box, 1 << (ao_lco_pad - 1), ao_lco_tick_offset); - ao_delay(AO_MS_TO_TICKS(30)); - ao_lco_update(); - } + ao_lco_ignite(); } else { ao_lco_update(); + if (ao_lco_armed) { + for (box = ao_lco_min_box; box <= ao_lco_max_box; box++) { + if (ao_lco_selected[box]) { + PRINTD("Arming box %d pads %x\n", + box, ao_lco_selected[box]); + if (ao_lco_valid[box] & AO_LCO_VALID_EVER) { + ao_lco_arm(box, ao_lco_selected[box], ao_lco_tick_offset[box]); + ao_delay(AO_MS_TO_TICKS(10)); + } + } + } + } } if (ao_lco_armed && ao_lco_firing) delay = AO_MS_TO_TICKS(100); diff --git a/src/drivers/ao_lco_cmd.c b/src/drivers/ao_lco_cmd.c index acbf589a..6a365687 100644 --- a/src/drivers/ao_lco_cmd.c +++ b/src/drivers/ao_lco_cmd.c @@ -62,7 +62,7 @@ lco_arm(void) static void lco_ignite(void) { - ao_lco_ignite(lco_box, lco_channels, tick_offset); + ao_lco_ignite(); } static void diff --git a/src/drivers/ao_lco_func.c b/src/drivers/ao_lco_func.c index 32c00068..08d45467 100644 --- a/src/drivers/ao_lco_func.c +++ b/src/drivers/ao_lco_func.c @@ -44,7 +44,7 @@ ao_lco_query(uint16_t box, struct ao_pad_query *query, uint16_t *tick_offset) } #endif ao_mutex_get(&ao_lco_mutex); - command.tick = ao_time() - *tick_offset; + command.tick = ao_time(); command.box = box; command.cmd = AO_LAUNCH_QUERY; command.channels = 0; @@ -70,14 +70,13 @@ ao_lco_arm(uint16_t box, uint8_t channels, uint16_t tick_offset) } void -ao_lco_ignite(uint16_t box, uint8_t channels, uint16_t tick_offset) +ao_lco_ignite(void) { ao_mutex_get(&ao_lco_mutex); - command.tick = ao_time() - tick_offset; - command.box = box; + command.tick = 0; + command.box = 0; command.cmd = AO_LAUNCH_FIRE; - command.channels = channels; + command.channels = 0; ao_radio_cmac_send(&command, sizeof (command)); ao_mutex_put(&ao_lco_mutex); } - diff --git a/src/drivers/ao_lco_func.h b/src/drivers/ao_lco_func.h index dccf602a..42754352 100644 --- a/src/drivers/ao_lco_func.h +++ b/src/drivers/ao_lco_func.h @@ -27,6 +27,6 @@ void ao_lco_arm(uint16_t box, uint8_t channels, uint16_t tick_offset); void -ao_lco_ignite(uint16_t box, uint8_t channels, uint16_t tick_offset); +ao_lco_ignite(void); #endif /* _AO_LCO_FUNC_H_ */ diff --git a/src/drivers/ao_pad.c b/src/drivers/ao_pad.c index ffe46c68..419ea8d3 100644 --- a/src/drivers/ao_pad.c +++ b/src/drivers/ao_pad.c @@ -288,8 +288,7 @@ ao_pad(void) PRINTD ("armed\n"); ao_pad_armed = command.channels; ao_pad_arm_time = ao_time(); - - /* fall through ... */ + break; case AO_LAUNCH_QUERY: if (command.box != ao_pad_box) { @@ -320,13 +319,6 @@ ao_pad(void) ao_pad_arm_time, ao_time()); break; } - time_difference = command.tick - ao_time(); - if (time_difference < 0) - time_difference = -time_difference; - if (time_difference > 10) { - PRINTD ("time different too large %d\n", time_difference); - break; - } PRINTD ("ignite\n"); ao_pad_ignite = ao_pad_armed; ao_pad_arm_time = ao_time(); diff --git a/src/drivers/ao_pwm.h b/src/drivers/ao_pwm.h new file mode 100644 index 00000000..2dd2ffd5 --- /dev/null +++ b/src/drivers/ao_pwm.h @@ -0,0 +1,29 @@ +/* + * Copyright © 2015 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#ifndef _AO_PWM_H_ +#define _AO_PWM_H_ + +#include <stdint.h> + +void +ao_pwm_set(uint8_t pwm, uint16_t value); + +void +ao_pwm_init(void); + +#endif /* _AO_PWM_H_ */ diff --git a/src/drivers/ao_seven_segment.c b/src/drivers/ao_seven_segment.c index 961fbb84..f1339ee5 100644 --- a/src/drivers/ao_seven_segment.c +++ b/src/drivers/ao_seven_segment.c @@ -168,10 +168,20 @@ static const uint8_t ao_segments[] = { (0 << 6), /* F */ }; + void -ao_seven_segment_set(uint8_t digit, uint8_t value) +ao_seven_segment_direct(uint8_t digit, uint8_t segments) { uint8_t s; + + for (s = 0; s <= 7; s++) + ao_lcd_set(digit, s, !!(segments & (1 << s))); + ao_lcd_flush(); +} + +void +ao_seven_segment_set(uint8_t digit, uint8_t value) +{ uint8_t segments; if (value == AO_SEVEN_SEGMENT_CLEAR) @@ -183,10 +193,7 @@ ao_seven_segment_set(uint8_t digit, uint8_t value) if (value & 0x10) segments |= (1 << 7); } - - for (s = 0; s <= 7; s++) - ao_lcd_set(digit, s, !!(segments & (1 << s))); - ao_lcd_flush(); + ao_seven_segment_direct(digit, segments); } void diff --git a/src/drivers/ao_seven_segment.h b/src/drivers/ao_seven_segment.h index 5b29deaf..f997f3b5 100644 --- a/src/drivers/ao_seven_segment.h +++ b/src/drivers/ao_seven_segment.h @@ -23,6 +23,9 @@ #define AO_SEVEN_SEGMENT_CLEAR 0xff void +ao_seven_segment_direct(uint8_t digit, uint8_t segments); + +void ao_seven_segment_set(uint8_t digit, uint8_t value); void diff --git a/src/easymega-v1.0/ao_pins.h b/src/easymega-v1.0/ao_pins.h index d6490ba5..a5e55638 100644 --- a/src/easymega-v1.0/ao_pins.h +++ b/src/easymega-v1.0/ao_pins.h @@ -78,6 +78,7 @@ #define HAS_RADIO 0 #define HAS_TELEMETRY 0 #define HAS_APRS 0 +#define HAS_COMPANION 1 #define HAS_SPI_1 1 #define SPI_1_PA5_PA6_PA7 1 /* Barometer */ diff --git a/src/kernel/ao_telemetry.c b/src/kernel/ao_telemetry.c index 854ac898..16363f75 100644 --- a/src/kernel/ao_telemetry.c +++ b/src/kernel/ao_telemetry.c @@ -75,6 +75,13 @@ static __pdata uint16_t ao_aprs_time; static __xdata union ao_telemetry_all telemetry; +static void +ao_telemetry_send(void) +{ + ao_radio_send(&telemetry, sizeof (telemetry)); + ao_delay(1); +} + #if defined AO_TELEMETRY_SENSOR /* Send sensor packet */ static void @@ -117,7 +124,7 @@ ao_send_sensor(void) telemetry.sensor.accel_minus_g = 0; #endif - ao_radio_send(&telemetry, sizeof (telemetry)); + ao_telemetry_send(); } #endif @@ -156,7 +163,7 @@ ao_send_mega_sensor(void) telemetry.mega_sensor.mag_z = packet->hmc5883.z; #endif - ao_radio_send(&telemetry, sizeof (telemetry)); + ao_telemetry_send(); } static __pdata int8_t ao_telemetry_mega_data_max; @@ -190,8 +197,8 @@ ao_send_mega_data(void) telemetry.mega_data.speed = ao_speed; telemetry.mega_data.height = ao_height; - ao_radio_send(&telemetry, sizeof (telemetry)); ao_telemetry_mega_data_cur = ao_telemetry_mega_data_max; + ao_telemetry_send(); } } #endif /* AO_SEND_MEGA */ @@ -221,7 +228,7 @@ ao_send_metrum_sensor(void) telemetry.metrum_sensor.sense_a = packet->adc.sense_a; telemetry.metrum_sensor.sense_m = packet->adc.sense_m; - ao_radio_send(&telemetry, sizeof (telemetry)); + ao_telemetry_send(); } static __pdata int8_t ao_telemetry_metrum_data_max; @@ -248,8 +255,8 @@ ao_send_metrum_data(void) telemetry.metrum_data.accel_minus_g = 2; #endif - ao_radio_send(&telemetry, sizeof (telemetry)); ao_telemetry_metrum_data_cur = ao_telemetry_metrum_data_max; + ao_telemetry_send(); } } #endif /* AO_SEND_METRUM */ @@ -279,7 +286,7 @@ ao_send_mini(void) telemetry.mini.ground_pres = ao_ground_pres; - ao_radio_send(&telemetry, sizeof (telemetry)); + ao_telemetry_send(); } #endif /* AO_SEND_MINI */ @@ -316,8 +323,8 @@ ao_send_configuration(void) ao_xmemcpy (telemetry.configuration.version, CODE_TO_XDATA(ao_version), AO_MAX_VERSION); - ao_radio_send(&telemetry, sizeof (telemetry)); ao_telemetry_config_cur = ao_telemetry_config_max; + ao_telemetry_send(); } } @@ -339,8 +346,8 @@ ao_send_location(void) 27); telemetry.location.tick = ao_gps_tick; ao_mutex_put(&ao_gps_mutex); - ao_radio_send(&telemetry, sizeof (telemetry)); ao_telemetry_loc_cur = ao_telemetry_gps_max; + ao_telemetry_send(); } } @@ -356,8 +363,8 @@ ao_send_satellite(void) &ao_gps_tracking_data.sats, AO_MAX_GPS_TRACKING * sizeof (struct ao_telemetry_satellite_info)); ao_mutex_put(&ao_gps_mutex); - ao_radio_send(&telemetry, sizeof (telemetry)); ao_telemetry_sat_cur = ao_telemetry_gps_max; + ao_telemetry_send(); } } #endif @@ -380,8 +387,8 @@ ao_send_companion(void) ao_companion_data, ao_companion_setup.channels * 2); ao_mutex_put(&ao_companion_mutex); - ao_radio_send(&telemetry, sizeof (telemetry)); ao_telemetry_companion_cur = ao_telemetry_companion_max; + ao_telemetry_send(); } } #endif diff --git a/src/stm/ao_pwm_stm.c b/src/stm/ao_pwm_stm.c new file mode 100644 index 00000000..ce1fa6f3 --- /dev/null +++ b/src/stm/ao_pwm_stm.c @@ -0,0 +1,192 @@ +/* + * Copyright © 2015 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include "ao.h" +#include "ao_pwm.h" + +static uint8_t pwm_running; + +static uint16_t pwm_value[NUM_PWM]; + +static void +ao_pwm_up(void) +{ + if (pwm_running++ == 0) { + struct stm_tim234 *tim = &AO_PWM_TIMER; + + tim->ccr1 = 0; + tim->ccr2 = 0; + tim->ccr3 = 0; + tim->ccr4 = 0; + tim->arr = PWM_MAX - 1; /* turn on the timer */ + tim->cr1 = ((STM_TIM234_CR1_CKD_1 << STM_TIM234_CR1_CKD) | + (0 << STM_TIM234_CR1_ARPE) | + (STM_TIM234_CR1_CMS_EDGE << STM_TIM234_CR1_CMS) | + (STM_TIM234_CR1_DIR_UP << STM_TIM234_CR1_DIR) | + (0 << STM_TIM234_CR1_OPM) | + (0 << STM_TIM234_CR1_URS) | + (0 << STM_TIM234_CR1_UDIS) | + (1 << STM_TIM234_CR1_CEN)); + + /* Set the timer running */ + tim->egr = (1 << STM_TIM234_EGR_UG); + } +} + +static void +ao_pwm_down(void) +{ + if (--pwm_running == 0) { + struct stm_tim234 *tim = &AO_PWM_TIMER; + + tim->arr = 0; + tim->cr1 = ((STM_TIM234_CR1_CKD_1 << STM_TIM234_CR1_CKD) | + (0 << STM_TIM234_CR1_ARPE) | + (STM_TIM234_CR1_CMS_EDGE << STM_TIM234_CR1_CMS) | + (STM_TIM234_CR1_DIR_UP << STM_TIM234_CR1_DIR) | + (0 << STM_TIM234_CR1_OPM) | + (0 << STM_TIM234_CR1_URS) | + (0 << STM_TIM234_CR1_UDIS) | + (0 << STM_TIM234_CR1_CEN)); + + /* Stop the timer */ + tim->egr = (1 << STM_TIM234_EGR_UG); + } +} + +void +ao_pwm_set(uint8_t pwm, uint16_t value) +{ + struct stm_tim234 *tim = &AO_PWM_TIMER; + + if (value > PWM_MAX) + value = PWM_MAX; + if (value != 0) { + if (pwm_value[pwm] == 0) + ao_pwm_up(); + } + switch (pwm) { + case 0: + tim->ccr1 = value; + break; + case 1: + tim->ccr2 = value; + break; + case 2: + tim->ccr3 = value; + break; + case 3: + tim->ccr4 = value; + break; + } + if (value == 0) { + if (pwm_value[pwm] != 0) + ao_pwm_down(); + } + pwm_value[pwm] = value; +} + +static void +ao_pwm_cmd(void) +{ + uint8_t ch; + uint16_t val; + + ao_cmd_decimal(); + ch = ao_cmd_lex_u32; + ao_cmd_decimal(); + val = ao_cmd_lex_u32; + if (ao_cmd_status != ao_cmd_success) + return; + + printf("Set channel %d to %d\n", ch, val); + ao_pwm_set(ch, val); +} + +static const struct ao_cmds ao_pwm_cmds[] = { + { ao_pwm_cmd, "P <ch> <val>\0Set PWM ch to val" }, + { 0, NULL }, +}; + +void +ao_pwm_init(void) +{ + struct stm_tim234 *tim = &AO_PWM_TIMER; + + stm_rcc.apb1enr |= (1 << AO_PWM_TIMER_ENABLE); + + tim->cr1 = 0; + tim->psc = AO_PWM_TIMER_SCALE - 1; + tim->cnt = 0; + tim->ccer = ((1 << STM_TIM234_CCER_CC1E) | + (0 << STM_TIM234_CCER_CC1P) | + (1 << STM_TIM234_CCER_CC2E) | + (0 << STM_TIM234_CCER_CC2P) | + (1 << STM_TIM234_CCER_CC3E) | + (0 << STM_TIM234_CCER_CC3P) | + (1 << STM_TIM234_CCER_CC4E) | + (0 << STM_TIM234_CCER_CC4P)); + + tim->ccmr1 = ((0 << STM_TIM234_CCMR1_OC2CE) | + (STM_TIM234_CCMR1_OC2M_PWM_MODE_1 << STM_TIM234_CCMR1_OC2M) | + (0 << STM_TIM234_CCMR1_OC2PE) | + (0 << STM_TIM234_CCMR1_OC2FE) | + (STM_TIM234_CCMR1_CC2S_OUTPUT << STM_TIM234_CCMR1_CC2S) | + + (0 << STM_TIM234_CCMR1_OC1CE) | + (STM_TIM234_CCMR1_OC1M_PWM_MODE_1 << STM_TIM234_CCMR1_OC1M) | + (0 << STM_TIM234_CCMR1_OC1PE) | + (0 << STM_TIM234_CCMR1_OC1FE) | + (STM_TIM234_CCMR1_CC1S_OUTPUT << STM_TIM234_CCMR1_CC1S)); + + + tim->ccmr2 = ((0 << STM_TIM234_CCMR2_OC4CE) | + (STM_TIM234_CCMR2_OC4M_PWM_MODE_1 << STM_TIM234_CCMR2_OC4M) | + (0 << STM_TIM234_CCMR2_OC4PE) | + (0 << STM_TIM234_CCMR2_OC4FE) | + (STM_TIM234_CCMR2_CC4S_OUTPUT << STM_TIM234_CCMR2_CC4S) | + + (0 << STM_TIM234_CCMR2_OC3CE) | + (STM_TIM234_CCMR2_OC3M_PWM_MODE_1 << STM_TIM234_CCMR2_OC3M) | + (0 << STM_TIM234_CCMR2_OC3PE) | + (0 << STM_TIM234_CCMR2_OC3FE) | + (STM_TIM234_CCMR2_CC3S_OUTPUT << STM_TIM234_CCMR2_CC3S)); + tim->egr = 0; + + tim->sr = 0; + tim->dier = 0; + tim->smcr = 0; + tim->cr2 = ((0 << STM_TIM234_CR2_TI1S) | + (STM_TIM234_CR2_MMS_RESET<< STM_TIM234_CR2_MMS) | + (0 << STM_TIM234_CR2_CCDS)); + + stm_afr_set(AO_PWM_0_GPIO, AO_PWM_0_PIN, STM_AFR_AF2); + stm_ospeedr_set(AO_PWM_0_GPIO, AO_PWM_0_PIN, STM_OSPEEDR_40MHz); +#if NUM_PWM > 1 + stm_afr_set(AO_PWM_1_GPIO, AO_PWM_1_PIN, STM_AFR_AF2); + stm_ospeedr_set(AO_PWM_1_GPIO, AO_PWM_1_PIN, STM_OSPEEDR_40MHz); +#endif +#if NUM_PWM > 2 + stm_afr_set(AO_PWM_2_GPIO, AO_PWM_2_PIN, STM_AFR_AF2); + stm_ospeedr_set(AO_PWM_2_GPIO, AO_PWM_2_PIN, STM_OSPEEDR_40MHz); +#endif +#if NUM_PWM > 3 + stm_afr_set(AO_PWM_3_GPIO, AO_PWM_3_PIN, STM_AFR_AF2); + stm_ospeedr_set(AO_PWM_3_GPIO, AO_PWM_3_PIN, STM_OSPEEDR_40MHz); +#endif + ao_cmd_register(&ao_pwm_cmds[0]); +} diff --git a/src/stm/stm32l.h b/src/stm/stm32l.h index 799cccbd..01afedc6 100644 --- a/src/stm/stm32l.h +++ b/src/stm/stm32l.h @@ -1775,7 +1775,7 @@ extern struct stm_tim234 stm_tim2, stm_tim3, stm_tim4; #define STM_TIM234_CCMR1_OC1M_PWM_MODE_1 6 #define STM_TIM234_CCMR1_OC1M_PWM_MODE_2 7 #define STM_TIM234_CCMR1_OC1M_MASK 7 -#define STM_TIM234_CCMR1_OC1PE 11 +#define STM_TIM234_CCMR1_OC1PE 3 #define STM_TIM234_CCMR1_OC1FE 2 #define STM_TIM234_CCMR1_CC1S 0 #define STM_TIM234_CCMR1_CC1S_OUTPUT 0 @@ -1815,7 +1815,7 @@ extern struct stm_tim234 stm_tim2, stm_tim3, stm_tim4; #define STM_TIM234_CCMR2_OC3M_PWM_MODE_1 6 #define STM_TIM234_CCMR2_OC3M_PWM_MODE_2 7 #define STM_TIM234_CCMR2_OC3M_MASK 7 -#define STM_TIM234_CCMR2_OC3PE 11 +#define STM_TIM234_CCMR2_OC3PE 3 #define STM_TIM234_CCMR2_OC3FE 2 #define STM_TIM234_CCMR2_CC3S 0 #define STM_TIM234_CCMR2_CC3S_OUTPUT 0 diff --git a/src/teleballoon-v2.0/ao_pins.h b/src/teleballoon-v2.0/ao_pins.h index a369070f..b62b5580 100644 --- a/src/teleballoon-v2.0/ao_pins.h +++ b/src/teleballoon-v2.0/ao_pins.h @@ -75,6 +75,7 @@ #define HAS_RADIO 1 #define HAS_TELEMETRY 1 #define HAS_APRS 1 +#define HAS_COMPANION 1 #define HAS_SPI_1 1 #define SPI_1_PA5_PA6_PA7 1 /* Barometer */ diff --git a/src/telemega-v0.1/ao_pins.h b/src/telemega-v0.1/ao_pins.h index 2616e906..7ccc6085 100644 --- a/src/telemega-v0.1/ao_pins.h +++ b/src/telemega-v0.1/ao_pins.h @@ -79,6 +79,7 @@ #define HAS_RADIO 1 #define HAS_TELEMETRY 1 #define HAS_APRS 1 +#define HAS_COMPANION 1 #define HAS_SPI_1 1 #define SPI_1_PA5_PA6_PA7 1 /* Barometer */ diff --git a/src/telemega-v1.0/ao_pins.h b/src/telemega-v1.0/ao_pins.h index 77b753d1..664546c2 100644 --- a/src/telemega-v1.0/ao_pins.h +++ b/src/telemega-v1.0/ao_pins.h @@ -79,6 +79,7 @@ #define HAS_RADIO 1 #define HAS_TELEMETRY 1 #define HAS_APRS 1 +#define HAS_COMPANION 1 #define HAS_SPI_1 1 #define SPI_1_PA5_PA6_PA7 1 /* Barometer */ diff --git a/src/telemega-v2.0/.gitignore b/src/telemega-v2.0/.gitignore new file mode 100644 index 00000000..e67759a2 --- /dev/null +++ b/src/telemega-v2.0/.gitignore @@ -0,0 +1,2 @@ +ao_product.h +telemega-*.elf diff --git a/src/telemega-v2.0/Makefile b/src/telemega-v2.0/Makefile new file mode 100644 index 00000000..6a1c05b0 --- /dev/null +++ b/src/telemega-v2.0/Makefile @@ -0,0 +1,156 @@ +# +# AltOS build +# +# + +include ../stm/Makefile.defs + +INC = \ + ao.h \ + ao_arch.h \ + ao_arch_funcs.h \ + ao_boot.h \ + ao_companion.h \ + ao_data.h \ + ao_sample.h \ + ao_pins.h \ + altitude-pa.h \ + ao_kalman.h \ + ao_product.h \ + ao_ms5607.h \ + ao_hmc5883.h \ + ao_mpu6000.h \ + ao_mma655x.h \ + ao_cc1200_CC1200.h \ + ao_profile.h \ + ao_task.h \ + ao_whiten.h \ + ao_sample_profile.h \ + ao_quaternion.h \ + math.h \ + ao_mpu.h \ + stm32l.h \ + math.h \ + ao_ms5607_convert.c \ + Makefile + +# +# Common AltOS sources +# +# ao_hmc5883.c + +#PROFILE=ao_profile.c +#PROFILE_DEF=-DAO_PROFILE=1 + +#SAMPLE_PROFILE=ao_sample_profile.c \ +# ao_sample_profile_timer.c +#SAMPLE_PROFILE_DEF=-DHAS_SAMPLE_PROFILE=1 + +#STACK_GUARD=ao_mpu_stm.c +#STACK_GUARD_DEF=-DHAS_STACK_GUARD=1 + +MATH_SRC=\ + ef_acos.c \ + ef_sqrt.c \ + ef_rem_pio2.c \ + kf_cos.c \ + kf_sin.c \ + kf_rem_pio2.c \ + sf_copysign.c \ + sf_cos.c \ + sf_fabs.c \ + sf_floor.c \ + sf_scalbn.c \ + sf_sin.c \ + ef_log.c + +ALTOS_SRC = \ + ao_boot_chain.c \ + ao_interrupt.c \ + ao_product.c \ + ao_romconfig.c \ + ao_cmd.c \ + ao_config.c \ + ao_task.c \ + ao_led.c \ + ao_stdio.c \ + ao_panic.c \ + ao_timer.c \ + ao_mutex.c \ + ao_serial_stm.c \ + ao_gps_ublox.c \ + ao_gps_show.c \ + ao_gps_report_mega.c \ + ao_ignite.c \ + ao_freq.c \ + ao_dma_stm.c \ + ao_spi_stm.c \ + ao_cc1200.c \ + ao_data.c \ + ao_ms5607.c \ + ao_mma655x.c \ + ao_hmc5883.c \ + ao_adc_stm.c \ + ao_beep_stm.c \ + ao_eeprom_stm.c \ + ao_storage.c \ + ao_m25.c \ + ao_usb_stm.c \ + ao_exti_stm.c \ + ao_report.c \ + ao_i2c_stm.c \ + ao_mpu6000.c \ + ao_convert_pa.c \ + ao_convert_volt.c \ + ao_log.c \ + ao_log_mega.c \ + ao_sample.c \ + ao_kalman.c \ + ao_flight.c \ + ao_telemetry.c \ + ao_packet_slave.c \ + ao_packet.c \ + ao_companion.c \ + ao_pyro.c \ + ao_aprs.c \ + ao_pwm_stm.c \ + $(MATH_SRC) \ + $(PROFILE) \ + $(SAMPLE_PROFILE) \ + $(STACK_GUARD) + +PRODUCT=TeleMega-v2.0 +PRODUCT_DEF=-DTELEMEGA +IDPRODUCT=0x0023 + +CFLAGS = $(PRODUCT_DEF) $(STM_CFLAGS) $(PROFILE_DEF) $(SAMPLE_PROFILE_DEF) $(STACK_GUARD_DEF) -Os -g + +PROGNAME=telemega-v2.0 +PROG=$(PROGNAME)-$(VERSION).elf +HEX=$(PROGNAME)-$(VERSION).ihx + +SRC=$(ALTOS_SRC) ao_telemega.c +OBJ=$(SRC:.c=.o) + +all: $(PROG) $(HEX) + +$(PROG): Makefile $(OBJ) altos.ld + $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ) $(LIBS) + +../altitude-pa.h: make-altitude-pa + nickle $< > $@ + +$(OBJ): $(INC) + +ao_product.h: ao-make-product.5c ../Version + $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@ + +distclean: clean + +clean: + rm -f *.o $(PROGNAME)-*.elf $(PROGNAME)-*.ihx + rm -f ao_product.h + +install: + +uninstall: diff --git a/src/telemega-v2.0/ao_pins.h b/src/telemega-v2.0/ao_pins.h new file mode 100644 index 00000000..9095a350 --- /dev/null +++ b/src/telemega-v2.0/ao_pins.h @@ -0,0 +1,407 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#ifndef _AO_PINS_H_ +#define _AO_PINS_H_ + +#define HAS_TASK_QUEUE 1 + +/* 8MHz High speed external crystal */ +#define AO_HSE 8000000 + +/* PLLVCO = 96MHz (so that USB will work) */ +#define AO_PLLMUL 12 +#define AO_RCC_CFGR_PLLMUL (STM_RCC_CFGR_PLLMUL_12) + +/* SYSCLK = 32MHz (no need to go faster than CPU) */ +#define AO_PLLDIV 3 +#define AO_RCC_CFGR_PLLDIV (STM_RCC_CFGR_PLLDIV_3) + +/* HCLK = 32MHz (CPU clock) */ +#define AO_AHB_PRESCALER 1 +#define AO_RCC_CFGR_HPRE_DIV STM_RCC_CFGR_HPRE_DIV_1 + +/* Run APB1 at 16MHz (HCLK/2) */ +#define AO_APB1_PRESCALER 2 +#define AO_RCC_CFGR_PPRE1_DIV STM_RCC_CFGR_PPRE2_DIV_2 + +/* Run APB2 at 16MHz (HCLK/2) */ +#define AO_APB2_PRESCALER 2 +#define AO_RCC_CFGR_PPRE2_DIV STM_RCC_CFGR_PPRE2_DIV_2 + +#define HAS_SERIAL_1 0 +#define USE_SERIAL_1_STDIN 0 +#define SERIAL_1_PB6_PB7 0 +#define SERIAL_1_PA9_PA10 1 + +#define HAS_SERIAL_2 0 +#define USE_SERIAL_2_STDIN 0 +#define SERIAL_2_PA2_PA3 0 +#define SERIAL_2_PD5_PD6 0 + +#define HAS_SERIAL_3 1 +#define USE_SERIAL_3_STDIN 0 +#define SERIAL_3_PB10_PB11 0 +#define SERIAL_3_PC10_PC11 1 +#define SERIAL_3_PD8_PD9 0 + +#define ao_gps_getchar ao_serial3_getchar +#define ao_gps_putchar ao_serial3_putchar +#define ao_gps_set_speed ao_serial3_set_speed +#define ao_gps_fifo (ao_stm_usart3.rx_fifo) + +#define AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX (1024 * 1024) +#define AO_CONFIG_MAX_SIZE 1024 +#define LOG_ERASE_MARK 0x55 +#define LOG_MAX_ERASE 128 + +#define HAS_EEPROM 1 +#define USE_INTERNAL_FLASH 0 +#define USE_EEPROM_CONFIG 1 +#define USE_STORAGE_CONFIG 0 +#define HAS_USB 1 +#define HAS_BEEP 1 +#define HAS_BATTERY_REPORT 1 +#define HAS_RADIO 1 +#define HAS_TELEMETRY 1 +#define HAS_APRS 1 +#define HAS_COMPANION 1 + +#define HAS_SPI_1 1 +#define SPI_1_PA5_PA6_PA7 1 /* Barometer */ +#define SPI_1_PB3_PB4_PB5 0 +#define SPI_1_PE13_PE14_PE15 1 /* Accelerometer, Gyro */ +#define SPI_1_OSPEEDR STM_OSPEEDR_10MHz + +#define HAS_SPI_2 1 +#define SPI_2_PB13_PB14_PB15 1 /* Flash, Companion */ +#define SPI_2_PD1_PD3_PD4 0 +#define SPI_2_OSPEEDR STM_OSPEEDR_10MHz + +#define SPI_2_PORT (&stm_gpiob) +#define SPI_2_SCK_PIN 13 +#define SPI_2_MISO_PIN 14 +#define SPI_2_MOSI_PIN 15 + +#define HAS_I2C_1 1 +#define I2C_1_PB8_PB9 1 + +#define HAS_I2C_2 0 +#define I2C_2_PB10_PB11 0 + +#define PACKET_HAS_SLAVE 1 +#define PACKET_HAS_MASTER 0 + +#define LOW_LEVEL_DEBUG 0 + +#define LED_PORT_ENABLE STM_RCC_AHBENR_GPIOCEN +#define LED_PORT (&stm_gpioc) +#define LED_PIN_RED 8 +#define LED_PIN_GREEN 9 +#define AO_LED_RED (1 << LED_PIN_RED) +#define AO_LED_GREEN (1 << LED_PIN_GREEN) + +#define LEDS_AVAILABLE (AO_LED_RED | AO_LED_GREEN) + +#define HAS_GPS 1 +#define HAS_FLIGHT 1 +#define HAS_ADC 1 +#define HAS_ADC_TEMP 1 +#define HAS_LOG 1 + +/* + * Igniter + */ + +#define HAS_IGNITE 1 +#define HAS_IGNITE_REPORT 1 + +#define AO_SENSE_PYRO(p,n) ((p)->adc.sense[n]) +#define AO_SENSE_DROGUE(p) ((p)->adc.sense[4]) +#define AO_SENSE_MAIN(p) ((p)->adc.sense[5]) +#define AO_IGNITER_CLOSED 400 +#define AO_IGNITER_OPEN 60 + +/* Pyro A */ +#define AO_PYRO_PORT_0 (&stm_gpiod) +#define AO_PYRO_PIN_0 6 + +/* Pyro B */ +#define AO_PYRO_PORT_1 (&stm_gpiod) +#define AO_PYRO_PIN_1 7 + +/* Pyro C */ +#define AO_PYRO_PORT_2 (&stm_gpiob) +#define AO_PYRO_PIN_2 5 + +/* Pyro D */ +#define AO_PYRO_PORT_3 (&stm_gpioe) +#define AO_PYRO_PIN_3 4 + +/* Drogue */ +#define AO_IGNITER_DROGUE_PORT (&stm_gpioe) +#define AO_IGNITER_DROGUE_PIN 6 + +/* Main */ +#define AO_IGNITER_MAIN_PORT (&stm_gpioe) +#define AO_IGNITER_MAIN_PIN 5 + +/* Number of general purpose pyro channels available */ +#define AO_PYRO_NUM 4 + +#define AO_IGNITER_SET_DROGUE(v) stm_gpio_set(AO_IGNITER_DROGUE_PORT, AO_IGNITER_DROGUE_PIN, v) +#define AO_IGNITER_SET_MAIN(v) stm_gpio_set(AO_IGNITER_MAIN_PORT, AO_IGNITER_MAIN_PIN, v) + +/* + * ADC + */ +#define AO_DATA_RING 32 +#define AO_ADC_NUM_SENSE 6 + +struct ao_adc { + int16_t sense[AO_ADC_NUM_SENSE]; + int16_t v_batt; + int16_t v_pbatt; + int16_t temp; +}; + +#define AO_ADC_DUMP(p) \ + printf("tick: %5u A: %5d B: %5d C: %5d D: %5d drogue: %5d main: %5d batt: %5d pbatt: %5d temp: %5d\n", \ + (p)->tick, \ + (p)->adc.sense[0], (p)->adc.sense[1], (p)->adc.sense[2], \ + (p)->adc.sense[3], (p)->adc.sense[4], (p)->adc.sense[5], \ + (p)->adc.v_batt, (p)->adc.v_pbatt, (p)->adc.temp) + +#define AO_ADC_SENSE_A 0 +#define AO_ADC_SENSE_A_PORT (&stm_gpioa) +#define AO_ADC_SENSE_A_PIN 0 + +#define AO_ADC_SENSE_B 1 +#define AO_ADC_SENSE_B_PORT (&stm_gpioa) +#define AO_ADC_SENSE_B_PIN 1 + +#define AO_ADC_SENSE_C 2 +#define AO_ADC_SENSE_C_PORT (&stm_gpioa) +#define AO_ADC_SENSE_C_PIN 2 + +#define AO_ADC_SENSE_D 3 +#define AO_ADC_SENSE_D_PORT (&stm_gpioa) +#define AO_ADC_SENSE_D_PIN 3 + +#define AO_ADC_SENSE_DROGUE 4 +#define AO_ADC_SENSE_DROGUE_PORT (&stm_gpioa) +#define AO_ADC_SENSE_DROGUE_PIN 4 + +#define AO_ADC_SENSE_MAIN 22 +#define AO_ADC_SENSE_MAIN_PORT (&stm_gpioe) +#define AO_ADC_SENSE_MAIN_PIN 7 + +#define AO_ADC_V_BATT 8 +#define AO_ADC_V_BATT_PORT (&stm_gpiob) +#define AO_ADC_V_BATT_PIN 0 + +#define AO_ADC_V_PBATT 9 +#define AO_ADC_V_PBATT_PORT (&stm_gpiob) +#define AO_ADC_V_PBATT_PIN 1 + +#define AO_ADC_TEMP 16 + +#define AO_ADC_RCC_AHBENR ((1 << STM_RCC_AHBENR_GPIOAEN) | \ + (1 << STM_RCC_AHBENR_GPIOEEN) | \ + (1 << STM_RCC_AHBENR_GPIOBEN)) + +#define AO_NUM_ADC_PIN (AO_ADC_NUM_SENSE + 2) + +#define AO_ADC_PIN0_PORT AO_ADC_SENSE_A_PORT +#define AO_ADC_PIN0_PIN AO_ADC_SENSE_A_PIN +#define AO_ADC_PIN1_PORT AO_ADC_SENSE_B_PORT +#define AO_ADC_PIN1_PIN AO_ADC_SENSE_B_PIN +#define AO_ADC_PIN2_PORT AO_ADC_SENSE_C_PORT +#define AO_ADC_PIN2_PIN AO_ADC_SENSE_C_PIN +#define AO_ADC_PIN3_PORT AO_ADC_SENSE_D_PORT +#define AO_ADC_PIN3_PIN AO_ADC_SENSE_D_PIN +#define AO_ADC_PIN4_PORT AO_ADC_SENSE_DROGUE_PORT +#define AO_ADC_PIN4_PIN AO_ADC_SENSE_DROGUE_PIN +#define AO_ADC_PIN5_PORT AO_ADC_SENSE_MAIN_PORT +#define AO_ADC_PIN5_PIN AO_ADC_SENSE_MAIN_PIN +#define AO_ADC_PIN6_PORT AO_ADC_V_BATT_PORT +#define AO_ADC_PIN6_PIN AO_ADC_V_BATT_PIN +#define AO_ADC_PIN7_PORT AO_ADC_V_PBATT_PORT +#define AO_ADC_PIN7_PIN AO_ADC_V_PBATT_PIN + +#define AO_NUM_ADC (AO_ADC_NUM_SENSE + 3) + +#define AO_ADC_SQ1 AO_ADC_SENSE_A +#define AO_ADC_SQ2 AO_ADC_SENSE_B +#define AO_ADC_SQ3 AO_ADC_SENSE_C +#define AO_ADC_SQ4 AO_ADC_SENSE_D +#define AO_ADC_SQ5 AO_ADC_SENSE_DROGUE +#define AO_ADC_SQ6 AO_ADC_SENSE_MAIN +#define AO_ADC_SQ7 AO_ADC_V_BATT +#define AO_ADC_SQ8 AO_ADC_V_PBATT +#define AO_ADC_SQ9 AO_ADC_TEMP + +/* + * Voltage divider on ADC battery sampler + */ +#define AO_BATTERY_DIV_PLUS 56 /* 5.6k */ +#define AO_BATTERY_DIV_MINUS 100 /* 10k */ + +/* + * Voltage divider on ADC igniter samplers + */ +#define AO_IGNITE_DIV_PLUS 100 /* 100k */ +#define AO_IGNITE_DIV_MINUS 27 /* 27k */ + +/* + * ADC reference in decivolts + */ +#define AO_ADC_REFERENCE_DV 33 + +/* + * Pressure sensor settings + */ +#define HAS_MS5607 1 +#define HAS_MS5611 0 +#define AO_MS5607_PRIVATE_PINS 1 +#define AO_MS5607_CS_PORT (&stm_gpioc) +#define AO_MS5607_CS_PIN 4 +#define AO_MS5607_CS_MASK (1 << AO_MS5607_CS) +#define AO_MS5607_MISO_PORT (&stm_gpioa) +#define AO_MS5607_MISO_PIN 6 +#define AO_MS5607_MISO_MASK (1 << AO_MS5607_MISO) +#define AO_MS5607_SPI_INDEX AO_SPI_1_PA5_PA6_PA7 + +/* + * SPI Flash memory + */ + +#define M25_MAX_CHIPS 1 +#define AO_M25_SPI_CS_PORT (&stm_gpiod) +#define AO_M25_SPI_CS_MASK (1 << 3) +#define AO_M25_SPI_BUS AO_SPI_2_PB13_PB14_PB15 + +/* + * Radio (cc1120) + */ + +/* gets pretty close to 434.550 */ + +#define AO_RADIO_CAL_DEFAULT 5695733 + +#define AO_FEC_DEBUG 0 +#define AO_CC1200_SPI_CS_PORT (&stm_gpioc) +#define AO_CC1200_SPI_CS_PIN 5 +#define AO_CC1200_SPI_BUS AO_SPI_2_PB13_PB14_PB15 +#define AO_CC1200_SPI stm_spi2 + +#define AO_CC1200_INT_PORT (&stm_gpioe) +#define AO_CC1200_INT_PIN 1 +#define AO_CC1200_MCU_WAKEUP_PORT (&stm_gpioc) +#define AO_CC1200_MCU_WAKEUP_PIN (0) + +#define AO_CC1200_INT_GPIO 2 +#define AO_CC1200_INT_GPIO_IOCFG CC1200_IOCFG2 + +#define AO_CC1200_MARC_GPIO 3 +#define AO_CC1200_MARC_GPIO_IOCFG CC1200_IOCFG3 + +#define HAS_BOOT_RADIO 0 + +/* + * Mag sensor (hmc5883) + */ + +#define HAS_HMC5883 1 +#define AO_HMC5883_INT_PORT (&stm_gpioc) +#define AO_HMC5883_INT_PIN 12 +#define AO_HMC5883_I2C_INDEX STM_I2C_INDEX(1) + +/* + * mpu6000 + */ + +#define HAS_MPU6000 1 +#define AO_MPU6000_INT_PORT (&stm_gpioe) +#define AO_MPU6000_INT_PIN 0 +#define AO_MPU6000_SPI_BUS AO_SPI_1_PE13_PE14_PE15 +#define AO_MPU6000_SPI_CS_PORT (&stm_gpiod) +#define AO_MPU6000_SPI_CS_PIN 2 +#define HAS_IMU 1 + +/* + * mma655x + */ + +#define HAS_MMA655X 1 +#define AO_MMA655X_SPI_INDEX AO_SPI_1_PE13_PE14_PE15 +#define AO_MMA655X_CS_PORT (&stm_gpiod) +#define AO_MMA655X_CS_PIN 4 + +#define NUM_CMDS 16 + +/* + * Companion + */ + +#define AO_COMPANION_CS_PORT (&stm_gpiob) +#define AO_COMPANION_CS_PIN_0 (6) +#define AO_COMPANION_CS_PIN AO_COMPANION_CS_PIN_0 +#define AO_COMPANION_CS_PIN_1 (7) +#define AO_COMPANION_SPI_BUS AO_SPI_2_PB13_PB14_PB15 + +/* + * Monitor + */ + +#define HAS_MONITOR 0 +#define LEGACY_MONITOR 0 +#define HAS_MONITOR_PUT 1 +#define AO_MONITOR_LED 0 +#define HAS_RSSI 0 + +/* + * Profiling Viterbi decoding + */ + +#ifndef AO_PROFILE +#define AO_PROFILE 0 +#endif + +/* + * PWM output + */ + +#define NUM_PWM 4 +#define PWM_MAX 20000 +#define AO_PWM_TIMER stm_tim4 +#define AO_PWM_TIMER_ENABLE STM_RCC_APB1ENR_TIM4EN +#define AO_PWM_TIMER_SCALE 32 + +#define AO_PWM_0_GPIO (&stm_gpiod) +#define AO_PWM_0_PIN 12 + +#define AO_PWM_1_GPIO (&stm_gpiod) +#define AO_PWM_1_PIN 13 + +#define AO_PWM_2_GPIO (&stm_gpiod) +#define AO_PWM_2_PIN 14 + +#define AO_PWM_3_GPIO (&stm_gpiod) +#define AO_PWM_3_PIN 15 + +#endif /* _AO_PINS_H_ */ diff --git a/src/telemega-v2.0/ao_telemega.c b/src/telemega-v2.0/ao_telemega.c new file mode 100644 index 00000000..86427107 --- /dev/null +++ b/src/telemega-v2.0/ao_telemega.c @@ -0,0 +1,105 @@ +/* + * Copyright © 2011 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <ao.h> +#include <ao_hmc5883.h> +#include <ao_mpu6000.h> +#include <ao_mma655x.h> +#include <ao_log.h> +#include <ao_exti.h> +#include <ao_packet.h> +#include <ao_companion.h> +#include <ao_profile.h> +#include <ao_eeprom.h> +#if HAS_SAMPLE_PROFILE +#include <ao_sample_profile.h> +#endif +#include <ao_pyro.h> +#if HAS_STACK_GUARD +#include <ao_mpu.h> +#endif +#include <ao_pwm.h> + +int +main(void) +{ + ao_clock_init(); + +#if HAS_STACK_GUARD + ao_mpu_init(); +#endif + + ao_task_init(); + ao_serial_init(); + ao_led_init(LEDS_AVAILABLE); + ao_led_on(AO_LED_GREEN); + ao_timer_init(); + + ao_i2c_init(); + ao_spi_init(); + ao_dma_init(); + ao_exti_init(); + + ao_adc_init(); +#if HAS_BEEP + ao_beep_init(); +#endif + ao_cmd_init(); + +#if HAS_MS5607 + ao_ms5607_init(); +#endif +#if HAS_HMC5883 + ao_hmc5883_init(); +#endif +#if HAS_MPU6000 + ao_mpu6000_init(); +#endif +#if HAS_MMA655X + ao_mma655x_init(); +#endif + + ao_eeprom_init(); + ao_storage_init(); + + ao_flight_init(); + ao_log_init(); + ao_report_init(); + + ao_usb_init(); + ao_gps_init(); + ao_gps_report_mega_init(); + ao_telemetry_init(); + ao_radio_init(); + ao_packet_slave_init(FALSE); + ao_igniter_init(); + ao_companion_init(); + ao_pyro_init(); + + ao_config_init(); +#if AO_PROFILE + ao_profile_init(); +#endif +#if HAS_SAMPLE_PROFILE + ao_sample_profile_init(); +#endif + + ao_pwm_init(); + + ao_start_scheduler(); + return 0; +} diff --git a/src/telemega-v2.0/flash-loader/Makefile b/src/telemega-v2.0/flash-loader/Makefile new file mode 100644 index 00000000..d667c18e --- /dev/null +++ b/src/telemega-v2.0/flash-loader/Makefile @@ -0,0 +1,8 @@ +# +# AltOS flash loader build +# +# + +TOPDIR=../.. +HARDWARE=telemega-v2.0 +include $(TOPDIR)/stm/Makefile-flash.defs diff --git a/src/telemega-v2.0/flash-loader/ao_pins.h b/src/telemega-v2.0/flash-loader/ao_pins.h new file mode 100644 index 00000000..304bb7c3 --- /dev/null +++ b/src/telemega-v2.0/flash-loader/ao_pins.h @@ -0,0 +1,34 @@ +/* + * Copyright © 2013 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#ifndef _AO_PINS_H_ +#define _AO_PINS_H_ + +/* External crystal at 8MHz */ +#define AO_HSE 8000000 + +#include <ao_flash_stm_pins.h> + +/* Companion port cs_companion0 PB6 */ + +#define AO_BOOT_PIN 1 +#define AO_BOOT_APPLICATION_GPIO stm_gpiob +#define AO_BOOT_APPLICATION_PIN 6 +#define AO_BOOT_APPLICATION_VALUE 1 +#define AO_BOOT_APPLICATION_MODE AO_EXTI_MODE_PULL_UP + +#endif /* _AO_PINS_H_ */ diff --git a/src/telemetrum-v2.0/ao_pins.h b/src/telemetrum-v2.0/ao_pins.h index a9a4b243..fbb38df2 100644 --- a/src/telemetrum-v2.0/ao_pins.h +++ b/src/telemetrum-v2.0/ao_pins.h @@ -75,6 +75,7 @@ #define HAS_RADIO 1 #define HAS_TELEMETRY 1 #define HAS_APRS 1 +#define HAS_COMPANION 1 #define HAS_SPI_1 1 #define SPI_1_PA5_PA6_PA7 1 /* Barometer */ diff --git a/telegps/TeleGPS.java b/telegps/TeleGPS.java index 0208e81d..0250a38e 100644 --- a/telegps/TeleGPS.java +++ b/telegps/TeleGPS.java @@ -24,8 +24,8 @@ import java.io.*; import java.util.concurrent.*; import java.util.*; import java.text.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class TeleGPS extends AltosUIFrame diff --git a/telegps/TeleGPSConfig.java b/telegps/TeleGPSConfig.java index e2cf1258..165981f9 100644 --- a/telegps/TeleGPSConfig.java +++ b/telegps/TeleGPSConfig.java @@ -22,8 +22,8 @@ import javax.swing.*; import java.io.*; import java.util.concurrent.*; import java.text.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class TeleGPSConfig implements ActionListener { diff --git a/telegps/TeleGPSConfigUI.java b/telegps/TeleGPSConfigUI.java index 8d4916aa..5a3a05eb 100644 --- a/telegps/TeleGPSConfigUI.java +++ b/telegps/TeleGPSConfigUI.java @@ -22,8 +22,8 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class TeleGPSConfigUI extends AltosUIDialog diff --git a/telegps/TeleGPSDisplayThread.java b/telegps/TeleGPSDisplayThread.java index fa394b17..4d8fdcc9 100644 --- a/telegps/TeleGPSDisplayThread.java +++ b/telegps/TeleGPSDisplayThread.java @@ -21,8 +21,8 @@ import java.awt.*; import javax.swing.*; import java.io.*; import java.text.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class TeleGPSDisplayThread extends Thread { @@ -129,7 +129,7 @@ public class TeleGPSDisplayThread extends Thread { } public synchronized void notice(boolean spoken) { - if (old_state != null && old_state.state != state.state) { + if (old_state != null && old_state.state() != state.state()) { report_time = now(); this.notify(); } else if (spoken) diff --git a/telegps/TeleGPSGraphUI.java b/telegps/TeleGPSGraphUI.java index 8fe479cc..e3902d2f 100644 --- a/telegps/TeleGPSGraphUI.java +++ b/telegps/TeleGPSGraphUI.java @@ -26,8 +26,8 @@ import javax.swing.*; import java.io.*; import java.util.concurrent.*; import java.util.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; diff --git a/telegps/TeleGPSInfo.java b/telegps/TeleGPSInfo.java index 6baccce9..ae197abe 100644 --- a/telegps/TeleGPSInfo.java +++ b/telegps/TeleGPSInfo.java @@ -21,8 +21,8 @@ import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class TeleGPSInfo extends AltosUIFlightTab { diff --git a/telegps/TeleGPSPreferences.java b/telegps/TeleGPSPreferences.java index d0b843e1..eab9350a 100644 --- a/telegps/TeleGPSPreferences.java +++ b/telegps/TeleGPSPreferences.java @@ -22,7 +22,7 @@ import java.awt.event.*; import java.beans.*; import javax.swing.*; import javax.swing.event.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altosuilib_9.*; public class TeleGPSPreferences extends AltosUIConfigure diff --git a/telegps/TeleGPSState.java b/telegps/TeleGPSState.java index dac7da52..516eb797 100644 --- a/telegps/TeleGPSState.java +++ b/telegps/TeleGPSState.java @@ -21,8 +21,8 @@ import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class TeleGPSState extends AltosUIFlightTab { diff --git a/telegps/TeleGPSStatus.java b/telegps/TeleGPSStatus.java index 896df9d4..3a6b2515 100644 --- a/telegps/TeleGPSStatus.java +++ b/telegps/TeleGPSStatus.java @@ -19,8 +19,8 @@ package org.altusmetrum.telegps; import java.awt.*; import javax.swing.*; -import org.altusmetrum.altoslib_8.*; -import org.altusmetrum.altosuilib_8.*; +import org.altusmetrum.altoslib_9.*; +import org.altusmetrum.altosuilib_9.*; public class TeleGPSStatus extends JComponent implements AltosFlightDisplay { GridBagLayout layout; diff --git a/telegps/TeleGPSStatusUpdate.java b/telegps/TeleGPSStatusUpdate.java index eef0a034..655f42f5 100644 --- a/telegps/TeleGPSStatusUpdate.java +++ b/telegps/TeleGPSStatusUpdate.java @@ -18,7 +18,7 @@ package org.altusmetrum.telegps; import java.awt.event.*; -import org.altusmetrum.altoslib_8.*; +import org.altusmetrum.altoslib_9.*; public class TeleGPSStatusUpdate implements ActionListener { |