From 73dd2e2c73c42f6ce949b4aa7992f63610962c37 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 20 Aug 2015 10:50:30 -0700 Subject: altoslib: Add companion telemetry data support This got lost in the great telemetry rewrite Signed-off-by: Keith Packard --- altoslib/AltosState.java | 5 ---- altoslib/AltosTelemetryCompanion.java | 54 +++++++++++++++++++++++++++++++++++ altoslib/AltosTelemetryStandard.java | 2 -- altoslib/Makefile.am | 1 + 4 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 altoslib/AltosTelemetryCompanion.java diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index 4edae54a..cf4fb9b0 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -1358,11 +1358,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/AltosTelemetryCompanion.java b/altoslib/AltosTelemetryCompanion.java new file mode 100644 index 00000000..96125aca --- /dev/null +++ b/altoslib/AltosTelemetryCompanion.java @@ -0,0 +1,54 @@ +/* + * Copyright © 2015 Keith Packard + * + * 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_8; + +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/AltosTelemetryStandard.java b/altoslib/AltosTelemetryStandard.java index 27561826..c2a5ab3c 100644 --- a/altoslib/AltosTelemetryStandard.java +++ b/altoslib/AltosTelemetryStandard.java @@ -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/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 \ -- cgit v1.2.3 From b4064bf63bb95c58d74869f4ff3e440370d64692 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 20 Aug 2015 10:51:11 -0700 Subject: ao-telem: Add companion packet telemetry data printing Signed-off-by: Keith Packard --- ao-tools/ao-telem/ao-telem.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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, -- cgit v1.2.3 From f491eec1b950e4ad35a535db254a27a3dd2ad430 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 20 Aug 2015 23:02:04 -0700 Subject: altos: Add HAS_COMPANION to new boards with companion connectors Thanks much to Rob Derstadt for discovering this bug! TeleMetrum v2.0, TeleMega, EasyMega, TeleBalloon v2.0 all have companion connectors and yet HAS_COMPANION was not defined. This disabled companion telemetry packets on these products, but otherwise didn't have any effect. Signed-off-by: Keith Packard --- src/drivers/ao_companion.c | 4 ++++ src/easymega-v1.0/ao_pins.h | 1 + src/teleballoon-v2.0/ao_pins.h | 1 + src/telemega-v0.1/ao_pins.h | 1 + src/telemega-v1.0/ao_pins.h | 1 + src/telemetrum-v2.0/ao_pins.h | 1 + 6 files changed, 9 insertions(+) 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/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/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/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 */ -- cgit v1.2.3 From 368f87918547f89e7eb2a92990621e75e07a3b25 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 29 Aug 2015 13:18:46 -0700 Subject: altos/telefire: No reply for ARMED. Ignore time for FIRE. This will let us do drag races by letting the LCO arm multiple boxes and fire them all with a single command. Signed-off-by: Keith Packard --- src/drivers/ao_pad.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) 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(); -- cgit v1.2.3 From 2839796ca5ace5f0c79643afc1a868893246b621 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 29 Aug 2015 13:20:16 -0700 Subject: altos: Provide direct segment driving interface for LCD displays This exposes a simple bit-mask for setting the seven segments instead of just allowing hex-decimal values. Signed-off-by: Keith Packard --- src/drivers/ao_seven_segment.c | 17 ++++++++++++----- src/drivers/ao_seven_segment.h | 3 +++ 2 files changed, 15 insertions(+), 5 deletions(-) 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 @@ -22,6 +22,9 @@ #define AO_SEVEN_SEGMENT_CLEAR 0xff +void +ao_seven_segment_direct(uint8_t digit, uint8_t segments); + void ao_seven_segment_set(uint8_t digit, uint8_t value); -- cgit v1.2.3 From 55c1be449ef7ce389a3d94686051d272c858bee4 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 29 Aug 2015 13:21:19 -0700 Subject: altos/telelco: Infrastructure changes for drag racing This makes the lco management code support arming multiple pads and firing all of them at once. The UI code does not expose this yet. Signed-off-by: Keith Packard --- src/drivers/ao_lco.c | 119 ++++++++++++++++++++++++---------------------- src/drivers/ao_lco_cmd.c | 2 +- src/drivers/ao_lco_func.c | 11 ++--- src/drivers/ao_lco_func.h | 2 +- 4 files changed, 68 insertions(+), 66 deletions(-) diff --git a/src/drivers/ao_lco.c b/src/drivers/ao_lco.c index b8698a80..464e05ab 100644 --- a/src/drivers/ao_lco.c +++ b/src/drivers/ao_lco.c @@ -37,14 +37,15 @@ static uint8_t ao_lco_debug; #define AO_LCO_BOX_DIGIT_10 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_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 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]; +static uint8_t ao_lco_pad; +static uint8_t ao_lco_box; static struct ao_pad_query ao_pad_query; static void @@ -99,25 +100,25 @@ ao_lco_box_present(uint8_t box) } 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; } @@ -148,7 +149,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(); @@ -171,7 +172,7 @@ ao_lco_input(void) if (ao_lco_box != new_box) { ao_lco_box = new_box; ao_lco_pad = 1; - ao_lco_got_channels = 0; + ao_lco_channels[ao_lco_box] = 0; ao_lco_set_display(); } } @@ -183,7 +184,11 @@ ao_lco_input(void) case AO_BUTTON_ARM: ao_lco_armed = event.value; PRINTD("Armed %d\n", ao_lco_armed); - ao_wakeup(&ao_lco_armed); + if (ao_lco_pad != 0) { + memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); + ao_lco_selected[ao_lco_box] = (1 << (ao_lco_pad - 1)); + ao_wakeup(&ao_lco_armed); + } break; case AO_BUTTON_FIRE: if (ao_lco_armed) { @@ -225,37 +230,36 @@ 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) { + ao_lco_channels[box] = query->channels; + ao_lco_valid[box] = 1; + } else + ao_lco_valid[box] = 0; + PRINTD("ao_lco_get_channels(%d) valid %d\n", box, ao_lco_valid[box]); + ao_wakeup(&ao_pad_query); + return ao_lco_valid[box]; +} + +static void +ao_lco_update(void) +{ + uint8_t previous_valid = ao_lco_valid[ao_lco_box]; + + if (ao_lco_get_channels(ao_lco_box, &ao_pad_query)) { + if (!previous_valid) { if (ao_lco_pad != 0) - ao_lco_pad = ao_lco_pad_first(); + ao_lco_pad = ao_lco_pad_first(ao_lco_box); ao_lco_set_display(); } if (ao_lco_pad == 0) ao_lco_set_display(); - } 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_wakeup(&ao_pad_query); + } } static void @@ -309,8 +313,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(); } @@ -322,8 +326,8 @@ ao_lco_igniter_status(void) for (;;) { ao_sleep(&ao_pad_query); - PRINTD("RSSI %d VALID %d\n", ao_radio_cmac_rssi, ao_lco_valid); - if (!ao_lco_valid) { + PRINTD("RSSI %d VALID %d\n", ao_radio_cmac_rssi, ao_lco_valid[ao_lco_box]); + if (!ao_lco_valid[ao_lco_box]) { ao_led_on(AO_LED_RED); ao_led_off(AO_LED_GREEN|AO_LED_AMBER); continue; @@ -374,33 +378,32 @@ static void ao_lco_monitor(void) { uint16_t delay; + uint8_t box; + struct ao_pad_query pad_query; 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"); 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 { + if (ao_lco_armed) { + for (box = 0; box < AO_PAD_MAX_BOXES; 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_get_channels(box, &pad_query); + if (ao_lco_valid[box]) + ao_lco_arm(box, ao_lco_selected[box], ao_lco_tick_offset[ao_lco_box]); + } + } + } ao_lco_update(); } if (ao_lco_armed && ao_lco_firing) 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_ */ -- cgit v1.2.3 From dda3f459eaff8d4e41cb44584c8ef77b8e2b3b1c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 29 Aug 2015 17:29:00 -0700 Subject: altos/telelco: Add drag race UI With the unit disarmed, press and hold the fire button for five seconds to enable drag race mode. The display will show 'dr' for five seconds and beep five times to indicate that drag race mode is enabled. The decimal points in the display will all be displayed as an additional visual aid. Once every five seconds, it will beep. With drag race mode enabled, you can select a box/pad pair and press the 'fire' button to add it to the drag race group. For the current box, all members of the drag race group will have their continuity LEDs blink slowly. There will be no indication of continuity in this mode; you'll want to check that before enabling drag race mode. If you want to de-select a member of the group, just press the fire button again. Each time you push the fire button, it will beep out the pad number added or removed. Arm the box and you will not be able to add or remove members from the drag race group. Firing will simultaneously fire all members of the drag race group. To disable drag race mode, press and hold the fire button for two seconds. It will beep twice and turn off the decimal points in the display. Signed-off-by: Keith Packard --- src/drivers/ao_lco.c | 310 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 287 insertions(+), 23 deletions(-) diff --git a/src/drivers/ao_lco.c b/src/drivers/ao_lco.c index 464e05ab..8180c49d 100644 --- a/src/drivers/ao_lco.c +++ b/src/drivers/ao_lco.c @@ -36,29 +36,42 @@ 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) + static uint8_t ao_lco_min_box, ao_lco_max_box; static uint8_t ao_lco_selected[AO_PAD_MAX_BOXES]; -static uint8_t ao_lco_armed; -static uint8_t ao_lco_firing; 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 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 uint8_t ao_lco_box; 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); } static void ao_lco_set_box(uint8_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); + 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 @@ -69,9 +82,11 @@ 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 @@ -85,6 +100,33 @@ ao_lco_set_display(void) } } +#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_display_drag(void) +{ + ao_mutex_get(&ao_lco_display_mutex); + ao_seven_segment_direct(AO_LCO_BOX_DIGIT_10, SEVEN_SEGMENT_d | 0x80); + ao_seven_segment_direct(AO_LCO_BOX_DIGIT_1, SEVEN_SEGMENT_r | 0x80); + ao_mutex_put(&ao_lco_display_mutex); + ao_lco_set_pad(ao_lco_pad); +} + #define MASK_SIZE(n) (((n) + 7) >> 3) #define MASK_ID(n) ((n) >> 3) #define MASK_SHIFT(n) ((n) & 7) @@ -123,6 +165,188 @@ ao_lco_pad_first(uint8_t box) 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; +static uint16_t ao_lco_drag_display_time; +static uint8_t ao_lco_drag_display_on; + +#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_drag(); + ao_lco_fire_down = 0; + ao_lco_drag_display_on = 1; + ao_lco_drag_display_time = ao_time() + AO_SEC_TO_TICKS(5); +} + +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 uint16_t +ao_lco_drag_display_check(uint16_t now, uint16_t delay) +{ + uint16_t display_delay; + + if (ao_lco_drag_display_on) { + if ((int16_t) (now - ao_lco_drag_display_time) >= 0) { + ao_lco_drag_display_on = 0; + ao_lco_set_display(); + } else { + display_delay = ao_lco_drag_display_time - now; + if (delay > display_delay) + delay = display_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); + delay = ao_lco_drag_display_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) { @@ -184,17 +408,49 @@ ao_lco_input(void) case AO_BUTTON_ARM: ao_lco_armed = event.value; PRINTD("Armed %d\n", ao_lco_armed); - if (ao_lco_pad != 0) { - memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); - ao_lco_selected[ao_lco_box] = (1 << (ao_lco_pad - 1)); - ao_wakeup(&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 if (ao_lco_pad != 0) { + memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); + ao_lco_selected[ao_lco_box] = (1 << (ao_lco_pad - 1)); + } } + 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) { + ao_lco_fire_down = 1; + ao_lco_fire_tick = ao_time(); + ao_lco_drag_active = 1; + /* ao_lco_fire_down will already be off if we just enabled drag mode */ + if (ao_lco_fire_down && ao_lco_drag_race) { + if (ao_lco_pad != 0) { + 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; } @@ -241,7 +497,7 @@ ao_lco_get_channels(uint8_t box, struct ao_pad_query *query) ao_lco_valid[box] = 1; } else ao_lco_valid[box] = 0; - PRINTD("ao_lco_get_channels(%d) valid %d\n", box, ao_lco_valid[box]); + PRINTD("ao_lco_get_channels(%d) rssi %d valid %d ret %d\n", box, ao_radio_cmac_rssi, ao_lco_valid[box], r); ao_wakeup(&ao_pad_query); return ao_lco_valid[box]; } @@ -323,6 +579,7 @@ static void ao_lco_igniter_status(void) { uint8_t c; + uint8_t t = 0; for (;;) { ao_sleep(&ao_pad_query); @@ -343,18 +600,27 @@ ao_lco_igniter_status(void) 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]); - else - ao_led_off(continuity_led[c]); + 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; } } @@ -379,12 +645,12 @@ ao_lco_monitor(void) { uint16_t delay; uint8_t box; - struct ao_pad_query pad_query; 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\n", ao_lco_armed, ao_lco_firing); @@ -392,19 +658,17 @@ ao_lco_monitor(void) if (ao_lco_armed && ao_lco_firing) { ao_lco_ignite(); } else { + ao_lco_update(); if (ao_lco_armed) { - for (box = 0; box < AO_PAD_MAX_BOXES; box++) { + 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_get_channels(box, &pad_query); if (ao_lco_valid[box]) ao_lco_arm(box, ao_lco_selected[box], ao_lco_tick_offset[ao_lco_box]); } } } - ao_lco_update(); } if (ao_lco_armed && ao_lco_firing) delay = AO_MS_TO_TICKS(100); -- cgit v1.2.3 From ea1d24151cf76ae8f2368673317b66958e2508c4 Mon Sep 17 00:00:00 2001 From: Bdale Garbee Date: Tue, 29 Sep 2015 00:45:27 -0600 Subject: add automatic Bluetooth functionality check to turnon_telebt --- ao-bringup/turnon_telebt | 9 +++++++++ 1 file changed, 9 insertions(+) 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 $? -- cgit v1.2.3 From 0afa07d3c1dcb5e301fcb8b4edfecdd961662478 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 12 Sep 2015 19:20:49 -0700 Subject: altoslib: Hide 'state' member and use accessor function Someone was smashing the state to 'landed' when no packets had been received for a while. Found that by making it impossible for anyone outside of AltosState to change the value. Signed-off-by: Keith Packard --- altoslib/AltosCSV.java | 8 ++++---- altoslib/AltosEepromDownload.java | 14 +++++++------- altoslib/AltosEepromFile.java | 4 ++-- altoslib/AltosFlightStats.java | 6 +++--- altoslib/AltosKML.java | 8 ++++---- altoslib/AltosMap.java | 9 +++++---- altoslib/AltosReplayReader.java | 2 +- altoslib/AltosState.java | 6 +++++- altoslib/AltosTelemetry.java | 2 +- altoslib/AltosTelemetryFile.java | 4 ++-- altosui/AltosFlightStatus.java | 6 +++--- altosui/AltosFlightUI.java | 10 +++++----- altosui/AltosPad.java | 10 +++++----- altosui/AltosUI.java | 2 +- altosuilib/AltosDisplayThread.java | 32 ++++++++++++++------------------ altosuilib/AltosGraphDataPoint.java | 2 +- 16 files changed, 63 insertions(+), 62 deletions(-) diff --git a/altoslib/AltosCSV.java b/altoslib/AltosCSV.java index edb23e69..150f5a64 100644 --- a/altoslib/AltosCSV.java +++ b/altoslib/AltosCSV.java @@ -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/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java index baaeb993..5e035dbc 100644 --- a/altoslib/AltosEepromDownload.java +++ b/altoslib/AltosEepromDownload.java @@ -111,12 +111,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; } @@ -174,13 +174,13 @@ 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); } diff --git a/altoslib/AltosEepromFile.java b/altoslib/AltosEepromFile.java index 33d4f63b..002b7fff 100644 --- a/altoslib/AltosEepromFile.java +++ b/altoslib/AltosEepromFile.java @@ -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/AltosFlightStats.java b/altoslib/AltosFlightStats.java index b837ba84..fdf79fa2 100644 --- a/altoslib/AltosFlightStats.java +++ b/altoslib/AltosFlightStats.java @@ -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/AltosKML.java b/altoslib/AltosKML.java index 81433958..1a364106 100644 --- a/altoslib/AltosKML.java +++ b/altoslib/AltosKML.java @@ -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/AltosMap.java b/altoslib/AltosMap.java index 8a3266c9..a2855192 100644 --- a/altoslib/AltosMap.java +++ b/altoslib/AltosMap.java @@ -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); @@ -324,6 +324,7 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener { if (!tiles.containsKey(point)) { AltosLatLon ul = transform.lat_lon(point); AltosLatLon center = transform.lat_lon(new AltosPointDouble(x + AltosMap.px_size/2, y + AltosMap.px_size/2)); + debug("make tile %g,%g\n", center.lat, center.lon); AltosMapTile tile = map_interface.new_tile(this, ul, center, zoom, maptype, px_size); tiles.put(point, tile); } diff --git a/altoslib/AltosReplayReader.java b/altoslib/AltosReplayReader.java index 9419ec93..55faa17c 100644 --- a/altoslib/AltosReplayReader.java +++ b/altoslib/AltosReplayReader.java @@ -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/AltosState.java b/altoslib/AltosState.java index cf4fb9b0..12cd5adf 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -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) { diff --git a/altoslib/AltosTelemetry.java b/altoslib/AltosTelemetry.java index 4c973cd9..821adc84 100644 --- a/altoslib/AltosTelemetry.java +++ b/altoslib/AltosTelemetry.java @@ -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/AltosTelemetryFile.java b/altoslib/AltosTelemetryFile.java index d2275f54..d87939ff 100644 --- a/altoslib/AltosTelemetryFile.java +++ b/altoslib/AltosTelemetryFile.java @@ -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/altosui/AltosFlightStatus.java b/altosui/AltosFlightStatus.java index 815a6fa4..f44e2616 100644 --- a/altosui/AltosFlightStatus.java +++ b/altosui/AltosFlightStatus.java @@ -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/AltosFlightUI.java b/altosui/AltosFlightUI.java index db33e0d9..939c4688 100644 --- a/altosui/AltosFlightUI.java +++ b/altosui/AltosFlightUI.java @@ -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/AltosPad.java b/altosui/AltosPad.java index 2f87b681..d056e256 100644 --- a/altosui/AltosPad.java +++ b/altosui/AltosPad.java @@ -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..c29f0db3 100644 --- a/altosui/AltosUI.java +++ b/altosui/AltosUI.java @@ -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/altosuilib/AltosDisplayThread.java b/altosuilib/AltosDisplayThread.java index 73d85698..a773022b 100644 --- a/altosuilib/AltosDisplayThread.java +++ b/altosuilib/AltosDisplayThread.java @@ -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)); diff --git a/altosuilib/AltosGraphDataPoint.java b/altosuilib/AltosGraphDataPoint.java index 30d436ae..ce76e906 100644 --- a/altosuilib/AltosGraphDataPoint.java +++ b/altosuilib/AltosGraphDataPoint.java @@ -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) { -- cgit v1.2.3 From 618f7ac8f31941fcbb3ed91829de69c0f0be8e0b Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 12 Sep 2015 20:41:37 -0700 Subject: altoslib: Rotation off by factor of two The rotation computation was off by a factor of two when converting the rates to a quaternion (the quaternion needs to be half of the actual rotation amount). This ended up presenting a tilt angle of twice what it should be. Signed-off-by: Keith Packard --- altoslib/AltosRotation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/altoslib/AltosRotation.java b/altoslib/AltosRotation.java index 9771c166..c4b07f62 100644 --- a/altoslib/AltosRotation.java +++ b/altoslib/AltosRotation.java @@ -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(); } -- cgit v1.2.3 From 9dae5f76c5691dc94c02839eb1321426f96f2134 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 13 Sep 2015 22:24:47 -0700 Subject: altos/telelco: Adjust drag race UI Enter/leave drag race is done by rotating the box selector knob to a new 'dr' position and then holding down the firing button; this avoids a potential accidental firing if you somehow don't realize you've armed the box before selecting drag race mode. Signed-off-by: Keith Packard --- src/drivers/ao_lco.c | 234 ++++++++++++++++++++++++++------------------------- 1 file changed, 118 insertions(+), 116 deletions(-) diff --git a/src/drivers/ao_lco.c b/src/drivers/ao_lco.c index 8180c49d..e2039604 100644 --- a/src/drivers/ao_lco.c +++ b/src/drivers/ao_lco.c @@ -52,7 +52,10 @@ 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 uint8_t ao_lco_box; +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; @@ -65,12 +68,34 @@ ao_lco_set_pad(uint8_t pad) 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_mutex_get(&ao_lco_display_mutex); - 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)); + 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); } @@ -92,41 +117,17 @@ ao_lco_set_voltage(uint16_t decivolts) 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); } } -#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_display_drag(void) -{ - ao_mutex_get(&ao_lco_display_mutex); - ao_seven_segment_direct(AO_LCO_BOX_DIGIT_10, SEVEN_SEGMENT_d | 0x80); - ao_seven_segment_direct(AO_LCO_BOX_DIGIT_1, SEVEN_SEGMENT_r | 0x80); - ao_mutex_put(&ao_lco_display_mutex); - ao_lco_set_pad(ao_lco_pad); -} - #define MASK_SIZE(n) (((n) + 7) >> 3) #define MASK_ID(n) ((n) >> 3) #define MASK_SHIFT(n) ((n) & 7) @@ -134,8 +135,11 @@ ao_lco_set_display_drag(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; @@ -171,8 +175,6 @@ 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; -static uint16_t ao_lco_drag_display_time; -static uint8_t ao_lco_drag_display_on; #define AO_LCO_DRAG_BEEP_TIME AO_MS_TO_TICKS(50) #define AO_LCO_DRAG_WARN_TIME AO_SEC_TO_TICKS(5) @@ -237,10 +239,8 @@ ao_lco_drag_enable(void) ao_lco_drag_race = 1; memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); ao_lco_drag_beep(5); - ao_lco_set_display_drag(); + ao_lco_set_display(); ao_lco_fire_down = 0; - ao_lco_drag_display_on = 1; - ao_lco_drag_display_time = ao_time() + AO_SEC_TO_TICKS(5); } static void @@ -298,24 +298,6 @@ ao_lco_drag_warn_check(uint16_t now, uint16_t delay) return delay; } -static uint16_t -ao_lco_drag_display_check(uint16_t now, uint16_t delay) -{ - uint16_t display_delay; - - if (ao_lco_drag_display_on) { - if ((int16_t) (now - ao_lco_drag_display_time) >= 0) { - ao_lco_drag_display_on = 0; - ao_lco_set_display(); - } else { - display_delay = ao_lco_drag_display_time - now; - if (delay > display_delay) - delay = display_delay; - } - } - return delay; -} - static void ao_lco_drag_monitor(void) { @@ -337,7 +319,6 @@ ao_lco_drag_monitor(void) delay = ao_lco_drag_button_check(now, delay); delay = ao_lco_drag_warn_check(now, delay); delay = ao_lco_drag_beep_check(now, delay); - delay = ao_lco_drag_display_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) { @@ -351,7 +332,8 @@ 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 (;;) { @@ -385,18 +367,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_channels[ao_lco_box] = 0; + if (ao_lco_box != AO_LCO_BOX_DRAG) + ao_lco_channels[ao_lco_box] = 0; ao_lco_set_display(); } } @@ -418,9 +408,12 @@ ao_lco_input(void) break; } } - } else if (ao_lco_pad != 0) { + } else { memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); - ao_lco_selected[ao_lco_box] = (1 << (ao_lco_pad - 1)); + 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); @@ -433,12 +426,13 @@ ao_lco_input(void) ao_wakeup(&ao_lco_armed); } else { if (event.value) { - ao_lco_fire_down = 1; - ao_lco_fire_tick = ao_time(); - ao_lco_drag_active = 1; - /* ao_lco_fire_down will already be off if we just enabled drag mode */ - if (ao_lco_fire_down && ao_lco_drag_race) { - if (ao_lco_pad != 0) { + 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]); @@ -505,16 +499,18 @@ ao_lco_get_channels(uint8_t box, struct ao_pad_query *query) static void ao_lco_update(void) { - uint8_t previous_valid = ao_lco_valid[ao_lco_box]; - - if (ao_lco_get_channels(ao_lco_box, &ao_pad_query)) { - if (!previous_valid) { - if (ao_lco_pad != 0) - ao_lco_pad = ao_lco_pad_first(ao_lco_box); - ao_lco_set_display(); + 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)) { + if (!previous_valid) { + 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(); } - if (ao_lco_pad == 0) - ao_lco_set_display(); } } @@ -583,44 +579,50 @@ ao_lco_igniter_status(void) for (;;) { ao_sleep(&ao_pad_query); - PRINTD("RSSI %d VALID %d\n", ao_radio_cmac_rssi, ao_lco_valid[ao_lco_box]); - if (!ao_lco_valid[ao_lco_box]) { - 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); + if (!ao_lco_valid[ao_lco_box]) { + 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(AO_LED_REMOTE_ARM); - for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) { - uint8_t status; + 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]); + 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; } - t = 1-t; } } @@ -665,7 +667,7 @@ ao_lco_monitor(void) PRINTD("Arming box %d pads %x\n", box, ao_lco_selected[box]); if (ao_lco_valid[box]) - ao_lco_arm(box, ao_lco_selected[box], ao_lco_tick_offset[ao_lco_box]); + ao_lco_arm(box, ao_lco_selected[box], ao_lco_tick_offset[box]); } } } -- cgit v1.2.3 From f61c2b73f3b63aa9c3f0fbccede89c71580089ba Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 13 Sep 2015 22:27:10 -0700 Subject: altosdroid: Add minus sign and decimal point to lat/lon input fields Some android devices always have change-sign and decimal-point keys visible, but some do not. Make sure they're available for lat/lon input. Signed-off-by: Keith Packard --- altosdroid/res/layout/map_preload.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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"/> + android:inputType="number|numberSigned|numberDecimal"/> Date: Mon, 21 Sep 2015 06:00:36 +0100 Subject: altosuilib: In display thread, set new state synchronously When replaying telemetry, received_time gets set by both the telemetry reader (when the file is initially read) and by the replay reader (as the telemetry is processed). Because these two events are separated by the time it takes to play the file, the second time is the one we want for figuring out how long since the last telemetry packet. However, if we set the global state when pulling the state out of the telemetry reader, and then the replay reader pauses for a long time, then the voice output thread sees the intermediate time value and thinks that it has been a long time since the last packet was received and reports that the rocket may have crashed. Fix this by just holding the read state until it has been passed by the replay reader and had the received_time set to current time. Signed-off-by: Keith Packard --- altosuilib/AltosDisplayThread.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/altosuilib/AltosDisplayThread.java b/altosuilib/AltosDisplayThread.java index a773022b..fac4ad72 100644 --- a/altosuilib/AltosDisplayThread.java +++ b/altosuilib/AltosDisplayThread.java @@ -219,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); -- cgit v1.2.3 From 0f8272852b12cf7a349cd9fd07f17c55cdb335a1 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 21 Sep 2015 06:25:49 +0100 Subject: altoslib: Make sure .eeprom download file is flushed on exception Flush and close the eeprom file even if an exception occurs to make sure that contents of the file aren't lost. Signed-off-by: Keith Packard --- altoslib/AltosEepromDownload.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java index 5e035dbc..c4ddb0e7 100644 --- a/altoslib/AltosEepromDownload.java +++ b/altoslib/AltosEepromDownload.java @@ -147,7 +147,6 @@ public class AltosEepromDownload implements Runnable { /* Reset per-capture variables */ want_file = false; - eeprom_file = null; eeprom_pending = new LinkedList(); /* Set serial number in the monitor dialog window */ @@ -185,10 +184,6 @@ public class AltosEepromDownload implements Runnable { block - log.start_block); } CheckFile(true); - if (eeprom_file != null) { - eeprom_file.flush(); - eeprom_file.close(); - } } public void run () { @@ -201,11 +196,16 @@ public class AltosEepromDownload implements Runnable { parse_exception = null; if (log.selected) { monitor.reset(); + eeprom_file = null; try { CaptureLog(log); } catch (ParseException e) { parse_exception = e; } + if (eeprom_file != null) { + eeprom_file.flush(); + eeprom_file.close(); + } } if (parse_exception != null) { failed = true; -- cgit v1.2.3 From c1dec3bec0789e8934a6e13fd117931ba468b318 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 21 Sep 2015 06:27:26 +0100 Subject: Bump release number to 1.6.1.1 Signed-off-by: Keith Packard --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index bbf82377..e037e0f2 100644 --- a/configure.ac +++ b/configure.ac @@ -18,7 +18,7 @@ dnl dnl Process this file with autoconf to create configure. AC_PREREQ(2.57) -AC_INIT([altos], 1.6.1) +AC_INIT([altos], 1.6.1.1) ANDROID_VERSION=9 AC_CONFIG_SRCDIR([src/kernel/ao.h]) AM_INIT_AUTOMAKE([foreign dist-bzip2]) -- cgit v1.2.3 From 431c713389dc819d2433d893c898ff82c7941722 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 21 Sep 2015 06:32:52 +0100 Subject: altoslib: Clean up remaining direct AltosState.state users This value has been hidden to avoid having it written accidentally; there were a few more bits of code using it though. Signed-off-by: Keith Packard --- altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java | 12 ++++++------ altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java | 8 ++++---- altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java | 4 ++-- telegps/TeleGPSDisplayThread.java | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index 3a07212a..1a27e4eb 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -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/AltosVoice.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java index 325b89d2..ce3b57af 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java @@ -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/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index 4d04316f..82e89bb0 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -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/telegps/TeleGPSDisplayThread.java b/telegps/TeleGPSDisplayThread.java index fa394b17..11bca5d0 100644 --- a/telegps/TeleGPSDisplayThread.java +++ b/telegps/TeleGPSDisplayThread.java @@ -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) -- cgit v1.2.3 From 926522c6791c2a5529ea24ebd67eea45350e3526 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 21 Sep 2015 07:01:19 +0100 Subject: altoslib: Keep downloading when a parse error occurs Eventually, we'll hit a block with no valid data and give up. Until then, keep going in case the flight computer glitched and wrote bad data. Signed-off-by: Keith Packard --- altoslib/AltosEepromDownload.java | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java index c4ddb0e7..594f053f 100644 --- a/altoslib/AltosEepromDownload.java +++ b/altoslib/AltosEepromDownload.java @@ -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; @@ -193,25 +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); } -- cgit v1.2.3 From 6659d08c41d89e4aa3d5e849c066a91bb09f2dd7 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 21 Sep 2015 07:03:30 +0100 Subject: Create directory on keithp.com when uploading devel version Signed-off-by: Keith Packard --- Makefile.am | 1 + 1 file changed, 1 insertion(+) 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: -- cgit v1.2.3 From 0ae116dd8779fd0594d443a735e7b6834ea9b713 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 10 Oct 2015 14:10:59 -0700 Subject: telelco: Fix pad reset to one on radio signal loss The pad number was getting reset back to one when signal was lost, causing pad one to get fired in this case even when already set to arm mode. Signed-off-by: Keith Packard --- src/drivers/ao_lco.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/drivers/ao_lco.c b/src/drivers/ao_lco.c index e2039604..6c192537 100644 --- a/src/drivers/ao_lco.c +++ b/src/drivers/ao_lco.c @@ -39,6 +39,9 @@ static uint8_t ao_lco_debug; #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_selected[AO_PAD_MAX_BOXES]; static uint8_t ao_lco_valid[AO_PAD_MAX_BOXES]; @@ -488,10 +491,10 @@ ao_lco_get_channels(uint8_t box, struct ao_pad_query *query) r = ao_lco_query(box, query, &ao_lco_tick_offset[box]); if (r == AO_RADIO_CMAC_OK) { ao_lco_channels[box] = query->channels; - ao_lco_valid[box] = 1; + ao_lco_valid[box] = AO_LCO_VALID_LAST | AO_LCO_VALID_EVER; } else - ao_lco_valid[box] = 0; - PRINTD("ao_lco_get_channels(%d) rssi %d valid %d ret %d\n", box, ao_radio_cmac_rssi, ao_lco_valid[box], r); + 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]; } @@ -502,8 +505,8 @@ 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)) { - if (!previous_valid) { + 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(); @@ -537,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; @@ -549,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); @@ -585,7 +587,7 @@ ao_lco_igniter_status(void) for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) ao_led_off(continuity_led[c]); } else { - if (!ao_lco_valid[ao_lco_box]) { + 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; @@ -666,8 +668,10 @@ ao_lco_monitor(void) if (ao_lco_selected[box]) { PRINTD("Arming box %d pads %x\n", box, ao_lco_selected[box]); - if (ao_lco_valid[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)); + } } } } -- cgit v1.2.3 From c1ca80318102af122cb7b5380331e37795280761 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 13 Oct 2015 13:52:32 -0700 Subject: doc: Force FOP to read images from doc directory Looks like something changed and fop is now reading from the directory containing the source file. xmlto places that source in /tmp, making all relative URIs fail. Fix this by creating a fop configuration file directing it to load relative to the doc directory and then pass that through xmlto. Signed-off-by: Keith Packard --- doc/Makefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 9c6189b4..9d4d68c6 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -74,6 +74,7 @@ PDF=altusmetrum.pdf altos.pdf telemetry.pdf companion.pdf micropeak.pdf telegps. 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 +FOPCFG=fop-cfg.xml TEMPLATES=titlepage.templates.xsl PDFSTYLE= IMAGES=$(PICTURES) $(SVG) @@ -87,7 +88,7 @@ XSLTFLAGS=--stringparam section.autolabel 1 --xinclude xsltproc $(XSLTFLAGS) -o $@ $(HTMLSTYLE) $*.xsl .xsl.pdf: - xmlto -x $(FOSTYLE) --with-fop pdf $*.xsl + xmlto -p '-c $(FOPCFG)' --searchpath `pwd` -x $(FOSTYLE) --with-fop pdf $*.xsl .xml.xsl: xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.xml @@ -116,8 +117,11 @@ altusmetrum.pdf: $(RELNOTES_XSL) $(IMAGES) telegps.html: $(RELNOTES_XSL) $(IMAGES) telegps.pdf: $(RELNOTES_XSL) $(IMAGES) -$(PDF): $(FOSTYLE) $(TEMPLATES) +$(PDF): $(FOSTYLE) $(TEMPLATES) $(FOPCFG) indent: altusmetrum.xsl xmlindent -i 2 < altusmetrum.xsl > altusmetrum.new +$(FOPCFG): Makefile + (echo ''; echo ' '"`pwd`"''; echo '') > $@ + -- cgit v1.2.3 From 8cf466d7a767a20387a8d9d6ec81ee00af3fe4a7 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 29 Oct 2015 12:12:15 +0900 Subject: doc: Start doc transition to asciidoc Signed-off-by: Keith Packard --- doc/.gitignore | 2 + doc/Makefile | 27 +- doc/altusmetrum-docinfo.xml | 153 + doc/altusmetrum.txt | 46 + doc/altusmetrum.xsl | 6413 ------------------------------ doc/am-fo.xsl | 191 + doc/am.css | 356 ++ doc/common.xsl | 106 + doc/fonts/DejaVuSansMono-Bold.ttf | Bin 0 -> 331536 bytes doc/fonts/DejaVuSansMono-BoldOblique.ttf | Bin 0 -> 253116 bytes doc/fonts/DejaVuSansMono-Oblique.ttf | Bin 0 -> 251472 bytes doc/fonts/DejaVuSansMono.ttf | Bin 0 -> 340240 bytes doc/fonts/FrutigerLTStd-Italic.otf | Bin 0 -> 27736 bytes doc/fonts/FrutigerLTStd-Light.otf | Bin 0 -> 27440 bytes doc/fonts/FrutigerLTStd-LightItalic.otf | Bin 0 -> 27888 bytes doc/fonts/FrutigerLTStd-Roman.otf | Bin 0 -> 27328 bytes doc/footer.templates.xsl | 52 + doc/fop.xconf | 88 + doc/getting-started.inc | 85 + doc/handling.inc | 42 + doc/intro.inc | 54 + doc/specs.inc | 139 + doc/telemetrum.inc | 68 + doc/usage.inc | 90 + 24 files changed, 1497 insertions(+), 6415 deletions(-) create mode 100644 doc/altusmetrum-docinfo.xml create mode 100644 doc/altusmetrum.txt delete mode 100644 doc/altusmetrum.xsl create mode 100644 doc/am-fo.xsl create mode 100644 doc/am.css create mode 100644 doc/common.xsl create mode 100644 doc/fonts/DejaVuSansMono-Bold.ttf create mode 100644 doc/fonts/DejaVuSansMono-BoldOblique.ttf create mode 100644 doc/fonts/DejaVuSansMono-Oblique.ttf create mode 100644 doc/fonts/DejaVuSansMono.ttf create mode 100644 doc/fonts/FrutigerLTStd-Italic.otf create mode 100644 doc/fonts/FrutigerLTStd-Light.otf create mode 100644 doc/fonts/FrutigerLTStd-LightItalic.otf create mode 100644 doc/fonts/FrutigerLTStd-Roman.otf create mode 100644 doc/footer.templates.xsl create mode 100644 doc/fop.xconf create mode 100644 doc/getting-started.inc create mode 100644 doc/handling.inc create mode 100644 doc/intro.inc create mode 100644 doc/specs.inc create mode 100644 doc/telemetrum.inc create mode 100644 doc/usage.inc 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 9d4d68c6..6ebe829c 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -61,6 +61,15 @@ PICTURES=\ telemini-v1-top.jpg \ telemini-v2-top.jpg +TXT_FILES=altusmetrum.txt +INC_FILES=intro.inc getting-started.inc usage.inc telemetrum.inc handling.inc specs.inc + +RAW_FILES=$(TXT_FILES:.txt=.raw) + +RAW_INC=$(INC_FILES:.inc=.raw) + +AD_PDF=$(TXT_FILES:.txt=.pdf) + SVG=\ easymini.svg \ telemega.svg \ @@ -71,7 +80,7 @@ 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 + telemetrum-outline.pdf telemega-outline.pdf easymini-outline.pdf easymega-outline.pdf $(AD_PDF) HTMLSTYLE=/usr/share/xml/docbook/stylesheet/docbook-xsl/html/docbook.xsl FOSTYLE=xorg-fo.xsl FOPCFG=fop-cfg.xml @@ -80,10 +89,22 @@ PDFSTYLE= IMAGES=$(PICTURES) $(SVG) DOC=$(HTML) $(PDF) $(IMAGES) -.SUFFIXES: .xml .xsl .html .pdf +.SUFFIXES: .inc .txt .raw .pdf .html XSLTFLAGS=--stringparam section.autolabel 1 --xinclude +.txt.raw: + sed -e 's/@@VERSION@@/$(VERSION)/' -e 's/@@DATE@@/$(DATE)/' -e 's/^[ ]*//' -e 's/^\\//' $*.txt > $@ + +.inc.raw: + sed -e 's/@@VERSION@@/$(VERSION)/' -e 's/@@DATE@@/$(DATE)/' -e 's/^[ ]*//' -e 's/^\\//' $*.inc > $@ + +.raw.pdf: + a2x --verbose -k -d book -a docinfo -f pdf --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file am-fo.xsl --fop --fop-opts="-c fop.xconf" $*.raw + +.raw.html: + a2x --verbose -k -d book -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --stylesheet=am.css $*.raw + .xsl.html: xsltproc $(XSLTFLAGS) -o $@ $(HTMLSTYLE) $*.xsl @@ -95,6 +116,8 @@ XSLTFLAGS=--stringparam section.autolabel 1 --xinclude all: $(HTML) $(PDF) +altusmetrum.pdf: altusmetrum-docinfo.xml $(RAW_FILES) $(RAW_INC) + install: all publish: $(DOC) diff --git a/doc/altusmetrum-docinfo.xml b/doc/altusmetrum-docinfo.xml new file mode 100644 index 00000000..05815f5a --- /dev/null +++ b/doc/altusmetrum-docinfo.xml @@ -0,0 +1,153 @@ +An Owner's Manual for Altus Metrum Rocketry Electronics + + Bdale + Garbee + + + Keith + Packard + + + Bob + Finch + + + Anthony + Towns + + + 2015 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + + + + 1.6.1 + 15 July 2015 + + Minor release adding TeleBT v3.0 support. + + + + 1.6 + 8 January 2015 + + Major release adding TeleDongle v3.0 support. + + + + 1.5 + 6 September 2014 + + Major release adding EasyMega support. + + + + 1.4.1 + 20 June 2014 + + Minor release fixing some installation bugs. + + + + 1.4 + 15 June 2014 + + Major release adding TeleGPS support. + + + + 1.3.2 + 24 January 2014 + + Bug fixes for TeleMega and AltosUI. + + + + 1.3.1 + 21 January 2014 + + Bug fixes for TeleMega and TeleMetrum v2.0 along with a few + small UI improvements. + + + + 1.3 + 12 November 2013 + + 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. + + + + 1.2.1 + 21 May 2013 + + 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. + + + + 1.2 + 18 April 2013 + + Updated for software version 1.2. Version 1.2 adds support + for MicroPeak and the MicroPeak USB interface. + + + + 1.1.1 + 16 September 2012 + + Updated for software version 1.1.1 Version 1.1.1 fixes a few + bugs found in version 1.1. + + + + 1.1 + 13 September 2012 + + Updated for software version 1.1. Version 1.1 has new + features but is otherwise compatible with version 1.0. + + + + 1.0 + 24 August 2011 + + 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. + + + + 0.9 + 18 January 2011 + + 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. + + + + 0.8 + 24 November 2010 + Updated for software version 0.8 + + diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt new file mode 100644 index 00000000..5b6dfe81 --- /dev/null +++ b/doc/altusmetrum.txt @@ -0,0 +1,46 @@ += The Altus Metrum System + +:doctype: book +:numbered: + + [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 + + include::intro.raw[] + + include::getting-started.raw[] + + include::usage.raw[] + + include::telemetrum.raw[] + + include::handling.raw[] + + include::specs.raw[] + + [index] + == Index 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 @@ - - - - The Altus Metrum System - An Owner's Manual for Altus Metrum Rocketry Electronics - - - Bdale - Garbee - - - Keith - Packard - - - Bob - Finch - - - Anthony - Towns - - - 2015 - Bdale Garbee and Keith Packard - - - - - - - - - This document is released under the terms of the - - Creative Commons ShareAlike 3.0 - - license. - - - - - 1.6.1 - 15 July 2015 - - Minor release adding TeleBT v3.0 support. - - - - 1.6 - 8 January 2015 - - Major release adding TeleDongle v3.0 support. - - - - 1.5 - 6 September 2014 - - Major release adding EasyMega support. - - - - 1.4.1 - 20 June 2014 - - Minor release fixing some installation bugs. - - - - 1.4 - 15 June 2014 - - Major release adding TeleGPS support. - - - - 1.3.2 - 24 January 2014 - - Bug fixes for TeleMega and AltosUI. - - - - 1.3.1 - 21 January 2014 - - Bug fixes for TeleMega and TeleMetrum v2.0 along with a few - small UI improvements. - - - - 1.3 - 12 November 2013 - - 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. - - - - 1.2.1 - 21 May 2013 - - 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. - - - - 1.2 - 18 April 2013 - - Updated for software version 1.2. Version 1.2 adds support - for MicroPeak and the MicroPeak USB interface. - - - - 1.1.1 - 16 September 2012 - - Updated for software version 1.1.1 Version 1.1.1 fixes a few - bugs found in version 1.1. - - - - 1.1 - 13 September 2012 - - Updated for software version 1.1. Version 1.1 has new - features but is otherwise compatible with version 1.0. - - - - 1.0 - 24 August 2011 - - 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. - - - - 0.9 - 18 January 2011 - - 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. - - - - 0.8 - 24 November 2010 - Updated for software version 0.8 - - - - - 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. - -Bdale Garbee, KB0G -NAR #87103, TRA #12201 - -Keith Packard, KD7SQG -NAR #88757, TRA #12200 - - - - - 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. - - - - Getting Started - - The first thing to do after you check the inventory of parts in your - “starter kit” is to charge the battery. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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). - - - 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 - . - - - 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'. - - - - 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. - - - 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. - - - - Altus Metrum Hardware -
- General Usage Instructions - - 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. - - - 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 JST Jumper 2 - Wire Assembly. - - - 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. - -
- 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. The follow - the instructions that come with your active switch to - connect it up. - -
-
-
- Using a Separate Pyro Battery - - 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. - - - 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. - -
-
- Using a Different Kind of Battery - - 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. - -
-
-
- Specifications - - Here's the full set of Altus Metrum products, both in - production and retired. - - - Altus Metrum Electronics - - - - - - - - - - - - - Device - Barometer - Z-axis accelerometer - GPS - 3D sensors - Storage - RF Output - Battery - - - - - 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 - - - TeleMini v1.0 - MP3H6115 10km (33k') - - - - - - - 5kB - 10mW - 3.7V - - - TeleMini v2.0 - MS5607 30km (100k') - - - - - - - 1MB - 10mW - 3.7-12V - - - EasyMini v1.0 - MS5607 30km (100k') - - - - - - - 1MB - - - 3.7-12V - - - TeleMega v1.0 - MS5607 30km (100k') - MMA6555 102g - uBlox Max-7Q - MPU6000 HMC5883 - 8MB - 40mW - 3.7V - - - EasyMega v1.0 - MS5607 30km (100k') - MMA6555 102g - - - MPU6000 HMC5883 - 8MB - - - 3.7V - - - -
- - Altus Metrum Boards - - - - - - - - - - - Device - Connectors - Screw Terminals - Width - Length - Tube Size - - - - - TeleMetrum - - Antenna - Debug - Companion - USB - Battery - - Apogee pyro Main pyro Switch - 1 inch (2.54cm) - 2 ¾ inch (6.99cm) - 29mm coupler - - - 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 - - - EasyMini - - Debug - USB - Battery - - - Apogee pyro - Main pyro - Battery - Switch - - 0.8 inch (2.03cm) - 1½ inch (3.81cm) - 24mm coupler - - - 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 - - - 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 - - - -
-
-
- TeleMetrum - - - - - - - - - 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. - -
- 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 - - - - - - - - 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. - -
-
-
- TeleMini v1.0 - - - - - - - - - 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 Connections - - - - - - - - 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. - -
-
-
- TeleMini v2.0 - - - - - - - - - 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. - -
- TeleMini v2.0 Screw Terminals - - 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: - - - TeleMini v2.0 Connections - - - - - - - - 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 - - - -
-
-
- Using a Separate Pyro Battery with TeleMini v2.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. - - - To connect the negative pyro battery terminal to TeleMini - 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 TeleMini v2.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 (top - terminal 1 for the Main charge, bottom terminal 1 for the - Apogee charge). - -
-
- Using an Active Switch with TeleMini v2.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. 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. - -
-
-
- EasyMini - - - - - - - - - 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. - -
- EasyMini Screw Terminals - - 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: - - - EasyMini Connections - - - - - - - - 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 - - - -
-
-
- 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 TeleMini - 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. - -
-
-
- TeleMega - - - - - - - - - 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 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 - - - - - - - - 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. - -
-
-
- EasyMega - - - - - - - - - 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 - - - - - - - - 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. - -
-
-
- Flight Data Recording - - 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. - - - Data Storage on Altus Metrum altimeters - - - - - - - - - Device - Bytes per Sample - Total Storage - Minutes at Full Rate - - - - - TeleMetrum v1.0 - 8 - 1MB - 20 - - - TeleMetrum v1.1 v1.2 - 8 - 2MB - 40 - - - TeleMetrum v2.0 - 16 - 8MB - 80 - - - TeleMini v1.0 - 2 - 5kB - 4 - - - TeleMini v2.0 - 16 - 1MB - 10 - - - EasyMini - 16 - 1MB - 10 - - - TeleMega - 32 - 8MB - 40 - - - EasyMega - 32 - 8MB - 40 - - - -
- - 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 - 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. - - - 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. - - - 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. - - - 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. - -
-
- 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. 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 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. Check - polarity and voltage before connecting any battery not purchased - from Altus Metrum or Spark Fun. - - - 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. - - - 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. - - - 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. - - - 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. - -
-
- - 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. 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. - - - 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. - - - 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. - - AltOS Modes - - - - - - - - - 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 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. - - - - - -
-
- - 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. - 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. - - - 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”) - - - Here's a summary of all of the “pad” and “idle” mode indications. - - Pad/Idle Indications - - - - - - - - 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. - - - - - -
-
- - 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. - - - 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! - - - 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. - -
-
- 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. - -
-
- 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. - -
-
- Ground Testing - - 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! - - - 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. - -
-
- Radio Link - - 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. - - - 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! - -
-
- APRS - - 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. - - - 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. - - - 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 about the flight computer. It sends four fields as - shown in the following table. - - - Altus Metrum APRS Comments - - - - - - - - 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 - - - 4 - A3.7 - Apogee Igniter Voltage - - - 5 - M3.7 - Main Igniter Voltage - - - 6 - 1286 - Device Serial Number - - - -
- - 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 - - - - 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. - - - 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. - -
-
- 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”. 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. - -
- Radio Frequency - - 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. - -
-
- Callsign - - 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. - -
-
- Telemetry/RDF/APRS Enable - - You can completely disable the radio while in flight, if - necessary. This doesn't disable the packet link in idle - mode. - -
-
- 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 - - 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. - -
-
- APRS SSID - - 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. - -
-
- Apogee Delay - - 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. - - - 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. - -
-
- 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. - -
-
- Main Deployment Altitude - - 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. - -
-
- Maximum Flight Log - - 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. - - - Even though our flight computers (except TeleMini v1.0) can store - multiple flights, we strongly recommend downloading and saving - flight data after each flight. - -
-
- Ignite Mode - - 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. - - - 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. - -
-
- Pad Orientation - - 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. - -
-
- Configurable Pyro Channels - - 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: - - - - - 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. - - - - - 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. 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. - - - -
-
- -
- - AltosUI - - - - - - - - - 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. - -
- Monitor Flight - Receive, Record and Display Telemetry Data - - 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. - - - - - - - - - - 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 - - - - - - - - - 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 - - - - - - - - - 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 - - - - - - - - - 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 - - - - - - - - - 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 - - - - - - - - - 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 - - - - - - - - - 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 the 'Preload Maps' section below. - -
-
- Ignitor - - - - - - - - - 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. - -
-
-
- Save Flight Data - - 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. - - - 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. - - - 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. Check - the Monitor Flight chapter above to learn how this window operates. - -
-
- 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 - - - - - - - - - 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 - - - - - - - - - This selects which graph elements to show, and, at the - very bottom, lets you switch between metric and - imperial units - -
-
- Flight Statistics - - - - - - - - - Shows overall data computed from the flight. - -
-
- Map - - - - - - - - - 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. - -
-
-
- 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. 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 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. - -
-
- 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. - -
-
-
- Configure Altimeter - - - - - - - - - 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. - - - 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. - -
- 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 Lockoug - - 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. - -
-
- 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. 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. - -
-
- 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. - -
-
- Callsign - - This sets the call sign included in each telemetry packet. Set this - as needed to conform to your local radio regulations. - -
-
- 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. - - - - -
-
- 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. - - - - -
-
- 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. - -
-
- Configure Pyro Channels - - - - - - - - - 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. - - - 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. - -
-
-
- Configure AltosUI - - - - - - - - - This button presents a dialog so that you can configure the AltosUI global settings. - -
- Voice Settings - - 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. - - - - 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 - - - - -
-
- Log Directory - - 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. - - - 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. - -
-
- 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 AltosUI 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. - -
-
- 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. - -
-
- Font Size - - Selects the set of fonts used in the flight monitor - window. Choose between the small, medium and large sets. - -
-
- Serial Debug - - 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. - -
-
- 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. - -
-
-
- Configure Groundstation - - - - - - - - - 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. - -
-
-
- Flash Image - - 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. - -
-
- Fire Igniter - - - - - - - - - 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. - - - 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. - -
-
- Scan Channels - - - - - - - - - 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. - -
-
- Load Maps - - - - - - - - - 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. - -
-
- Monitor Idle - - - - - - - - - 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. - -
-
- - 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. - -
-
- - Using Altus Metrum Products -
- Being Legal - - First off, in the US, you need an amateur radio license or - other authorization to legally operate the radio transmitters that are part - of our products. - -
-
- 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. 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. - - - 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. - -
-
- On the Ground - - To receive the data stream from the rocket, you need an antenna and short - feed-line connected to one of our 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. - - - 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. - - - 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. - - - 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. - - - 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! - - - 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 - - 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. - -
-
- 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 TeleMetrum data file - 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 - - 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! - - - 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 - web site for more news - and information as our family of products evolves! - -
-
- - Altimeter Installation Recommendations - - 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. - -
- Mounting the Altimeter - - 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. - - - - - 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. - - - - - 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. - - - -
-
- Dealing with the Antenna - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - -
-
- Preserving GPS Reception - - 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. - - - - 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. - - - - - 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. - - - - -
-
- Radio Frequency Interference - - 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. - - - 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. - - - Voltages are induced when radio frequency energy is - transmitted from one circuit to another. Here are things that - influence the induced voltage and current: - - - - - Keep wires from different circuits apart. Moving circuits - further apart will reduce RFI. - - - - - 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. - - - - - 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. - - - - - 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). - - - -
-
- The Barometric Sensor - - 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. - - - 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. - - - 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. - -
-
- Ground Testing - - 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. - - - 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! - - - 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. - -
-
- - Updating Device Firmware - - 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. - - - 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 . - - - 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. - - - Self-programmable devices (TeleMega, TeleMetrum v2, EasyMega and EasyMini) - are reprogrammed by connecting them to your computer over USB - -
- - Updating TeleMega, TeleMetrum v2, EasyMega, EasyMini or - TeleDongle v3 Firmware - - - - - 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 TeleMega-v1.0-1.3.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. - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - - 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. - - - -
-
-
- 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. - -
-
- 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. - -
-
- - Hardware Specifications -
- - TeleMega Specifications - - - - - Recording altimeter for model rocketry. - - - - - Supports dual deployment and four auxiliary pyro channels - (a total of 6 events). - - - - - 70cm 40mW ham-band transceiver for telemetry down-link. - - - - - Barometric pressure sensor good to 100k feet MSL. - - - - - 1-axis high-g accelerometer for motor characterization, capable of - +/- 102g. - - - - - 9-axis IMU including integrated 3-axis accelerometer, - 3-axis gyroscope and 3-axis magnetometer. - - - - - On-board, integrated uBlox Max 7 GPS receiver with 5Hz update rate capability. - - - - - On-board 8 Megabyte non-volatile memory for flight data storage. - - - - - USB interface for battery charging, configuration, and data recovery. - - - - - Fully integrated support for Li-Po rechargeable batteries. - - - - - Can use either main system Li-Po or optional separate pyro battery - to fire e-matches. - - - - - 3.25 x 1.25 inch board designed to fit inside 38mm air-frame coupler tube. - - - -
-
- - EasyMega Specifications - - - - - Recording altimeter for model rocketry. - - - - - Supports dual deployment and four auxiliary pyro channels - (a total of 6 events). - - - - - Barometric pressure sensor good to 100k feet MSL. - - - - - 1-axis high-g accelerometer for motor characterization, capable of - +/- 102g. - - - - - 9-axis IMU including integrated 3-axis accelerometer, - 3-axis gyroscope and 3-axis magnetometer. - - - - - On-board 8 Megabyte non-volatile memory for flight data storage. - - - - - USB interface for battery charging, configuration, and data recovery. - - - - - Fully integrated support for Li-Po rechargeable batteries. - - - - - Can use either main system Li-Po or optional separate pyro battery - to fire e-matches. - - - - - 1.25 x 1.25 inch board designed to fit inside 38mm air-frame coupler tube. - - - -
-
- - TeleMetrum v2 Specifications - - - - - Recording altimeter for model rocketry. - - - - - Supports dual deployment (can fire 2 ejection charges). - - - - - 70cm, 40mW ham-band transceiver for telemetry down-link. - - - - - Barometric pressure sensor good to 100k feet MSL. - - - - - 1-axis high-g accelerometer for motor characterization, capable of - +/- 102g. - - - - - On-board, integrated uBlox Max 7 GPS receiver with 5Hz update rate capability. - - - - - On-board 8 Megabyte non-volatile memory for flight data storage. - - - - - USB interface for battery charging, configuration, and data recovery. - - - - - Fully integrated support for Li-Po rechargeable batteries. - - - - - Uses Li-Po to fire e-matches, can be modified to support - optional separate pyro battery if needed. - - - - - 2.75 x 1 inch board designed to fit inside 29mm air-frame coupler tube. - - - -
-
- TeleMetrum v1 Specifications - - - - Recording altimeter for model rocketry. - - - - - Supports dual deployment (can fire 2 ejection charges). - - - - - 70cm, 10mW ham-band transceiver for telemetry down-link. - - - - - Barometric pressure sensor good to 45k feet MSL. - - - - - 1-axis high-g accelerometer for motor characterization, capable of - +/- 50g using default part. - - - - - On-board, integrated GPS receiver with 5Hz update rate capability. - - - - - On-board 1 megabyte non-volatile memory for flight data storage. - - - - - USB interface for battery charging, configuration, and data recovery. - - - - - Fully integrated support for Li-Po rechargeable batteries. - - - - - Uses Li-Po to fire e-matches, can be modified to support - optional separate pyro battery if needed. - - - - - 2.75 x 1 inch board designed to fit inside 29mm air-frame coupler tube. - - - -
-
- - TeleMini v2.0 Specifications - - - - - Recording altimeter for model rocketry. - - - - - Supports dual deployment (can fire 2 ejection charges). - - - - - 70cm, 10mW ham-band transceiver for telemetry down-link. - - - - - Barometric pressure sensor good to 100k feet MSL. - - - - - On-board 1 megabyte non-volatile memory for flight data storage. - - - - - USB interface for configuration, and data recovery. - - - - - Support for Li-Po rechargeable batteries (using an - external charger), or any 3.7-15V external battery. - - - - - Uses Li-Po to fire e-matches, can be modified to support - optional separate pyro battery if needed. - - - - - 1.5 x .8 inch board designed to fit inside 24mm air-frame coupler tube. - - - -
-
- - TeleMini v1.0 Specifications - - - - - Recording altimeter for model rocketry. - - - - - Supports dual deployment (can fire 2 ejection charges). - - - - - 70cm, 10mW ham-band transceiver for telemetry down-link. - - - - - Barometric pressure sensor good to 45k feet MSL. - - - - - On-board 5 kilobyte non-volatile memory for flight data storage. - - - - - RF interface for configuration, and data recovery. - - - - - Support for Li-Po rechargeable batteries, using an external charger. - - - - - Uses Li-Po to fire e-matches, can be modified to support - optional separate pyro battery if needed. - - - - - 1.5 x .5 inch board designed to fit inside 18mm air-frame coupler tube. - - - -
-
- - EasyMini Specifications - - - - - Recording altimeter for model rocketry. - - - - - Supports dual deployment (can fire 2 ejection charges). - - - - - Barometric pressure sensor good to 100k feet MSL. - - - - - On-board 1 megabyte non-volatile memory for flight data storage. - - - - - USB interface for configuration, and data recovery. - - - - - Support for Li-Po rechargeable batteries (using an - external charger), or any 3.7-15V external battery. - - - - - Uses Li-Po to fire e-matches, can be modified to support - optional separate pyro battery if needed. - - - - - 1.5 x .8 inch board designed to fit inside 24mm air-frame coupler tube. - - - -
-
- - FAQ - - TeleMetrum seems to shut off when disconnected from the - computer. - Make sure the battery is adequately charged. Remember the - unit will pull more power than the USB port can deliver before the - GPS enters “locked” mode. The battery charges best when TeleMetrum - is turned off. - - - It's impossible to stop the TeleDongle when it's in “p” mode, I have - to unplug the USB cable? - Make sure you have tried to “escape out” of - this mode. If this doesn't work the reboot procedure for the - TeleDongle *is* to simply unplug it. 'cu' however will retain it's - outgoing buffer IF your “escape out” ('~~') does not work. - At this point using either 'ao-view' (or possibly - 'cutemon') instead of 'cu' will 'clear' the issue and allow renewed - communication. - - - The amber LED (on the TeleMetrum) lights up when both - battery and USB are connected. Does this mean it's charging? - - Yes, the yellow LED indicates the charging at the 'regular' rate. - If the led is out but the unit is still plugged into a USB port, - then the battery is being charged at a 'trickle' rate. - - - There are no “dit-dah-dah-dit” sound or lights like the manual - mentions? - That's the “pad” mode. Weak batteries might be the problem. - It is also possible that the 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. - - - How do I save flight data? - Live telemetry is written to file(s) whenever AltosUI is connected - to the TeleDongle. The file area defaults to ~/TeleMetrum - but is easily changed using the menus in AltosUI. The files that - are written end in '.telem'. The after-flight - data-dumped files will end in .eeprom and represent continuous data - unlike the .telem files that are subject to losses - along the RF data path. - See the above instructions on what and how to save the eeprom stored - data after physically retrieving your altimeter. Make sure to save - the on-board data after each flight; while the TeleMetrum can store - multiple flights, you never know when you'll lose the altimeter... - - - - Notes for Older Software - - - 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. - - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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): - - R = F / S * C - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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. - - - 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'. - - - 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. - - - 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. - - - 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'.) - - - 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.) - - - 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! - - - - Drill Templates - - These images, when printed, provide precise templates for the - mounting holes in Altus Metrum flight computers - -
- TeleMega template - - 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. - - - - - - - - -
-
- EasyMega template - - 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. - - - - - - - - -
-
- TeleMetrum template - - 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. - - - - - - - - -
-
- TeleMini v2/EasyMini template - - 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. - - - - - - - - -
-
- TeleMini v1 template - - 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. - - - - - - - - -
-
- - Calibration - - 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. - -
- Radio Frequency - - 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. - - - 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. - - - 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. - - - 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. - -
-
- TeleMetrum, TeleMega and EasyMega Accelerometers - - 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. - - - 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. - - - 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. - - - 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. - -
-
- - Igniter Current - - 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. - -
- Current Products - - 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. - - - Cutting to the chase, the Si7232DN specs are 25 amps continuous 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! - - - 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! - -
-
- Version 1 Products - - 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. - - - 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. - -
-
- - Release Notes - - Version 1.6.1 - - - - Version 1.6 - - - - Version 1.5 - - - - Version 1.4.1 - - - - Version 1.4 - - - - Version 1.3.2 - - - - Version 1.3.1 - - - - Version 1.3 - - - - Version 1.2.1 - - - - Version 1.2 - - - - Version 1.1.1 - - - - Version 1.1 - - - - Version 1.0.1 - - - - Version 0.9.2 - - - - Version 0.9 - - - - Version 0.8 - - - - Version 0.7.1 - - - -
- - diff --git a/doc/am-fo.xsl b/doc/am-fo.xsl new file mode 100644 index 00000000..2c36bec8 --- /dev/null +++ b/doc/am-fo.xsl @@ -0,0 +1,191 @@ + + + + + + + + + + + + +false + +left + + + + +12 + + pt + + + + + +10 1 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0pt + 0pt + 1pc + + + + + -1pc + 0pt + 0pt + + + + + + 0.75in + 0.75in + + + + + 0.5in + 0.5in + + + + + + + + + + + + + + + + + + + 12pt + bold + center + + + + 12pt + bold + center + + + + 0.5pt solid black + #EEEEEE + 50% + + + + 0.5pt solid black + 12pt + 4pt + + + + 9pt + + + + normal + #0080ff + + + + normal + #0080ff + + + + normal + #ff4040 + + + + normal + #0080ff + + + + solid + 1pt + silver + #ffffee + 12pt + 12pt + 6pt + 6pt + 0pt + 12pt + 6pt + 6pt + + + + + + + + #ffffff + inherit + + + + + + + auto + + + diff --git a/doc/am.css b/doc/am.css new file mode 100644 index 00000000..2461e111 --- /dev/null +++ b/doc/am.css @@ -0,0 +1,356 @@ +/* + CSS stylesheet for XHTML produced by DocBook XSL stylesheets. +*/ + +body { + font-family: "Frutiger LT Std 45 Light",sans-serif; + font-size: 14pt; +} + +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: #0080ff; +} + +a:visited { + color: #0080ff; +} + +h1, h2, h3, h4, h5, h6 +{ + color: #0080ff; + font-family: "Frutiger LT Std 45 Light",sans-serif; +} + +div.revhistory table { + width: 50%; + border-width: 1px; +} + +div titlepage { + margin-top: 100px; + border-top: 2px; +} + +div.toc p:first-child, +div.list-of-figures p:first-child, +div.list-of-tables p:first-child, +div.list-of-examples p:first-child, +div.example p.title, +div.sidebar p.title +{ + font-weight: normal; + color: #0080ff; + font-family: "Frutiger LT Std 45 Light",sans-serif; + margin-bottom: 0.2em; +} + +body h1 { + margin: .0em 0 0 -4%; + line-height: 1.3; + border-bottom: 2px solid silver; +} + +body h2 { + margin: 0.5em 0 0 -4%; + line-height: 1.3; + border-bottom: 2px solid silver; +} + +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 silver;goog +} + +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 silver; +} + +div.navheader th, div.navheader td, div.navfooter td { + font-family: "Frutiger LT Std 45 Light",sans-serif; + font-size: 14pt; + font-weight: normal; + color: #0080ff; +} +div.navheader img, div.navfooter img { + border-style: none; +} +div.navheader a, div.navfooter a { + font-weight: normal; +} +div.navfooter hr { + border: 1px solid silver; +} + +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 silver; + 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 silver; +} +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-style: normal; +} + +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; +} + +table { + border: none; +} + +div.revhistory { + border-style: none; +} + +div.revhistory table, th, td, tr { + margin-top: 1em; + border-width: 1px; + border-collapse: collapse; + border-top: 1px; + border-bottom: 1px; + border-left: 1px; + border-right: 1px; + border: 1px solid black; +} +div.revhistory th { + color: #0080ff; + font-family: "Frutiger LT Std 45 Light",sans-serif; +} + +/* 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 table, +div.informaltable table +{ + margin-left: 0; + margin-right: 5%; + margin-bottom: 0.8em; +} +div.informaltable table +{ + margin-top: 0.4em +} +div.table thead, +div.table tfoot, +div.table tbody, +div.informaltable thead, +div.informaltable tfoot, +div.informaltable tbody +{ + /* No effect in IE6. */ + border-top: 3px solid #527bbd; + border-bottom: 3px solid #527bbd; +} +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/common.xsl b/doc/common.xsl new file mode 100644 index 00000000..2e5cbc23 --- /dev/null +++ b/doc/common.xsl @@ -0,0 +1,106 @@ + + + + + + + + + + 1 + 0 + + + + + + +images/icons/ +0 + + + + 0 + #E0E0E0 + + + +images/icons/ + + + margin-left: 0; margin-right: 10%; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +article toc,title +book toc,title,figure,table,example,equation + + +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 + + + +article nop +book nop + + + + + diff --git a/doc/fonts/DejaVuSansMono-Bold.ttf b/doc/fonts/DejaVuSansMono-Bold.ttf new file mode 100644 index 00000000..1085a738 Binary files /dev/null and b/doc/fonts/DejaVuSansMono-Bold.ttf differ diff --git a/doc/fonts/DejaVuSansMono-BoldOblique.ttf b/doc/fonts/DejaVuSansMono-BoldOblique.ttf new file mode 100644 index 00000000..3175ebf2 Binary files /dev/null and b/doc/fonts/DejaVuSansMono-BoldOblique.ttf differ diff --git a/doc/fonts/DejaVuSansMono-Oblique.ttf b/doc/fonts/DejaVuSansMono-Oblique.ttf new file mode 100644 index 00000000..d5d6f92d Binary files /dev/null and b/doc/fonts/DejaVuSansMono-Oblique.ttf differ diff --git a/doc/fonts/DejaVuSansMono.ttf b/doc/fonts/DejaVuSansMono.ttf new file mode 100644 index 00000000..05e23457 Binary files /dev/null and b/doc/fonts/DejaVuSansMono.ttf differ diff --git a/doc/fonts/FrutigerLTStd-Italic.otf b/doc/fonts/FrutigerLTStd-Italic.otf new file mode 100644 index 00000000..c02ecd00 Binary files /dev/null and b/doc/fonts/FrutigerLTStd-Italic.otf differ diff --git a/doc/fonts/FrutigerLTStd-Light.otf b/doc/fonts/FrutigerLTStd-Light.otf new file mode 100644 index 00000000..6d013a61 Binary files /dev/null and b/doc/fonts/FrutigerLTStd-Light.otf differ diff --git a/doc/fonts/FrutigerLTStd-LightItalic.otf b/doc/fonts/FrutigerLTStd-LightItalic.otf new file mode 100644 index 00000000..70237778 Binary files /dev/null and b/doc/fonts/FrutigerLTStd-LightItalic.otf differ diff --git a/doc/fonts/FrutigerLTStd-Roman.otf b/doc/fonts/FrutigerLTStd-Roman.otf new file mode 100644 index 00000000..a6d6edbc Binary files /dev/null and b/doc/fonts/FrutigerLTStd-Roman.otf differ 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/fop.xconf b/doc/fop.xconf new file mode 100644 index 00000000..0f470ffd --- /dev/null +++ b/doc/fop.xconf @@ -0,0 +1,88 @@ + + + + + + + + + + . + + + 72 + + 72 + + + + + + + + + + + flate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/getting-started.inc b/doc/getting-started.inc new file mode 100644 index 00000000..8401f4d0 --- /dev/null +++ b/doc/getting-started.inc @@ -0,0 +1,85 @@ +== Getting Started + + The first thing to do after you open the box is to hook up a + battery and charge it if necessary. + + === Batteries + + 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. + 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. + + 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. + + [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. + ==== + + === 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). + + === 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 + + === 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. diff --git a/doc/handling.inc b/doc/handling.inc new file mode 100644 index 00000000..78d9133a --- /dev/null +++ b/doc/handling.inc @@ -0,0 +1,42 @@ +[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. + + 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/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/specs.inc b/doc/specs.inc new file mode 100644 index 00000000..0991bd2d --- /dev/null +++ b/doc/specs.inc @@ -0,0 +1,139 @@ +[appendix] +== Altus Metrum Hardware Specifications + + Here's the full set of Altus Metrum products, both in + production and retired. + + [options="header"] + |================================ + |Device | Barometer | Z-axis accel | GPS | 3D sensors | Storage | RF Output | Battery + + |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 + + |TeleMini v1.0 + |MP3H6115 10km (33k') + |- + |- + |- + |5kB + |10mW + |3.7V + + |TeleMini v2.0 + |MS5607 30km (100k') + |- + |- + |- + |1MB + |10mW + |3.7-12V + + |EasyMini v1.0 + |MS5607 30km (100k') + |- + |- + |- + |1MB + |- + |3.7-12V + + |TeleMega v1.0 + |MS5607 30km (100k') + |MMA6555 102g + |uBlox Max-7Q + |MPU6000 HMC5883 + |8MB + |40mW + |3.7V + + |EasyMega v1.0 + |MS5607 30km (100k') + |MMA6555 102g + |- + |MPU6000 HMC5883 + |8MB + |- + |3.7V + |============================== + + <<<< + [options="header",grid="all"] + |============================== + |Device|Connectors|Screw Terminals|Width|Length|Tube Size + + |TeleMetrum + |Antenna Debug Companion USB Battery + |Apogee pyro Main pyro Switch + |1 inch (2.54cm) + |2 ¾ inch (6.99cm) + |29mm coupler + + |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 + + |EasyMini + |Debug USB Battery + |Apogee pyro Main pyro Battery + |0.8 inch (2.03cm) + |1½ inch (3.81cm) + |24mm coupler + + |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 + + |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 + |==================================== diff --git a/doc/telemetrum.inc b/doc/telemetrum.inc new file mode 100644 index 00000000..9562d994 --- /dev/null +++ b/doc/telemetrum.inc @@ -0,0 +1,68 @@ +== TeleMetrum + + 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. + + === 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: + + [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/usage.inc b/doc/usage.inc new file mode 100644 index 00000000..b4a93271 --- /dev/null +++ b/doc/usage.inc @@ -0,0 +1,90 @@ +== 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] + + 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. + + === 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. The follow + the instructions that come with your active switch to + connect it up. + + === Using a Separate Pyro Battery + + 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. + + 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. + + === Using a Different Kind of Battery + + 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. -- cgit v1.2.3 From c5fd0eaa786a122580ba9a3ef7bfc0f2cfd8263b Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 29 Oct 2015 15:50:31 +0900 Subject: doc: Add asciidoc telemini v1.0 Signed-off-by: Keith Packard --- doc/Makefile | 9 +++++- doc/altusmetrum.txt | 2 ++ doc/telemini-v1.0.inc | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 doc/telemini-v1.0.inc diff --git a/doc/Makefile b/doc/Makefile index 6ebe829c..8095b5cf 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -62,7 +62,14 @@ PICTURES=\ telemini-v2-top.jpg TXT_FILES=altusmetrum.txt -INC_FILES=intro.inc getting-started.inc usage.inc telemetrum.inc handling.inc specs.inc +INC_FILES=\ + intro.inc \ + getting-started.inc \ + usage.inc \ + telemetrum.inc \ + telemini-v1.0.inc \ + handling.inc \ + specs.inc RAW_FILES=$(TXT_FILES:.txt=.raw) diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt index 5b6dfe81..08baa863 100644 --- a/doc/altusmetrum.txt +++ b/doc/altusmetrum.txt @@ -38,6 +38,8 @@ include::telemetrum.raw[] + include::telemini-v1.0.raw[] + include::handling.raw[] include::specs.raw[] diff --git a/doc/telemini-v1.0.inc b/doc/telemini-v1.0.inc new file mode 100644 index 00000000..7b9357e8 --- /dev/null +++ b/doc/telemini-v1.0.inc @@ -0,0 +1,90 @@ +== TeleMini v1.0 + + 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: + + [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. -- cgit v1.2.3 From adfbccfeb551c9d0315116912e7255a173fc3103 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 29 Oct 2015 16:49:00 +0900 Subject: doc: Lots more conversion from docbook to asciidoc Signed-off-by: Keith Packard --- doc/Makefile | 7 + doc/altusmetrum.txt | 14 + doc/easymega.inc | 121 +++++++ doc/easymini.inc | 86 +++++ doc/flight-data-recording.inc | 56 ++++ doc/installation.inc | 50 +++ doc/system-operation.inc | 730 ++++++++++++++++++++++++++++++++++++++++++ doc/telemega.inc | 121 +++++++ doc/telemini-v1.0.inc | 1 + doc/telemini-v2.0.inc | 89 +++++ 10 files changed, 1275 insertions(+) create mode 100644 doc/easymega.inc create mode 100644 doc/easymini.inc create mode 100644 doc/flight-data-recording.inc create mode 100644 doc/installation.inc create mode 100644 doc/system-operation.inc create mode 100644 doc/telemega.inc create mode 100644 doc/telemini-v2.0.inc diff --git a/doc/Makefile b/doc/Makefile index 8095b5cf..85011cfa 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -68,6 +68,13 @@ INC_FILES=\ usage.inc \ telemetrum.inc \ telemini-v1.0.inc \ + telemini-v2.0.inc \ + easymini.inc \ + telemega.inc \ + easymega.inc \ + installation.inc \ + system-operation.inc \ + flight-data-recording.inc \ handling.inc \ specs.inc diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt index 08baa863..82e456a0 100644 --- a/doc/altusmetrum.txt +++ b/doc/altusmetrum.txt @@ -40,8 +40,22 @@ include::telemini-v1.0.raw[] + include::telemini-v2.0.raw[] + + include::easymini.raw[] + + include::telemega.raw[] + + include::easymega.raw[] + + include::installation.raw[] + + include::system-operation.raw[] + include::handling.raw[] + include::flight-data-recording.raw[] + include::specs.raw[] [index] diff --git a/doc/easymega.inc b/doc/easymega.inc new file mode 100644 index 00000000..eebece92 --- /dev/null +++ b/doc/easymega.inc @@ -0,0 +1,121 @@ +== EasyMega + + 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: + + [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.inc b/doc/easymini.inc new file mode 100644 index 00000000..40cb3e1a --- /dev/null +++ b/doc/easymini.inc @@ -0,0 +1,86 @@ +== EasyMini + + 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. The connectors and + screw terminals match TeleMini v2.0, so you can easily swap between + EasyMini and TeleMini. + + === EasyMini Screw Terminals + + 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: + + [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 + |==== + + === 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 TeleMini + 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/flight-data-recording.inc b/doc/flight-data-recording.inc new file mode 100644 index 00000000..ed56b82e --- /dev/null +++ b/doc/flight-data-recording.inc @@ -0,0 +1,56 @@ +[appendix] +== Flight Data Recording + + 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. + + .Data Storage on Altus Metrum altimeters + [options="header",cols="1,1,1,1"] + |==== + |Device |Bytes per Sample |Total Storage |Minutes at Full Rate + |TeleMetrum v1.0 |8 |1MB |20 + |TeleMetrum v1.1 v1.2 |8 |2MB |40 + |TeleMetrum v2.0 |16 |8MB |80 + |TeleMini v1.0 |2 |5kB |4 + |TeleMini v2.0 |16 |1MB |10 + |EasyMini |16 |1MB |10 + |TeleMega |32 |8MB |40 + |EasyMega |32 |8MB |40 + |==== + + 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 + 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. + + 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. + + 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. + + 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/installation.inc b/doc/installation.inc new file mode 100644 index 00000000..44433298 --- /dev/null +++ b/doc/installation.inc @@ -0,0 +1,50 @@ +== 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. 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 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. + + 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. + + 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. + + 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. + + 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. diff --git a/doc/system-operation.inc b/doc/system-operation.inc new file mode 100644 index 00000000..1e57f247 --- /dev/null +++ b/doc/system-operation.inc @@ -0,0 +1,730 @@ +== 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. 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. + + 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. + + 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. + + .AltOS Modes + [options="border",cols="1,1,1,1"] + |==== + |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 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. + |==== + + 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. + 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. + + 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”) + + Here's a summary of all of the “pad” and “idle” mode indications. + + .Pad/Idle Indications + [options="header",cols="1,1,1"] + |==== + |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. + |==== + + 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. + + 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! + + 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. + + === 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. + + === 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. + + === Ground Testing + + 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! + + 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. + + === 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! + + === APRS + + 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. + + 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. + + 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 about the flight computer. It sends four fields as + shown in the following table. + + .Altus Metrum APRS Comments + [options="header",cols="1,1,1"] + |==== + |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 + + |4 + |A3.7 + |Apogee Igniter Voltage + + |5 + |M3.7 + |Main Igniter Voltage + + |6 + |1286 + |Device Serial Number + |==== + + 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 + .... + + 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. + + 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. + + === 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”. 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. + + ==== Radio Frequency + + 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. + + ==== Callsign + + 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. + + ==== Telemetry/RDF/APRS Enable + + You can completely disable the radio while in + flight, if necessary. This doesn't disable the + packet link in idle mode. + + ==== 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 + + 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. + + ==== APRS SSID + + 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. + + ==== Apogee Delay + + 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. + + 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. + + ==== 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. + + ==== Main Deployment Altitude + + 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. + + ==== Maximum Flight Log + + 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. + + Even though our flight computers (except TeleMini v1.0) can store + multiple flights, we strongly recommend downloading and saving + flight data after each flight. + + ==== Ignite Mode + + 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. + + 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. + + ==== Pad Orientation + + 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. + + ==== Configurable Pyro Channels + + 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: + + 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/telemega.inc b/doc/telemega.inc new file mode 100644 index 00000000..12db50d6 --- /dev/null +++ b/doc/telemega.inc @@ -0,0 +1,121 @@ +== TeleMega + + 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 Screw Terminals + + TeleMega has two sets of nine screw terminals on the end of + the board opposite the telemetry antenna. They are as follows: + + [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/telemini-v1.0.inc b/doc/telemini-v1.0.inc index 7b9357e8..11a2c9f9 100644 --- a/doc/telemini-v1.0.inc +++ b/doc/telemini-v1.0.inc @@ -28,6 +28,7 @@ [options="header",grid="all",cols="2,3,10"] |==== |Terminal #|Terminal Name|Description + |1 |Apogee - |Apogee pyro channel connection to pyro circuit diff --git a/doc/telemini-v2.0.inc b/doc/telemini-v2.0.inc new file mode 100644 index 00000000..63e6db5d --- /dev/null +++ b/doc/telemini-v2.0.inc @@ -0,0 +1,89 @@ +== TeleMini v2.0 + + image::telemini-v2-top.jpg[width="5.5in"] + + + 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. + + === TeleMini v2.0 Screw Terminals + + 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: + + [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 + |==== + + + === Using a Separate Pyro Battery with TeleMini v2.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. + + To connect the negative pyro battery terminal to TeleMini + 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 TeleMini v2.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 (top + terminal 1 for the Main charge, bottom terminal 1 for the + Apogee charge). + + === Using an Active Switch with TeleMini v2.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. 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. -- cgit v1.2.3 From 5ddf9525f94f38c20327d1f2b43917e43519b949 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 29 Oct 2015 18:14:38 -0700 Subject: doc: Add asciidoc version of altosui chapter. Signed-off-by: Keith Packard --- doc/Makefile | 3 + doc/altosui.inc | 962 +++++++++++++++++++++++++++++++++++++++++++++++ doc/altusmetrum.txt | 29 +- doc/dedication.inc | 26 ++ doc/easymini.inc | 23 ++ doc/pyro-channels.inc | 110 ++++++ doc/system-operation.inc | 116 +----- doc/telemini-v2.0.inc | 40 +- doc/usage.inc | 13 +- 9 files changed, 1172 insertions(+), 150 deletions(-) create mode 100644 doc/altosui.inc create mode 100644 doc/dedication.inc create mode 100644 doc/pyro-channels.inc diff --git a/doc/Makefile b/doc/Makefile index 85011cfa..b9f46196 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -63,6 +63,7 @@ PICTURES=\ TXT_FILES=altusmetrum.txt INC_FILES=\ + dedication.inc \ intro.inc \ getting-started.inc \ usage.inc \ @@ -73,7 +74,9 @@ INC_FILES=\ telemega.inc \ easymega.inc \ installation.inc \ + altosui.inc \ system-operation.inc \ + pyro-channels.inc \ flight-data-recording.inc \ handling.inc \ specs.inc diff --git a/doc/altosui.inc b/doc/altosui.inc new file mode 100644 index 00000000..8297c0a0 --- /dev/null +++ b/doc/altosui.inc @@ -0,0 +1,962 @@ +== 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. + + === Monitor Flight + //// + Receive, Record and Display Telemetry Data + //// + + 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 the 'Preload Maps' + section below. + + ==== 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. + + === Save Flight Data + + 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. + + 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. + + 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. Check + the Monitor Flight chapter above to learn how this window operates. + + === 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 + + 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 + + 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 + + image::graph-stats.png[width="5.5in"] + + Shows overall data computed from the 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. + + === 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. 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 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. + + ==== 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. + + === Configure Altimeter + + image::configure-altimeter.png[width="3.6in"] + + 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. + + 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. + + ==== 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. + + ==== 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. 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. + + ==== 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. + + ==== Callsign + + This sets the call sign included in each + telemetry packet. Set this as needed to + conform to your local radio regulations. + + ==== 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. + + ==== 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. + + ==== 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. + + ==== Configure Pyro Channels + + 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[] + + === Configure AltosUI + + image:configure-altosui.png[width="2.4in"] + + This button presents a dialog so that you can + configure the AltosUI global settings. + + ==== Voice Settings + + 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. + + 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 + + ==== Log Directory + + 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. + + 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. + + ==== 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 AltosUI + 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. + + ==== 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. + + ==== Font Size + + Selects the set of fonts used in the flight + monitor window. Choose between the small, + medium and large sets. + + ==== Serial Debug + + 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. + + ==== 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. + + === Configure Groundstation + + 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. + + === Flash Image + + 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. + + === Fire Igniter + + image::fire-igniter.png[width="1.2in"] + + 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. + + 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. + + === Scan Channels + + 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. + + === Load Maps + + 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. + + === Monitor Idle + + 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. diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt index 82e456a0..f631a31f 100644 --- a/doc/altusmetrum.txt +++ b/doc/altusmetrum.txt @@ -3,32 +3,7 @@ :doctype: book :numbered: - [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 + include::dedication.raw[] include::intro.raw[] @@ -50,6 +25,8 @@ include::installation.raw[] + include::altosui.raw[] + include::system-operation.raw[] include::handling.raw[] 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/easymini.inc b/doc/easymini.inc index 40cb3e1a..0714d7c3 100644 --- a/doc/easymini.inc +++ b/doc/easymini.inc @@ -52,6 +52,29 @@ |Switch connection to positive battery terminal |==== + === Connecting A Battery To TeleMini v2.0 + + 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 diff --git a/doc/pyro-channels.inc b/doc/pyro-channels.inc new file mode 100644 index 00000000..0da7db25 --- /dev/null +++ b/doc/pyro-channels.inc @@ -0,0 +1,110 @@ + +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/system-operation.inc b/doc/system-operation.inc index 1e57f247..bca1ee80 100644 --- a/doc/system-operation.inc +++ b/doc/system-operation.inc @@ -1,3 +1,4 @@ +[appendix] == System Operation === Firmware Modes @@ -34,7 +35,7 @@ long). “Brap” means a long dissonant tone. .AltOS Modes - [options="border",cols="1,1,1,1"] + [options="border",cols="1,1,2,2"] |==== |Mode Name |Abbreviation @@ -127,7 +128,7 @@ Here's a summary of all of the “pad” and “idle” mode indications. .Pad/Idle Indications - [options="header",cols="1,1,1"] + [options="header",cols="1,1,3"] |==== |Name |Beeps |Description @@ -619,112 +620,5 @@ to activate the channel. The conditions available are: - 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. + include::pyro-channels.raw[] + diff --git a/doc/telemini-v2.0.inc b/doc/telemini-v2.0.inc index 63e6db5d..0a6a7b2d 100644 --- a/doc/telemini-v2.0.inc +++ b/doc/telemini-v2.0.inc @@ -54,6 +54,28 @@ |Switch connection to positive battery terminal |==== + === Connecting A Battery To TeleMini v2.0 + + There are two possible battery connections on TeleMini + v2.0. 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 TeleMini v2.0 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 TeleMini v2.0 @@ -78,12 +100,12 @@ === Using an Active Switch with TeleMini v2.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. 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. + 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/usage.inc b/doc/usage.inc index b4a93271..cc694dda 100644 --- a/doc/usage.inc +++ b/doc/usage.inc @@ -23,6 +23,7 @@ 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 @@ -84,7 +85,11 @@ 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. + battery. + + [WARNING] + TeleMega, EasyMega and TeleMetrum are only designed to + use 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. -- cgit v1.2.3 From 41aca78e3f7c17433e3c77cd3c596bbf8acab7cb Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 29 Oct 2015 18:38:46 -0700 Subject: doc: Add asciidoc version of Altos Droid manual Signed-off-by: Keith Packard --- doc/Makefile | 1 + doc/altosdroid.inc | 369 ++++++++++++++++++++++++++++++++++++++++++++++++++++ doc/altusmetrum.txt | 2 + 3 files changed, 372 insertions(+) create mode 100644 doc/altosdroid.inc diff --git a/doc/Makefile b/doc/Makefile index b9f46196..818bd574 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -75,6 +75,7 @@ INC_FILES=\ easymega.inc \ installation.inc \ altosui.inc \ + altosdroid.inc \ system-operation.inc \ pyro-channels.inc \ flight-data-recording.inc \ 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/altusmetrum.txt b/doc/altusmetrum.txt index f631a31f..9f1bbf28 100644 --- a/doc/altusmetrum.txt +++ b/doc/altusmetrum.txt @@ -27,6 +27,8 @@ include::altosui.raw[] + include::altosdroid.raw[] + include::system-operation.raw[] include::handling.raw[] -- cgit v1.2.3 From 7ef958cbb51a04079e2a4833917ccef57ae5a2ee Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 29 Oct 2015 20:32:58 -0700 Subject: doc: Add updating firmware and using am products asciidoc bits This finishes the asciidoc transition Signed-off-by: Keith Packard --- doc/Makefile | 2 + doc/altusmetrum.txt | 4 + doc/pyro-channels.inc | 61 ++++----- doc/updating-firmware.inc | 342 ++++++++++++++++++++++++++++++++++++++++++++++ doc/using-am-products.inc | 148 ++++++++++++++++++++ 5 files changed, 521 insertions(+), 36 deletions(-) create mode 100644 doc/updating-firmware.inc create mode 100644 doc/using-am-products.inc diff --git a/doc/Makefile b/doc/Makefile index 818bd574..82ece0d5 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -74,6 +74,8 @@ INC_FILES=\ telemega.inc \ easymega.inc \ installation.inc \ + using-am-products.inc \ + updating-firmware.inc \ altosui.inc \ altosdroid.inc \ system-operation.inc \ diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt index 9f1bbf28..8dc18362 100644 --- a/doc/altusmetrum.txt +++ b/doc/altusmetrum.txt @@ -25,6 +25,8 @@ include::installation.raw[] + include::using-am-products.raw[] + include::altosui.raw[] include::altosdroid.raw[] @@ -33,6 +35,8 @@ include::handling.raw[] + include::updating-firmware.raw[] + include::flight-data-recording.raw[] include::specs.raw[] diff --git a/doc/pyro-channels.inc b/doc/pyro-channels.inc index 0da7db25..3b918544 100644 --- a/doc/pyro-channels.inc +++ b/doc/pyro-channels.inc @@ -47,30 +47,23 @@ pad and initialize the system. 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 +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 @@ -96,15 +89,11 @@ through a sequence of states: * 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. +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/updating-firmware.inc b/doc/updating-firmware.inc new file mode 100644 index 00000000..8b29558c --- /dev/null +++ b/doc/updating-firmware.inc @@ -0,0 +1,342 @@ +[appendix] +== Updating Device Firmware + + 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. + + 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/ + + 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. + + Self-programmable devices (TeleMega, TeleMetrum v2, EasyMega + and EasyMini) are reprogrammed by connecting them to your + computer over USB + + === Updating TeleMega, TeleMetrum v2, EasyMega, EasyMini or TeleDongle v3 Firmware + + . 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 + -v-.ihx, + such as TeleMega-v1.0-1.3.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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + === 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. + + ==== 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. diff --git a/doc/using-am-products.inc b/doc/using-am-products.inc new file mode 100644 index 00000000..8d7d005a --- /dev/null +++ b/doc/using-am-products.inc @@ -0,0 +1,148 @@ +== Using Altus Metrum Products + + === Being Legal + + First off, 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. + + + === 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. 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. + + 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. + + === On the Ground + + 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. + + 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. + + 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. + + 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. + + 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! + + 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. + + === 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 TeleMetrum data file 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 + + 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! + + 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! -- cgit v1.2.3 From 9aed128dc0aab5d49e1b3264c864a6c3e929bffe Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 31 Oct 2015 14:54:20 -0700 Subject: doc: Add titles to all figures Signed-off-by: Keith Packard --- doc/altosui.inc | 10 ++++++++++ doc/easymega.inc | 1 + doc/easymini.inc | 1 + doc/telemega.inc | 1 + doc/telemetrum.inc | 4 ++++ doc/telemini-v1.0.inc | 1 + doc/telemini-v2.0.inc | 2 +- 7 files changed, 19 insertions(+), 1 deletion(-) diff --git a/doc/altosui.inc b/doc/altosui.inc index 8297c0a0..fb034ad8 100644 --- a/doc/altosui.inc +++ b/doc/altosui.inc @@ -362,6 +362,7 @@ ==== Flight Graph + .Flight Data Graph image::graph.png[width="5.5in"] By default, the graph contains acceleration (blue), @@ -378,6 +379,7 @@ ==== Configure Graph + .Flight Graph Configuration image::graph-configure.png[width="5.5in"] This selects which graph elements to show, and, at the @@ -386,12 +388,14 @@ ==== Flight Statistics + .Flight Statistics image::graph-stats.png[width="5.5in"] Shows overall data computed from the flight. ==== Map + .Flight Map image::graph-map.png[width="5.5in"] Shows a satellite image of the flight area overlaid @@ -437,6 +441,7 @@ === Configure Altimeter + .Altimeter Configuration image::configure-altimeter.png[width="3.6in"] Select this button and then select either an altimeter or @@ -638,6 +643,7 @@ ==== Configure Pyro Channels + .Additional Pyro Channel Configuration image::configure-pyro.png[width="5.5in"] This opens a separate window to configure the @@ -845,6 +851,7 @@ === Fire Igniter + .Fire Igniter Window image::fire-igniter.png[width="1.2in"] This activates the igniter circuits in the flight @@ -872,6 +879,7 @@ === Scan Channels + .Scan Channels Window image::scan-channels.png[width="3.2in"] This listens for telemetry packets on all of the @@ -884,6 +892,7 @@ === Load Maps + .Load Maps Window image::load-maps.png[width="5.2in"] Before heading out to a new launch site, you can use @@ -944,6 +953,7 @@ === Monitor Idle + .Monitor Idle Window image::monitor-idle.png[width="5.2in"] This brings up a dialog similar to the Monitor Flight diff --git a/doc/easymega.inc b/doc/easymega.inc index eebece92..f6c06431 100644 --- a/doc/easymega.inc +++ b/doc/easymega.inc @@ -1,5 +1,6 @@ == EasyMega + .EasyMega Board image::easymega-v1.0-top.jpg[width="4.5in"] EasyMega is a 1¼ inch by 2¼ inch circuit board. It was diff --git a/doc/easymini.inc b/doc/easymini.inc index 0714d7c3..a7f06c01 100644 --- a/doc/easymini.inc +++ b/doc/easymini.inc @@ -1,5 +1,6 @@ == 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 diff --git a/doc/telemega.inc b/doc/telemega.inc index 12db50d6..fcfd8d8e 100644 --- a/doc/telemega.inc +++ b/doc/telemega.inc @@ -1,5 +1,6 @@ == TeleMega + .TeleMega Board image::telemega-v1.0-top.jpg[width="5.5in"] TeleMega is a 1¼ inch by 3¼ inch circuit board. It was diff --git a/doc/telemetrum.inc b/doc/telemetrum.inc index 9562d994..54185bff 100644 --- a/doc/telemetrum.inc +++ b/doc/telemetrum.inc @@ -1,5 +1,9 @@ == 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 diff --git a/doc/telemini-v1.0.inc b/doc/telemini-v1.0.inc index 11a2c9f9..ea70ac2a 100644 --- a/doc/telemini-v1.0.inc +++ b/doc/telemini-v1.0.inc @@ -1,5 +1,6 @@ == 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 diff --git a/doc/telemini-v2.0.inc b/doc/telemini-v2.0.inc index 0a6a7b2d..bd6756a8 100644 --- a/doc/telemini-v2.0.inc +++ b/doc/telemini-v2.0.inc @@ -1,7 +1,7 @@ == TeleMini v2.0 + .TeleMini v2.0 Board image::telemini-v2-top.jpg[width="5.5in"] - TeleMini v2.0 is 0.8 inches by 1½ inches. It adds more on-board data logging memory, a built-in USB connector and -- cgit v1.2.3 From ce297f14ff54d230d01fb6dedaafca571e8b836b Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 31 Oct 2015 21:34:42 -0700 Subject: doc: Finish converting docs to asciidoc format Signed-off-by: Keith Packard --- doc/Makefile | 142 ++-- doc/altusmetrum-docinfo.xml | 14 + doc/altusmetrum.txt | 4 +- doc/am-fo.xsl | 3 + doc/easymega-outline.txt | 9 + doc/easymega-outline.xsl | 23 - doc/easymini-outline.txt | 9 + doc/easymini-outline.xsl | 23 - doc/handling.inc | 1 + doc/micropeak-docinfo.xml | 68 ++ doc/micropeak.txt | 497 +++++++++++ doc/micropeak.xsl | 736 ---------------- doc/release-notes-0.7.1-docinfo.xml | 29 + doc/release-notes-0.7.1.inc | 53 ++ doc/release-notes-0.7.1.xsl | 71 -- doc/release-notes-0.8-docinfo.xml | 29 + doc/release-notes-0.8.inc | 47 ++ doc/release-notes-0.8.xsl | 70 -- doc/release-notes-0.9-docinfo.xml | 29 + doc/release-notes-0.9.2-docinfo.xml | 29 + doc/release-notes-0.9.2.inc | 18 + doc/release-notes-0.9.2.xsl | 26 - doc/release-notes-0.9.inc | 31 + doc/release-notes-0.9.xsl | 37 - doc/release-notes-1.0.1-docinfo.xml | 29 + doc/release-notes-1.0.1.inc | 100 +++ doc/release-notes-1.0.1.xsl | 127 --- doc/release-notes-1.1-docinfo.xml | 29 + doc/release-notes-1.1.1-docinfo.xml | 29 + doc/release-notes-1.1.1.inc | 57 ++ doc/release-notes-1.1.1.xsl | 71 -- doc/release-notes-1.1.inc | 92 ++ doc/release-notes-1.1.xsl | 131 --- doc/release-notes-1.2-docinfo.xml | 29 + doc/release-notes-1.2.1-docinfo.xml | 29 + doc/release-notes-1.2.1.inc | 77 ++ doc/release-notes-1.2.1.xsl | 107 --- doc/release-notes-1.2.inc | 32 + doc/release-notes-1.2.xsl | 51 -- doc/release-notes-1.3-docinfo.xml | 29 + doc/release-notes-1.3.1-docinfo.xml | 29 + doc/release-notes-1.3.1.inc | 55 ++ doc/release-notes-1.3.1.xsl | 71 -- doc/release-notes-1.3.2-docinfo.xml | 29 + doc/release-notes-1.3.2.inc | 37 + doc/release-notes-1.3.2.xsl | 54 -- doc/release-notes-1.3.inc | 57 ++ doc/release-notes-1.3.xsl | 81 -- doc/release-notes-1.4-docinfo.xml | 29 + doc/release-notes-1.4.1-docinfo.xml | 29 + doc/release-notes-1.4.1.inc | 34 + doc/release-notes-1.4.1.xsl | 54 -- doc/release-notes-1.4.2-docinfo.xml | 29 + doc/release-notes-1.4.2.inc | 15 + doc/release-notes-1.4.inc | 125 +++ doc/release-notes-1.4.xsl | 204 ----- doc/release-notes-1.5-docinfo.xml | 29 + doc/release-notes-1.5.inc | 69 ++ doc/release-notes-1.5.xsl | 121 --- doc/release-notes-1.6-docinfo.xml | 29 + doc/release-notes-1.6.1-docinfo.xml | 29 + doc/release-notes-1.6.1.inc | 101 +++ doc/release-notes-1.6.1.xsl | 189 ----- doc/release-notes-1.6.inc | 85 ++ doc/release-notes-1.6.xsl | 142 ---- doc/release-notes-docinfo.xml | 28 + doc/release-notes.inc | 75 ++ doc/system-operation.inc | 2 +- doc/telegps-application.inc | 569 +++++++++++++ doc/telegps-docinfo.xml | 73 ++ doc/telegps-quick-start.inc | 24 + doc/telegps-release-notes.inc | 25 + doc/telegps-specs.inc | 29 + doc/telegps-system-operation.inc | 149 ++++ doc/telegps-updating-firmware.inc | 43 + doc/telegps-using.inc | 81 ++ doc/telegps.txt | 21 + doc/telegps.xsl | 1338 ----------------------------- doc/telemega-outline.txt | 9 + doc/telemega-outline.xsl | 23 - doc/telemetrum-outline.txt | 9 + doc/telemetrum-outline.xsl | 23 - doc/telemetrum-v2.0-th.jpg | Bin 0 -> 2625456 bytes doc/telemetrum.inc | 12 + doc/telemini-outline.txt | 9 + doc/telemini.pdf | Bin 4183 -> 0 bytes doc/titlepage.templates.tmpl | 1583 +++++++++++++++++++++++++++++++++++ doc/titlepage.templates.xml | 1580 ---------------------------------- doc/updating-firmware.inc | 21 +- doc/xorg-fo.xsl | 121 --- 90 files changed, 5045 insertions(+), 5545 deletions(-) create mode 100644 doc/easymega-outline.txt delete mode 100644 doc/easymega-outline.xsl create mode 100644 doc/easymini-outline.txt delete mode 100644 doc/easymini-outline.xsl create mode 100644 doc/micropeak-docinfo.xml create mode 100644 doc/micropeak.txt delete mode 100644 doc/micropeak.xsl create mode 100644 doc/release-notes-0.7.1-docinfo.xml create mode 100644 doc/release-notes-0.7.1.inc delete mode 100644 doc/release-notes-0.7.1.xsl create mode 100644 doc/release-notes-0.8-docinfo.xml create mode 100644 doc/release-notes-0.8.inc delete mode 100644 doc/release-notes-0.8.xsl create mode 100644 doc/release-notes-0.9-docinfo.xml create mode 100644 doc/release-notes-0.9.2-docinfo.xml create mode 100644 doc/release-notes-0.9.2.inc delete mode 100644 doc/release-notes-0.9.2.xsl create mode 100644 doc/release-notes-0.9.inc delete mode 100644 doc/release-notes-0.9.xsl create mode 100644 doc/release-notes-1.0.1-docinfo.xml create mode 100644 doc/release-notes-1.0.1.inc delete mode 100644 doc/release-notes-1.0.1.xsl create mode 100644 doc/release-notes-1.1-docinfo.xml create mode 100644 doc/release-notes-1.1.1-docinfo.xml create mode 100644 doc/release-notes-1.1.1.inc delete mode 100644 doc/release-notes-1.1.1.xsl create mode 100644 doc/release-notes-1.1.inc delete mode 100644 doc/release-notes-1.1.xsl create mode 100644 doc/release-notes-1.2-docinfo.xml create mode 100644 doc/release-notes-1.2.1-docinfo.xml create mode 100644 doc/release-notes-1.2.1.inc delete mode 100644 doc/release-notes-1.2.1.xsl create mode 100644 doc/release-notes-1.2.inc delete mode 100644 doc/release-notes-1.2.xsl create mode 100644 doc/release-notes-1.3-docinfo.xml create mode 100644 doc/release-notes-1.3.1-docinfo.xml create mode 100644 doc/release-notes-1.3.1.inc delete mode 100644 doc/release-notes-1.3.1.xsl create mode 100644 doc/release-notes-1.3.2-docinfo.xml create mode 100644 doc/release-notes-1.3.2.inc delete mode 100644 doc/release-notes-1.3.2.xsl create mode 100644 doc/release-notes-1.3.inc delete mode 100644 doc/release-notes-1.3.xsl create mode 100644 doc/release-notes-1.4-docinfo.xml create mode 100644 doc/release-notes-1.4.1-docinfo.xml create mode 100644 doc/release-notes-1.4.1.inc delete mode 100644 doc/release-notes-1.4.1.xsl create mode 100644 doc/release-notes-1.4.2-docinfo.xml create mode 100644 doc/release-notes-1.4.2.inc create mode 100644 doc/release-notes-1.4.inc delete mode 100644 doc/release-notes-1.4.xsl create mode 100644 doc/release-notes-1.5-docinfo.xml create mode 100644 doc/release-notes-1.5.inc delete mode 100644 doc/release-notes-1.5.xsl create mode 100644 doc/release-notes-1.6-docinfo.xml create mode 100644 doc/release-notes-1.6.1-docinfo.xml create mode 100644 doc/release-notes-1.6.1.inc delete mode 100644 doc/release-notes-1.6.1.xsl create mode 100644 doc/release-notes-1.6.inc delete mode 100644 doc/release-notes-1.6.xsl create mode 100644 doc/release-notes-docinfo.xml create mode 100644 doc/release-notes.inc create mode 100644 doc/telegps-application.inc create mode 100644 doc/telegps-docinfo.xml create mode 100644 doc/telegps-quick-start.inc create mode 100644 doc/telegps-release-notes.inc create mode 100644 doc/telegps-specs.inc create mode 100644 doc/telegps-system-operation.inc create mode 100644 doc/telegps-updating-firmware.inc create mode 100644 doc/telegps-using.inc create mode 100644 doc/telegps.txt delete mode 100644 doc/telegps.xsl create mode 100644 doc/telemega-outline.txt delete mode 100644 doc/telemega-outline.xsl create mode 100644 doc/telemetrum-outline.txt delete mode 100644 doc/telemetrum-outline.xsl create mode 100644 doc/telemetrum-v2.0-th.jpg create mode 100644 doc/telemini-outline.txt delete mode 100644 doc/telemini.pdf create mode 100644 doc/titlepage.templates.tmpl delete mode 100644 doc/titlepage.templates.xml delete mode 100644 doc/xorg-fo.xsl diff --git a/doc/Makefile b/doc/Makefile index 82ece0d5..df1a884c 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,24 +2,25 @@ # 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 +RELNOTES_INC=\ + release-notes-0.7.1.inc \ + release-notes-0.8.inc \ + release-notes-0.9.inc \ + release-notes-0.9.2.inc \ + release-notes-1.0.1.inc \ + release-notes-1.1.inc \ + release-notes-1.1.1.inc \ + release-notes-1.2.inc \ + release-notes-1.2.1.inc \ + release-notes-1.3.inc \ + release-notes-1.3.1.inc \ + release-notes-1.3.2.inc \ + release-notes-1.4.inc \ + release-notes-1.4.1.inc \ + release-notes-1.4.2.inc \ + release-notes-1.5.inc \ + release-notes-1.6.inc \ + release-notes-1.6.1.inc PICTURES=\ altosui.png \ @@ -62,6 +63,7 @@ PICTURES=\ telemini-v2-top.jpg TXT_FILES=altusmetrum.txt + INC_FILES=\ dedication.inc \ intro.inc \ @@ -82,13 +84,45 @@ INC_FILES=\ pyro-channels.inc \ flight-data-recording.inc \ handling.inc \ - specs.inc + specs.inc \ + release-notes.inc \ + $(RELNOTES_INC) + +RAW_FILES=$(TXT_FILES:.txt=.raw) $(INC_FILES:.inc=.raw) + +TELEGPS_INC_FILES=\ + dedication.inc \ + telegps-quick-start.inc \ + telegps-using.inc \ + telegps-system-operation.inc \ + telegps-application.inc \ + handling.inc \ + telegps-specs.inc \ + telegps-updating-firmware.inc \ + telegps-release-notes.inc + +TELEGPS_TXT_FILES=\ + telegps.txt + +TELEGPS_RAW_FILES=$(TELEGPS_TXT_FILES:.txt=.raw) $(TELEGPS_INC_FILES:.inc=.raw) -RAW_FILES=$(TXT_FILES:.txt=.raw) +MICROPEAK_TXT_FILES=\ + micropeak.txt -RAW_INC=$(INC_FILES:.inc=.raw) +MICROPEAK_INC_FILES= -AD_PDF=$(TXT_FILES:.txt=.pdf) +MICROPEAK_RAW_FILES=$(MICROPEAK_TXT_FILES:.txt=.raw) $(MICROPEAK_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 \ @@ -97,19 +131,25 @@ 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 $(AD_PDF) -HTMLSTYLE=/usr/share/xml/docbook/stylesheet/docbook-xsl/html/docbook.xsl +RELNOTES_PDF=$(RELNOTES_INC:.inc=.pdf) +RELNOTES_HTML=$(RELNOTES_INC:.inc=.html) + +HTML=altusmetrum.html altos.html telemetry.html companion.html micropeak.html telegps.html $(RELNOTES_HTML) + +PDF=altusmetrum.pdf $(RELNOTES_PDF) altos.pdf telemetry.pdf companion.pdf micropeak.pdf telegps.pdf \ + $(OUTLINE_PDF_FILES) + FOSTYLE=xorg-fo.xsl -FOPCFG=fop-cfg.xml -TEMPLATES=titlepage.templates.xsl -PDFSTYLE= + +TEMPLATES_TMPL=titlepage.templates.tmpl + +TEMPLATES_XSL=$(TEMPLATES_TMPL:.tmpl=.xsl) + IMAGES=$(PICTURES) $(SVG) + DOC=$(HTML) $(PDF) $(IMAGES) -.SUFFIXES: .inc .txt .raw .pdf .html +.SUFFIXES: .tmpl .xsl .inc .txt .raw .pdf .html XSLTFLAGS=--stringparam section.autolabel 1 --xinclude @@ -120,23 +160,23 @@ XSLTFLAGS=--stringparam section.autolabel 1 --xinclude sed -e 's/@@VERSION@@/$(VERSION)/' -e 's/@@DATE@@/$(DATE)/' -e 's/^[ ]*//' -e 's/^\\//' $*.inc > $@ .raw.pdf: - a2x --verbose -k -d book -a docinfo -f pdf --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file am-fo.xsl --fop --fop-opts="-c fop.xconf" $*.raw + a2x --verbose -a docinfo -f pdf --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file am-fo.xsl --fop --fop-opts="-c fop.xconf" $*.raw .raw.html: - a2x --verbose -k -d book -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --stylesheet=am.css $*.raw + a2x --verbose -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --stylesheet=am.css $*.raw -.xsl.html: - xsltproc $(XSLTFLAGS) -o $@ $(HTMLSTYLE) $*.xsl +.tmpl.xsl: + xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.tmpl -.xsl.pdf: - xmlto -p '-c $(FOPCFG)' --searchpath `pwd` -x $(FOSTYLE) --with-fop pdf $*.xsl +all: $(HTML) $(PDF) -.xml.xsl: - xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.xml +$(HTML): $(PDF) -all: $(HTML) $(PDF) +altusmetrum.pdf altusmetrum.html: altusmetrum-docinfo.xml $(RAW_FILES) $(RAW_INC) $(IMAGES) -altusmetrum.pdf: altusmetrum-docinfo.xml $(RAW_FILES) $(RAW_INC) +telegps.html telegps.pdf: telegps-docinfo.xml $(TELEGPS_RAW_FILES) $(IMAGES) + +micropeak.pdf micropeak.html: micropeak-docinfo.xml $(MICROPEAK_RAW_FILES) $(IMAGES) install: all @@ -149,22 +189,10 @@ publish: $(DOC) git push) clean: - rm -f $(HTML) $(PDF) $(TEMPLATES) + rm -f $(HTML) $(PDF) $(TEMPLATES_XSL) -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) $(FOPCFG) - -indent: altusmetrum.xsl - xmlindent -i 2 < altusmetrum.xsl > altusmetrum.new - -$(FOPCFG): Makefile - (echo ''; echo ' '"`pwd`"''; echo '') > $@ - +$(PDF): $(FOSTYLE) $(TEMPLATES_XSL) +$(HTML): $(TEMPLATES_XSL) diff --git a/doc/altusmetrum-docinfo.xml b/doc/altusmetrum-docinfo.xml index 05815f5a..19c1e5d9 100644 --- a/doc/altusmetrum-docinfo.xml +++ b/doc/altusmetrum-docinfo.xml @@ -2,10 +2,12 @@ Bdale Garbee + bdale@gag.com Keith Packard + keithp@keithp.com Bob @@ -55,6 +57,13 @@ Major release adding EasyMega support. + + 1.4.2 + 17 August 2014 + + Minor release fixing some Windows installation bugs. + + 1.4.1 20 June 2014 @@ -150,4 +159,9 @@ 24 November 2010 Updated for software version 0.8 + + 0.7.1 + 29 September 2010 + Added AltosUI + diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt index 8dc18362..a2f78dda 100644 --- a/doc/altusmetrum.txt +++ b/doc/altusmetrum.txt @@ -1,5 +1,4 @@ = The Altus Metrum System - :doctype: book :numbered: @@ -41,5 +40,4 @@ include::specs.raw[] - [index] - == Index + include::release-notes.raw[] diff --git a/doc/am-fo.xsl b/doc/am-fo.xsl index 2c36bec8..35279f22 100644 --- a/doc/am-fo.xsl +++ b/doc/am-fo.xsl @@ -18,6 +18,9 @@ + + + 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 @@ - - -
- EasyMega Outline and Hole Pattern - - 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. - - - - - - - - -
- - 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 @@ - - -
- EasyMini Outline and Hole Pattern - - 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. - - - - - - - - -
- - diff --git a/doc/handling.inc b/doc/handling.inc index 78d9133a..7565996a 100644 --- a/doc/handling.inc +++ b/doc/handling.inc @@ -6,6 +6,7 @@ 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 diff --git a/doc/micropeak-docinfo.xml b/doc/micropeak-docinfo.xml new file mode 100644 index 00000000..b401a193 --- /dev/null +++ b/doc/micropeak-docinfo.xml @@ -0,0 +1,68 @@ +A recording altimeter for hobby rocketry + + Keith + Packard + keithp@keithp.com + + + 2014 + Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + + + + 1.3.2 + 12 February 2014 + + 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. + + + + 1.2 + 20 January 2013 + + Add documentation for the MicroPeak USB adapter board. Note + the switch to a Kalman filter for peak altitude + determination. + + + + 1.1 + 12 December 2012 + + Add comments about EEPROM storage format and programming jig. + + + + 1.0 + 18 November 2012 + + Updates for version 1.0 release. + + + + 0.1 + 29 October 2012 + + Initial release with preliminary hardware. + + + diff --git a/doc/micropeak.txt b/doc/micropeak.txt new file mode 100644 index 00000000..d62e4633 --- /dev/null +++ b/doc/micropeak.txt @@ -0,0 +1,497 @@ += 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"] + + 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"] + + * Click on the Download button at the top of the + window. + + .MicroPeak Application + image::micropeak-app.png[width="4.5in"] + + * Select from the listed devices. There will probably + be only one. + + .MicroPeak Device Dialog + image::micropeak-device-dialog.png[width="2.3in"] + + * The application will now wait until it receives + valid data from the MicroPeak USB adapter. + + .MicroPeak Download Dialog + image::micropeak-download.png[width="2in"] + + * 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"] + + * 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"] + + * 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. + + === 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"] + + 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"] + + 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"] + + 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"] + + 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"] + + 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 @@ - - - - MicroPeak Owner's Manual - A recording altimeter for hobby rocketry - - - Keith - Packard - - - 2014 - Bdale Garbee and Keith Packard - - - - - - - - - This document is released under the terms of the - - Creative Commons ShareAlike 3.0 - - license. - - - - - 0.1 - 29 October 2012 - - Initial release with preliminary hardware. - - - - 1.0 - 18 November 2012 - - Updates for version 1.0 release. - - - - 1.1 - 12 December 2012 - - Add comments about EEPROM storage format and programming jig. - - - - 1.2 - 20 January 2013 - - Add documentation for the MicroPeak USB adapter board. Note - the switch to a Kalman filter for peak altitude - determination. - - - - 1.3.2 - 12 February 2014 - - 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. - - - - - - 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. - -Bdale Garbee, KB0G -NAR #87103, TRA #12201 - -Keith Packard, KD7SQG -NAR #88757, TRA #12200 - - - - - Quick Start Guide - - 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. - - - - - - - - - - - - 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. - - - - - - 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. - - - 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. - - - - The MicroPeak USB adapter - - - - - - - - - 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 - . - - - 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 . - -
-
- Downloading Micro Peak data - - - - Plug the MicroPeak USB adapter in to your computer. - - - - - - Start the MicroPeak application. - - - - - - - - - - - - - Click on the Download button at the top of the window. - - - - - - - - - - - - - Select from the listed devices. There will probably be - only one. - - - - - - - - - - - - The application will now wait until it receives valid data - from the MicroPeak USB adapter. - - - - - - - - - - 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. - - - - - - - - - - - - - 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. - - - - - - - - - - - - - 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. - - - -
-
- 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 - - 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 - - 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 Data - - A table consisting of the both the raw barometric pressure - data and values computed from that for each recorded time. - - - - - - - - -
-
- Configuring the Graph - - This selects which graph elements to show, and lets you - switch between metric and imperial units - - - - - - - - -
-
-
- Setting MicroPeak Preferences - - - - - - - - - The MicroPeak application has a few user settings which are - configured through the Preferences dialog, which can be - accessed from the File menu. - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - -
-
- - 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. - -
-
- 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 - - - - - - - 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. - -
-
- 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. - -
-
-
- 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..71bc3180 --- /dev/null +++ b/doc/release-notes-0.7.1-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +29 September 2010 + + 2010 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- -Version 0.7.1 is the first release containing our new cross-platform Java-based user interface. AltosUI can: - - - - - 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.8-docinfo.xml b/doc/release-notes-0.8-docinfo.xml new file mode 100644 index 00000000..d06249f5 --- /dev/null +++ b/doc/release-notes-0.8-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +24 November 2010 + + 2010 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - Version 0.8 offers a major upgrade in the AltosUI - interface. Significant new features include: - - - - - 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.9-docinfo.xml b/doc/release-notes-0.9-docinfo.xml new file mode 100644 index 00000000..0602cb02 --- /dev/null +++ b/doc/release-notes-0.9-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +18 January 2011 + + 2011 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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..ec1e4482 --- /dev/null +++ b/doc/release-notes-0.9.2-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +19 March 2011 + + 2011 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - Version 0.9.2 is an AltosUI bug-fix release, with no firmware changes. - - - - - 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.inc b/doc/release-notes-0.9.inc new file mode 100644 index 00000000..66810e5d --- /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 @@ - - - -
- - Version 0.9 adds a few new firmware features and accompanying - AltosUI changes, along with new hardware support. - - - - - 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. - - - -
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..95a7681d --- /dev/null +++ b/doc/release-notes-1.0.1-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +24 August 2011 + + 2011 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - Version 1.0.1 is a major release, adding support for the TeleMini - device and lots of new AltosUI features - - - AltOS Firmware Changes - - - - Add TeleMini v1.0 support. Firmware images for TeleMini are - included in AltOS releases. - - - - - 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. - - - - - 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. - - - - - 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 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. - - - - - 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. - - - - -
diff --git a/doc/release-notes-1.1-docinfo.xml b/doc/release-notes-1.1-docinfo.xml new file mode 100644 index 00000000..032a06c5 --- /dev/null +++ b/doc/release-notes-1.1-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +13 September 2012 + + 2013 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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..4c2c8b1c --- /dev/null +++ b/doc/release-notes-1.1.1-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +16 September 2012 + + 2012 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - 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 Firmware Changes - - - - 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 Changes - - - - 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. - - - - - 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. - - - - - 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.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 @@ - - - -
- - Version 1.1 is a minor release. It provides a few new features in AltosUI - and the AltOS firmware and fixes bugs. - - - AltOS Firmware Changes - - - - Add apogee-lockout value. Overrides the apogee detection logic to - prevent incorrect apogee charge firing. - - - - - Fix a bug where the data reported in telemetry packets was - from 320ms ago. - - - - - 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. - - - - - 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 Changes - - - - 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. - - - - - 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. - - - - - 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. - - - - - Add Imperial units mode to present data in feet instead of - meters. - - - - -
diff --git a/doc/release-notes-1.2-docinfo.xml b/doc/release-notes-1.2-docinfo.xml new file mode 100644 index 00000000..f35f033d --- /dev/null +++ b/doc/release-notes-1.2-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +18 April 2013 + + 2013 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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..968c0434 --- /dev/null +++ b/doc/release-notes-1.2.1-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +21 May 2013 + + 2013 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - 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 Firmware Changes - - - - Add support for TeleBT - - - - - 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). - - - - - Add support for reflashing the SkyTraq GPS chips. This - requires special host-side code which currently only exists - for Linux. - - - - - 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 Changes - - - - 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. - - - - - 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 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. - - - - - 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. - - - - -
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 @@ - - - -
- - Version 1.2 is a major release. It adds support for MicroPeak and - the MicroPeak USB adapter. - - - AltOS Firmware Changes - - - - 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. - - - - - - MicroPeak UI changes - - - - Added this new application - - - - - - Distribution Changes - - - - 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.3-docinfo.xml b/doc/release-notes-1.3-docinfo.xml new file mode 100644 index 00000000..b10fd9dd --- /dev/null +++ b/doc/release-notes-1.3-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +12 November 2013 + + 2013 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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..52264773 --- /dev/null +++ b/doc/release-notes-1.3.1-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +21 January 2014 + + 2014 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - Version 1.3.1 is a minor release. It improves support for TeleMega, - TeleMetrum v2.0, TeleMini v2.0 and EasyMini. - - - AltOS Firmware Changes - - - - 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. - - - - - 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. - - - - - - AltosUI changes - - - - 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. - - - - - 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.2-docinfo.xml b/doc/release-notes-1.3.2-docinfo.xml new file mode 100644 index 00000000..f55aef04 --- /dev/null +++ b/doc/release-notes-1.3.2-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +24 January 2014 + + 2014 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - Version 1.3.2 is a minor release. It includes small bug fixes for - the TeleMega flight software and AltosUI ground station - - - AltOS Firmware Changes - - - - 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 changes - - - - 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.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 @@ - - - -
- - Version 1.3 is a major release. It adds support for TeleMega, - TeleMetrum v2.0, TeleMini v2.0 and EasyMini. - - - AltOS Firmware Changes - - - - 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 changes - - - - Support TeleMega, TeleMetrum v2.0, TeleMini v2.0 and EasyMini telemetry and log formats. - - - - - Use preferred units for main deployment height configuration, - instead of always doing configuration in meters. - - - - - - MicroPeak UI changes - - - - 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.4-docinfo.xml b/doc/release-notes-1.4-docinfo.xml new file mode 100644 index 00000000..216c0ae3 --- /dev/null +++ b/doc/release-notes-1.4-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +15 June 2014 + + 2014 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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..d87052f7 --- /dev/null +++ b/doc/release-notes-1.4.1-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +20 June 2014 + + 2014 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - 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. - - - 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.2-docinfo.xml b/doc/release-notes-1.4.2-docinfo.xml new file mode 100644 index 00000000..4b4f7b21 --- /dev/null +++ b/doc/release-notes-1.4.2-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +17 August 2014 + + 2014 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - 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 New Features - - - - Add support for TeleGPS boards. - - - - - 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. - - - - - 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 - - - - 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 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. - - - - - Increase the width of data lines in the graphs to make them - easier to read. - - - - - 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. - - - - - 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 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.5-docinfo.xml b/doc/release-notes-1.5-docinfo.xml new file mode 100644 index 00000000..3d018630 --- /dev/null +++ b/doc/release-notes-1.5-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +6 September 2014 + + 2014 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - 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 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 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.6-docinfo.xml b/doc/release-notes-1.6-docinfo.xml new file mode 100644 index 00000000..760d5e60 --- /dev/null +++ b/doc/release-notes-1.6-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +8 January 2015 + + 2015 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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..1b27b79a --- /dev/null +++ b/doc/release-notes-1.6.1-docinfo.xml @@ -0,0 +1,29 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +15 July 2015 + + 2015 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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 @@ - - - -
- - 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 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 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 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 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.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 @@ - - - -
- - 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 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 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-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 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + + + 2015 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + diff --git a/doc/release-notes.inc b/doc/release-notes.inc new file mode 100644 index 00000000..70653ed9 --- /dev/null +++ b/doc/release-notes.inc @@ -0,0 +1,75 @@ +[appendix] +== Release Notes + + :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/system-operation.inc b/doc/system-operation.inc index bca1ee80..d7c56eaa 100644 --- a/doc/system-operation.inc +++ b/doc/system-operation.inc @@ -384,7 +384,7 @@ shown in the following table. .Altus Metrum APRS Comments - [options="header",cols="1,1,1"] + [options="header",cols="1,1,3"] |==== |Field |Example |Description diff --git a/doc/telegps-application.inc b/doc/telegps-application.inc new file mode 100644 index 00000000..c5ecc11f --- /dev/null +++ b/doc/telegps-application.inc @@ -0,0 +1,569 @@ +== 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 + the 'Preload Maps' section below. + + ==== 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. + + === Load Maps + + .Load Maps Window + image::load-maps.png[width="5.2in"] + + 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. + + 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 + + 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. + + === Preferences + + .TeleGPS Preferences Window + image::telegps-preferences.png[width="2.4in"] + + 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. + + 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 + + ==== Log Directory + + 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. + + 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. + + ==== 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 AltosUI + 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. + + ==== 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. + + ==== Font Size + + Selects the set of fonts used in the flight + monitor window. Choose between the small, + medium and large sets. + + ==== Serial Debug + + 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. + + ==== 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. + + === 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. + + The rest of the dialog contains the parameters to be configured. + + ==== 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. 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. + + ==== 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. + + ==== Callsign + + This sets the call sign included in each + telemetry packet. Set this as needed to + conform to your local radio regulations. + + ==== Logging Trigger Motion + + If TeleGPS moves less than this distance over + a long period of time, it will not log that + location, saving storage space. + + ==== Position Reporting Interval + + 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. + + === Flash Device + + This reprograms TeleGPS devices with new + firmware. Please read the directions for flashing + devices in the Updating Device Firmware chapter below. diff --git a/doc/telegps-docinfo.xml b/doc/telegps-docinfo.xml new file mode 100644 index 00000000..fcceae3f --- /dev/null +++ b/doc/telegps-docinfo.xml @@ -0,0 +1,73 @@ +An Owner's Manual for the TeleGPS recording GPS tracker + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + + + 2015 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + + + + 1.6.1 + 15 July 2015 + + Minor release adding TeleBT v3.0 support. + + + + 1.6 + 8 January 2015 + + Major release adding TeleDongle v3.0 support. + + + + 1.5 + 6 September 2014 + + Major release adding EasyMega support. + + + + 1.4.2 + 17 August 2014 + + Minor release fixing some Windows installation bugs. + + + + 1.4.1 + 20 June 2014 + + Minor release fixing some installation bugs. + + + + 1.4 + 15 June 2014 + + Initial version + + + diff --git a/doc/telegps-quick-start.inc b/doc/telegps-quick-start.inc new file mode 100644 index 00000000..e8db8ac3 --- /dev/null +++ b/doc/telegps-quick-start.inc @@ -0,0 +1,24 @@ +== TeleGPS Quick Start Guide + + TeleGPS is designed to be easy to use. Requiring no external + components, flying takes just a few steps. + + First, download and install the software from + http://altusmetrum.org/AltOS. This will make sure that + you have the right device drivers installed. + + 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. + + 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. + + Unplug TeleGPS when the battery charger light goes green. This + will enable the radio and logging portions of the TeleGPS + firmware. + + 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..7a53bd2d --- /dev/null +++ b/doc/telegps-release-notes.inc @@ -0,0 +1,25 @@ +[appendix] +== Release Notes + + :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..e8790db8 --- /dev/null +++ b/doc/telegps-system-operation.inc @@ -0,0 +1,149 @@ +[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. + + === APRS + + 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; that + process is described in the Configure TeleGPS + section of the TeleGPS Application chapter. + + 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. + + 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. + + .TeleGPS 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 + + |4 + |1286 + |Device Serial Number + |==== + + Here's an example of an APRS comment showing GPS lock with 6 + satellites in view and a battery at 4.0V from device 1286. + + .... + L6 B4.0 1286 + .... + + Make sure your battery is above 3.8V 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. + + === Configurable Parameters + + 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. + + ==== Radio Frequency + + 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. + + ==== Callsign + + This sets the callsign used for telemetry and APRS to + identify the device. + + ==== Telemetry/RDF/APRS Enable + + You can completely disable the radio, if necessary, leaving + TeleGPS only logging data to internal memory. + + ==== APRS Interval + + 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. + + ==== Maximum Flight Log + + 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. + + ==== Logging Trigger Motion + + If TeleGPS moves less than this distance over a long period + of time, it will not log that location, saving storage space. + + ==== Position Reporting Interval + + 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. 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 + -v-.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..059036ec --- /dev/null +++ b/doc/telegps.txt @@ -0,0 +1,21 @@ += TeleGPS Owner's Manual +:doctype: book +:numbered: + + include::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 @@ - - - - TeleGPS Owner's Manual - A recording GPS tracker - - - Keith - Packard - - - 2015 - Bdale Garbee and Keith Packard - - - - - - - - - This document is released under the terms of the - - Creative Commons ShareAlike 3.0 - - license. - - - - - 1.6 - 8 January 2015 - - Major release adding TeleDongle v3.0 support. - - - - 1.4.1 - 20 June 2014 - - Minor release fixing some installation bugs. - - - - 1.4 - 13 June 2014 - - Initial release - - - - - - Acknowledgements - - Have fun using these products, and we hope to meet all of you - out on the rocket flight line somewhere. - -Bdale Garbee, KB0G -NAR #87103, TRA #12201 - -Keith Packard, KD7SQG -NAR #88757, TRA #12200 - - - - - Quick Start Guide - - TeleGPS is designed to be easy to use. Requiring no external - components, flying takes just a few steps. - - - First, download and install the software from . This will make sure that - you have the right device drivers installed. - - - 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. - - - 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. - - - Unplug TeleGPS when the battery charger light goes green. This - will enable the radio and logging portions of the TeleGPS - firmware. - - - 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. - - - - 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. - - - 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. - - - As with all other rocketry electronics, Altus Metrum devices must - be protected from exposure to corrosive motor exhaust and ejection - charge gasses. - - - - 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 JST Jumper 2 - Wire Assembly. - - - 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. 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. - -
-
- - 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. - -
-
- APRS - - 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. - - - 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. - - - 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. - - - Altus Metrum APRS Comments - - - - - - - - Field - Example - Description - - - - - 1 - L - GPS Status U for unlocked, L for locked - - - 2 - 6 - Number of Satellites in View - - - 3 - B4.0 - Battery Voltage - - - -
- - Here's an example of an APRS comment showing GPS lock with 6 - satellites in view and a battery at 4.0V. - - L6 B4.0 - - - - 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. - - - 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. - -
-
- Configurable Parameters - - 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. - -
- Radio Frequency - - 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. - -
-
- Callsign - - This sets the callsign used for telemetry and APRS to - identify the device. - -
-
- Telemetry/RDF/APRS Enable - - You can completely disable the radio, if necessary, leaving - TeleGPS only logging data to internal memory. - -
-
- APRS Interval - - 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. - -
-
- Maximum Flight Log - - 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. - -
-
- Logging Trigger Motion - - If TeleGPS moves less than this distance over a long period - of time, it will not log that location, saving storage space. - -
-
- Position Reporting Interval - - 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. - -
-
-
- - 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. This chapter - is split into sections, each of which documents one of the tasks - provided from the top-level toolbar. - -
- 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. - - - - - - - - - - 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 the 'Preload Maps' section below. - -
-
- Location - - The Location tab shows the raw GPS data received from TeleGPS. - - - - - - - - -
-
- Status - - The Status tab shows data relative to the location of - TeleGPS when the application first received telemetry from - it. - - - - - - - - -
-
- Table - - The Table tab shows detailed information about the GPS - receiver - - - - - - - - -
-
- -
- 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 - - 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. - -
- Graph - - 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. - - - - - - - - -
-
- Configure Graph - - - - - - - - - This selects which graph elements to show, and, at the - bottom, lets you switch between metric and imperial units - -
-
- Statistics - - - - - - - - - Shows overall data computed from the flight. - -
-
- Map - - - - - - - - - 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 flight path in 3D. - -
-
-
- Load Maps - - - - - - - - - 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. - - - 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 - - - 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. - - - 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. - - - 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. - -
-
- Preferences - - - - - - - -
- Voice Settings - - 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. - - - - 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 - - - - -
-
- Log Directory - - 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. - - - 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. - -
-
- 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 AltosUI 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. - -
-
- 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 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. - -
-
- Font Size - - Selects the set of fonts used in the flight monitor - window. Choose between the small, medium and large sets. - -
-
- Look & Feel - - Adjust the style of the windows. By default, the TeleGPS - application attempts to blend in with the native style. - -
-
- 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. - -
-
-
- 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. - - - - - - - - -
-
- Disconnect - - Disconnects the currently connected TeleDongle or TeleBT - -
-
- Scan Channels - - 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 - - - - - - - - - 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. This will restart logging for - a new flight number, if any log information has been - saved for the current flight. - - - - - 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 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. - -
-
- APRS Interval - - 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. - -
-
- Callsign - - This sets the call sign included in each telemetry packet. Set this - as needed to conform to your local radio regulations. - -
-
- Maximum Log Size - - 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. - -
-
- Logging Trigger Motion - - If TeleGPS moves less than this distance over a long period - of time, it will not log that location, saving storage space. - -
-
- Position Reporting Interval - - 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. - -
-
-
- Flash Device - - This reprograms TeleGPS devices with new firmware. Please - read the directions for flashing devices in the Updating - Device Firmware chapter below. - -
-
-
- - 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 . - -
- - 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 - Altimeter' item to check over the configuration. - - - - -
-
- - 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. - -
-
- - Release Notes - - Version 1.6 - - - - Version 1.4.1 - - - - Version 1.4 - - - -
- 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 @@ - - -
- TeleMega Outline and Hole Pattern - - 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. - - - - - - - - -
- - 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 @@ - - -
- TeleMetrum Outline and Hole Pattern - - 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. - - - - - - - - -
- - diff --git a/doc/telemetrum-v2.0-th.jpg b/doc/telemetrum-v2.0-th.jpg new file mode 100644 index 00000000..ceec699d Binary files /dev/null and b/doc/telemetrum-v2.0-th.jpg differ diff --git a/doc/telemetrum.inc b/doc/telemetrum.inc index 54185bff..fa7d202c 100644 --- a/doc/telemetrum.inc +++ b/doc/telemetrum.inc @@ -17,6 +17,18 @@ 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 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.pdf b/doc/telemini.pdf deleted file mode 100644 index 9d7f0237..00000000 Binary files a/doc/telemini.pdf and /dev/null differ diff --git a/doc/titlepage.templates.tmpl b/doc/titlepage.templates.tmpl new file mode 100644 index 00000000..9de1b31f --- /dev/null +++ b/doc/titlepage.templates.tmpl @@ -0,0 +1,1583 @@ + + + + + + + + + + + + +]> + + + + + + + + + + + + + <subtitle/> + + <date/> + + <corpauthor space-before="0.5em" + font-size="&hsize2;"/> + <authorgroup space-before="0.5em" + font-size="&hsize2;"/> + <author space-before="0.5em" + font-size="&hsize2;"/> + + <!-- If you add editor, include this t:predicate attribute + because only the first editor generates the list of editors. + <editor t:predicate="[position() = 1]"/> + --> + <othercredit space-before="0.5em"/> + <releaseinfo space-before="0.5em"/> + <copyright space-before="0.5em"/> + <legalnotice text-align="start" + margin-left="0.5in" + margin-right="0.5in" + font-family="{$body.fontset}"/> + <pubdate space-before="0.5em"/> + <revision space-before="0.5em"/> + <revhistory space-before="0.5em"/> + <abstract space-before="0.5em" + text-align="start" + margin-left="0.5in" + margin-right="0.5in" + font-family="{$body.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + +<t:titlepage t:element="set" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:named-template="division.title" + param:node="ancestor-or-self::set[1]" + text-align="center" + font-size="&hsize5;" + space-before="&hsize5space;" + font-weight="bold" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}" + text-align="center"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="book" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:named-template="division.title" + param:node="ancestor-or-self::book[1]" + text-align="center" + font-size="&hsize5;" + space-before="&hsize5space;" + font-weight="bold" + font-family="{$title.fontset}"/> + <subtitle + text-align="center" + font-size="&hsize4;" + space-before="&hsize4space;" + font-family="{$title.fontset}"/> + <corpauthor font-size="&hsize3;" + keep-with-next.within-column="always" + space-before="2in"/> + <authorgroup space-before="2in"/> + <author font-size="&hsize3;" + space-before="&hsize2space;" + keep-with-next.within-column="always"/> + <!-- If you add editor, include this t:predicate attribute + because only the first editor generates the list of editors. + <editor t:predicate="[position() = 1]"/> + --> + <mediaobject space-before="1.5in"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + <title + t:named-template="book.verso.title" + font-size="&hsize2;" + font-weight="bold" + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup t:named-template="verso.authorgroup"/> + <author/> + <!-- If you add editor, include this t:predicate attribute + because only the first editor generates the list of editors. + <editor t:predicate="[position() = 1]"/> + --> + <othercredit/> + <releaseinfo space-before="0.5em"/> + <pubdate space-before="1em"/> + <copyright/> + <abstract/> + <legalnotice font-size="8pt"/> + <revhistory space-before="0.5in"/> + </t:titlepage-content> + + <t:titlepage-separator> + <fo:block break-after="page"/> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + <fo:block break-after="page"/> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + +<t:titlepage t:element="part" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:named-template="division.title" + param:node="ancestor-or-self::part[1]" + text-align="center" + font-size="&hsize5;" + space-before="&hsize5space;" + font-weight="bold" + font-family="{$title.fontset}"/> + <subtitle + text-align="center" + font-size="&hsize4;" + space-before="&hsize4space;" + font-weight='bold' + font-style='italic' + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<t:titlepage t:element="partintro" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + text-align="center" + font-size="&hsize5;" + font-weight="bold" + space-before="1em" + font-family="{$title.fontset}"/> + <subtitle + text-align="center" + font-size="&hsize2;" + font-weight="bold" + font-style="italic" + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + +<t:titlepage t:element="reference" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:named-template="division.title" + param:node="ancestor-or-self::reference[1]" + text-align="center" + font-size="&hsize5;" + space-before="&hsize5space;" + font-weight="bold" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}" + text-align="center"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + +<t:titlepage t:element="refsynopsisdiv" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + +<t:titlepage t:element="refsection" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + +<t:titlepage t:element="refsect1" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + +<t:titlepage t:element="refsect2" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + +<t:titlepage t:element="refsect3" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="dedication" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="component.title" + param:node="ancestor-or-self::dedication[1]" + margin-left="{$title.margin.left}" + font-size="&hsize5;" + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + +<!-- Same formatting as dedication --> + <t:titlepage t:element="acknowledgements" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="component.title" + param:node="ancestor-or-self::acknowledgements[1]" + margin-left="{$title.margin.left}" + font-size="&hsize5;" + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + + +<!-- ==================================================================== --> + + <t:titlepage t:element="preface" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="component.title" + param:node="ancestor-or-self::preface[1]" + margin-left="{$title.margin.left}" + font-size="&hsize5;" + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="chapter" t:wrapper="fo:block" + font-family="{$title.fontset}"> + <t:titlepage-content t:side="recto" margin-left="{$title.margin.left}"> + <title t:named-template="component.title" + param:node="ancestor-or-self::chapter[1]" + font-size="&hsize5;" + font-weight="bold"/> + + <subtitle space-before="0.5em" + font-style="italic" + font-size="&hsize2;" + font-weight="bold"/> + + <corpauthor space-before="0.5em" + space-after="0.5em" + font-size="&hsize2;"/> + + <authorgroup space-before="0.5em" + space-after="0.5em" + font-size="&hsize2;"/> + + <author space-before="0.5em" + space-after="0.5em" + font-size="&hsize2;"/> + + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="appendix" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:named-template="component.title" + param:node="ancestor-or-self::appendix[1]" + margin-left="{$title.margin.left}" + font-size="&hsize5;" + font-weight="bold" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + +<t:titlepage t:element="section" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + margin-left="{$title.margin.left}" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<t:titlepage t:element="sect1" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + margin-left="{$title.margin.left}" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<t:titlepage t:element="sect2" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + margin-left="{$title.margin.left}" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<t:titlepage t:element="sect3" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + margin-left="{$title.margin.left}" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<t:titlepage t:element="sect4" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + margin-left="{$title.margin.left}" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<t:titlepage t:element="sect5" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + margin-left="{$title.margin.left}" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<t:titlepage t:element="simplesect" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + margin-left="{$title.margin.left}" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}"/> + <corpauthor/> + <authorgroup/> + <author/> + <othercredit/> + <releaseinfo/> + <copyright/> + <legalnotice/> + <pubdate/> + <revision/> + <revhistory/> + <abstract/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<t:titlepage t:element="topic" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + font-weight="bold" + font-size="&hsize3;" + space-before="1em" + space-after="1em" + font-family="{$title.fontset}"/> + <subtitle + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="bibliography" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="component.title" + param:node="ancestor-or-self::bibliography[1]" + margin-left="{$title.margin.left}" + font-size="&hsize5;" + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="bibliodiv" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title t:named-template="component.title" + param:node="ancestor-or-self::bibliodiv[1]" + margin-left="{$title.margin.left}" + font-size="&hsize4;" + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="glossary" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="component.title" + param:node="ancestor-or-self::glossary[1]" + margin-left="{$title.margin.left}" + font-size="&hsize5;" + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="glossdiv" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title t:named-template="component.title" + param:node="ancestor-or-self::glossdiv[1]" + margin-left="{$title.margin.left}" + font-size="&hsize4;" + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="index" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="component.title" + param:node="ancestor-or-self::index[1]" + param:pagewide="1" + margin-left="0pt" + font-size="&hsize5;" + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + +<!-- ==================================================================== --> + + <!-- The indexdiv.title template is used so that manual and --> + <!-- automatically generated indexdiv titles get the same --> + <!-- formatting. --> + + <t:titlepage t:element="indexdiv" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title t:force="1" + t:named-template="indexdiv.title" + param:title="title"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="setindex" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="component.title" + param:node="ancestor-or-self::setindex[1]" + param:pagewide="1" + margin-left="0pt" + font-size="&hsize5;" + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="colophon" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="component.title" + param:node="ancestor-or-self::colophon[1]" + margin-left="{$title.margin.left}" + font-size="&hsize5;" + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="sidebar" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + font-family="{$title.fontset}" + font-weight="bold"/> + <subtitle + font-family="{$title.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + +<!-- ==================================================================== --> +<t:titlepage t:element="qandaset" t:wrapper="fo:block" + font-family="{$title.fontset}"> + + <t:titlepage-content t:side="recto" + start-indent="0pt" + text-align="center"> + + <title t:named-template="component.title" + param:node="ancestor-or-self::qandaset[1]" + keep-with-next.within-column="always" + font-size="&hsize5;" + font-weight="bold"/> + + <subtitle/> + + <corpauthor space-before="0.5em" + font-size="&hsize2;"/> + <authorgroup space-before="0.5em" + font-size="&hsize2;"/> + <author space-before="0.5em" + font-size="&hsize2;"/> + + <othercredit space-before="0.5em"/> + <releaseinfo space-before="0.5em"/> + <copyright space-before="0.5em"/> + <legalnotice text-align="start" + margin-left="0.5in" + margin-right="0.5in" + font-family="{$body.fontset}"/> + <pubdate space-before="0.5em"/> + <revision space-before="0.5em"/> + <revhistory space-before="0.5em"/> + <abstract space-before="0.5em" + text-align="start" + margin-left="0.5in" + margin-right="0.5in" + font-family="{$body.fontset}"/> + <itermset/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> +</t:titlepage> + +<!-- ==================================================================== --> + + <t:titlepage t:element="table.of.contents" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'TableofContents'" + space-before.minimum="1em" + space-before.optimum="1.5em" + space-before.maximum="2em" + space-after="0.5em" + start-indent="0pt" + font-size="&hsize3;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="list.of.tables" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofTables'" + space-before.minimum="1em" + space-before.optimum="1.5em" + space-before.maximum="2em" + space-after="0.5em" + start-indent="0pt" + font-size="&hsize3;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="list.of.figures" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofFigures'" + space-before.minimum="1em" + space-before.optimum="1.5em" + space-before.maximum="2em" + space-after="0.5em" + start-indent="0pt" + font-size="&hsize3;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="list.of.examples" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofExamples'" + space-before.minimum="1em" + space-before.optimum="1.5em" + space-before.maximum="2em" + space-after="0.5em" + start-indent="0pt" + font-size="&hsize3;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="list.of.equations" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofEquations'" + space-before.minimum="1em" + space-before.optimum="1.5em" + space-before.maximum="2em" + space-after="0.5em" + start-indent="0pt" + font-size="&hsize3;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="list.of.procedures" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofProcedures'" + space-before.minimum="1em" + space-before.optimum="1.5em" + space-before.maximum="2em" + space-after="0.5em" + start-indent="0pt" + font-size="&hsize3;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="list.of.unknowns" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofUnknown'" + space-before.minimum="1em" + space-before.optimum="1.5em" + space-before.maximum="2em" + space-after="0.5em" + start-indent="0pt" + font-size="&hsize3;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="component.list.of.tables" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofTables'" + space-before.minimum="1em" + space-before.optimum="1em" + space-before.maximum="1em" + space-after="0.5em" + margin-left="{$title.margin.left}" + font-size="&hsize1;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="component.list.of.figures" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofFigures'" + space-before.minimum="1em" + space-before.optimum="1em" + space-before.maximum="1em" + space-after="0.5em" + margin-left="{$title.margin.left}" + font-size="&hsize1;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="component.list.of.examples" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofExamples'" + space-before.minimum="1em" + space-before.optimum="1em" + space-before.maximum="1em" + space-after="0.5em" + margin-left="{$title.margin.left}" + font-size="&hsize1;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="component.list.of.equations" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofEquations'" + space-before.minimum="1em" + space-before.optimum="1em" + space-before.maximum="1em" + space-after="0.5em" + margin-left="{$title.margin.left}" + font-size="&hsize1;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="component.list.of.procedures" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofProcedures'" + space-before.minimum="1em" + space-before.optimum="1em" + space-before.maximum="1em" + space-after="0.5em" + margin-left="{$title.margin.left}" + font-size="&hsize1;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + + <t:titlepage t:element="component.list.of.unknowns" t:wrapper="fo:block"> + <t:titlepage-content t:side="recto"> + <title + t:force="1" + t:named-template="gentext" + param:key="'ListofUnknown'" + space-before.minimum="1em" + space-before.optimum="1em" + space-before.maximum="1em" + space-after="0.5em" + margin-left="{$title.margin.left}" + font-size="&hsize1;" + font-weight="bold" + font-family="{$title.fontset}"/> + </t:titlepage-content> + + <t:titlepage-content t:side="verso"> + </t:titlepage-content> + + <t:titlepage-separator> + </t:titlepage-separator> + + <t:titlepage-before t:side="recto"> + </t:titlepage-before> + + <t:titlepage-before t:side="verso"> + </t:titlepage-before> + </t:titlepage> + +<!-- ==================================================================== --> + +</t:templates> diff --git a/doc/titlepage.templates.xml b/doc/titlepage.templates.xml deleted file mode 100644 index 59fa5ba1..00000000 --- a/doc/titlepage.templates.xml +++ /dev/null @@ -1,1580 +0,0 @@ -<!DOCTYPE t:templates [ -<!ENTITY hsize0 "10pt"> -<!ENTITY hsize1 "12pt"> -<!ENTITY hsize2 "14.4pt"> -<!ENTITY hsize3 "17.28pt"> -<!ENTITY hsize4 "20.736pt"> -<!ENTITY hsize5 "24.8832pt"> -<!ENTITY hsize0space "7.5pt"> <!-- 0.75 * hsize0 --> -<!ENTITY hsize1space "9pt"> <!-- 0.75 * hsize1 --> -<!ENTITY hsize2space "10.8pt"> <!-- 0.75 * hsize2 --> -<!ENTITY hsize3space "12.96pt"> <!-- 0.75 * hsize3 --> -<!ENTITY hsize4space "15.552pt"> <!-- 0.75 * hsize4 --> -<!ENTITY hsize5space "18.6624pt"> <!-- 0.75 * hsize5 --> -]> -<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0" - xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param" - xmlns:fo="http://www.w3.org/1999/XSL/Format" - xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> - -<!-- ******************************************************************** - $Id: titlepage.templates.xml 9722 2013-02-01 19:44:13Z bobstayton $ - ******************************************************************** - - This file is part of the DocBook XSL Stylesheet distribution. - See ../README or http://docbook.sf.net/ for copyright - copyright and other information. - - ******************************************************************** --> - -<!-- ==================================================================== --> - -<t:titlepage t:element="article" t:wrapper="fo:block" - font-family="{$title.fontset}"> - - <t:titlepage-content t:side="recto" - start-indent="0pt" - text-align="center"> - - <title t:named-template="component.title" - param:node="ancestor-or-self::article[1]" - keep-with-next.within-column="always" - font-size="&hsize5;" - font-weight="bold"/> - - <subtitle/> - - <corpauthor space-before="0.5em" - font-size="&hsize2;"/> - <authorgroup space-before="0.5em" - font-size="&hsize2;"/> - <author space-before="0.5em" - font-size="&hsize2;"/> - - <!-- If you add editor, include this t:predicate attribute - because only the first editor generates the list of editors. - <editor t:predicate="[position() = 1]"/> - --> - <othercredit space-before="0.5em"/> - <releaseinfo space-before="0.5em"/> - <copyright space-before="0.5em"/> - <legalnotice text-align="start" - margin-left="0.5in" - margin-right="0.5in" - font-family="{$body.fontset}"/> - <pubdate space-before="0.5em"/> - <revision space-before="0.5em"/> - <revhistory space-before="0.5em"/> - <abstract space-before="0.5em" - text-align="start" - margin-left="0.5in" - margin-right="0.5in" - font-family="{$body.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - -<t:titlepage t:element="set" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:named-template="division.title" - param:node="ancestor-or-self::set[1]" - text-align="center" - font-size="&hsize5;" - space-before="&hsize5space;" - font-weight="bold" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}" - text-align="center"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="book" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:named-template="division.title" - param:node="ancestor-or-self::book[1]" - text-align="center" - font-size="&hsize5;" - space-before="&hsize5space;" - font-weight="bold" - font-family="{$title.fontset}"/> - <subtitle - text-align="center" - font-size="&hsize4;" - space-before="&hsize4space;" - font-family="{$title.fontset}"/> - <corpauthor font-size="&hsize3;" - keep-with-next.within-column="always" - space-before="2in"/> - <authorgroup space-before="2in"/> - <author font-size="&hsize3;" - space-before="&hsize2space;" - keep-with-next.within-column="always"/> - <!-- If you add editor, include this t:predicate attribute - because only the first editor generates the list of editors. - <editor t:predicate="[position() = 1]"/> - --> - <mediaobject space-before="1.5in"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - <title - t:named-template="book.verso.title" - font-size="&hsize2;" - font-weight="bold" - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup t:named-template="verso.authorgroup"/> - <author/> - <!-- If you add editor, include this t:predicate attribute - because only the first editor generates the list of editors. - <editor t:predicate="[position() = 1]"/> - --> - <othercredit/> - <releaseinfo space-before="0.5em"/> - <pubdate space-before="1em"/> - <copyright/> - <abstract/> - <legalnotice font-size="8pt"/> - </t:titlepage-content> - - <t:titlepage-separator> - <fo:block break-after="page"/> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - <fo:block break-after="page"/> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - -<t:titlepage t:element="part" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:named-template="division.title" - param:node="ancestor-or-self::part[1]" - text-align="center" - font-size="&hsize5;" - space-before="&hsize5space;" - font-weight="bold" - font-family="{$title.fontset}"/> - <subtitle - text-align="center" - font-size="&hsize4;" - space-before="&hsize4space;" - font-weight='bold' - font-style='italic' - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<t:titlepage t:element="partintro" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - text-align="center" - font-size="&hsize5;" - font-weight="bold" - space-before="1em" - font-family="{$title.fontset}"/> - <subtitle - text-align="center" - font-size="&hsize2;" - font-weight="bold" - font-style="italic" - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - -<t:titlepage t:element="reference" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:named-template="division.title" - param:node="ancestor-or-self::reference[1]" - text-align="center" - font-size="&hsize5;" - space-before="&hsize5space;" - font-weight="bold" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}" - text-align="center"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - -<t:titlepage t:element="refsynopsisdiv" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - -<t:titlepage t:element="refsection" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - -<t:titlepage t:element="refsect1" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - -<t:titlepage t:element="refsect2" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - -<t:titlepage t:element="refsect3" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="dedication" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="component.title" - param:node="ancestor-or-self::dedication[1]" - margin-left="{$title.margin.left}" - font-size="&hsize5;" - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - -<!-- Same formatting as dedication --> - <t:titlepage t:element="acknowledgements" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="component.title" - param:node="ancestor-or-self::acknowledgements[1]" - margin-left="{$title.margin.left}" - font-size="&hsize5;" - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - - -<!-- ==================================================================== --> - - <t:titlepage t:element="preface" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="component.title" - param:node="ancestor-or-self::preface[1]" - margin-left="{$title.margin.left}" - font-size="&hsize5;" - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="chapter" t:wrapper="fo:block" - font-family="{$title.fontset}"> - <t:titlepage-content t:side="recto" margin-left="{$title.margin.left}"> - <title t:named-template="component.title" - param:node="ancestor-or-self::chapter[1]" - font-size="&hsize5;" - font-weight="bold"/> - - <subtitle space-before="0.5em" - font-style="italic" - font-size="&hsize2;" - font-weight="bold"/> - - <corpauthor space-before="0.5em" - space-after="0.5em" - font-size="&hsize2;"/> - - <authorgroup space-before="0.5em" - space-after="0.5em" - font-size="&hsize2;"/> - - <author space-before="0.5em" - space-after="0.5em" - font-size="&hsize2;"/> - - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="appendix" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:named-template="component.title" - param:node="ancestor-or-self::appendix[1]" - margin-left="{$title.margin.left}" - font-size="&hsize5;" - font-weight="bold" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - -<t:titlepage t:element="section" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - margin-left="{$title.margin.left}" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<t:titlepage t:element="sect1" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - margin-left="{$title.margin.left}" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<t:titlepage t:element="sect2" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - margin-left="{$title.margin.left}" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<t:titlepage t:element="sect3" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - margin-left="{$title.margin.left}" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<t:titlepage t:element="sect4" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - margin-left="{$title.margin.left}" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<t:titlepage t:element="sect5" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - margin-left="{$title.margin.left}" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<t:titlepage t:element="simplesect" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - margin-left="{$title.margin.left}" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}"/> - <corpauthor/> - <authorgroup/> - <author/> - <othercredit/> - <releaseinfo/> - <copyright/> - <legalnotice/> - <pubdate/> - <revision/> - <revhistory/> - <abstract/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<t:titlepage t:element="topic" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - font-weight="bold" - font-size="&hsize3;" - space-before="1em" - space-after="1em" - font-family="{$title.fontset}"/> - <subtitle - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="bibliography" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="component.title" - param:node="ancestor-or-self::bibliography[1]" - margin-left="{$title.margin.left}" - font-size="&hsize5;" - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="bibliodiv" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title t:named-template="component.title" - param:node="ancestor-or-self::bibliodiv[1]" - margin-left="{$title.margin.left}" - font-size="&hsize4;" - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="glossary" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="component.title" - param:node="ancestor-or-self::glossary[1]" - margin-left="{$title.margin.left}" - font-size="&hsize5;" - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="glossdiv" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title t:named-template="component.title" - param:node="ancestor-or-self::glossdiv[1]" - margin-left="{$title.margin.left}" - font-size="&hsize4;" - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="index" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="component.title" - param:node="ancestor-or-self::index[1]" - param:pagewide="1" - margin-left="0pt" - font-size="&hsize5;" - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - -<!-- ==================================================================== --> - - <!-- The indexdiv.title template is used so that manual and --> - <!-- automatically generated indexdiv titles get the same --> - <!-- formatting. --> - - <t:titlepage t:element="indexdiv" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title t:force="1" - t:named-template="indexdiv.title" - param:title="title"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="setindex" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="component.title" - param:node="ancestor-or-self::setindex[1]" - param:pagewide="1" - margin-left="0pt" - font-size="&hsize5;" - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="colophon" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="component.title" - param:node="ancestor-or-self::colophon[1]" - margin-left="{$title.margin.left}" - font-size="&hsize5;" - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="sidebar" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - font-family="{$title.fontset}" - font-weight="bold"/> - <subtitle - font-family="{$title.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - -<!-- ==================================================================== --> -<t:titlepage t:element="qandaset" t:wrapper="fo:block" - font-family="{$title.fontset}"> - - <t:titlepage-content t:side="recto" - start-indent="0pt" - text-align="center"> - - <title t:named-template="component.title" - param:node="ancestor-or-self::qandaset[1]" - keep-with-next.within-column="always" - font-size="&hsize5;" - font-weight="bold"/> - - <subtitle/> - - <corpauthor space-before="0.5em" - font-size="&hsize2;"/> - <authorgroup space-before="0.5em" - font-size="&hsize2;"/> - <author space-before="0.5em" - font-size="&hsize2;"/> - - <othercredit space-before="0.5em"/> - <releaseinfo space-before="0.5em"/> - <copyright space-before="0.5em"/> - <legalnotice text-align="start" - margin-left="0.5in" - margin-right="0.5in" - font-family="{$body.fontset}"/> - <pubdate space-before="0.5em"/> - <revision space-before="0.5em"/> - <revhistory space-before="0.5em"/> - <abstract space-before="0.5em" - text-align="start" - margin-left="0.5in" - margin-right="0.5in" - font-family="{$body.fontset}"/> - <itermset/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> -</t:titlepage> - -<!-- ==================================================================== --> - - <t:titlepage t:element="table.of.contents" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'TableofContents'" - space-before.minimum="1em" - space-before.optimum="1.5em" - space-before.maximum="2em" - space-after="0.5em" - start-indent="0pt" - font-size="&hsize3;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="list.of.tables" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofTables'" - space-before.minimum="1em" - space-before.optimum="1.5em" - space-before.maximum="2em" - space-after="0.5em" - start-indent="0pt" - font-size="&hsize3;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="list.of.figures" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofFigures'" - space-before.minimum="1em" - space-before.optimum="1.5em" - space-before.maximum="2em" - space-after="0.5em" - start-indent="0pt" - font-size="&hsize3;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="list.of.examples" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofExamples'" - space-before.minimum="1em" - space-before.optimum="1.5em" - space-before.maximum="2em" - space-after="0.5em" - start-indent="0pt" - font-size="&hsize3;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="list.of.equations" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofEquations'" - space-before.minimum="1em" - space-before.optimum="1.5em" - space-before.maximum="2em" - space-after="0.5em" - start-indent="0pt" - font-size="&hsize3;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="list.of.procedures" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofProcedures'" - space-before.minimum="1em" - space-before.optimum="1.5em" - space-before.maximum="2em" - space-after="0.5em" - start-indent="0pt" - font-size="&hsize3;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="list.of.unknowns" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofUnknown'" - space-before.minimum="1em" - space-before.optimum="1.5em" - space-before.maximum="2em" - space-after="0.5em" - start-indent="0pt" - font-size="&hsize3;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="component.list.of.tables" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofTables'" - space-before.minimum="1em" - space-before.optimum="1em" - space-before.maximum="1em" - space-after="0.5em" - margin-left="{$title.margin.left}" - font-size="&hsize1;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="component.list.of.figures" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofFigures'" - space-before.minimum="1em" - space-before.optimum="1em" - space-before.maximum="1em" - space-after="0.5em" - margin-left="{$title.margin.left}" - font-size="&hsize1;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="component.list.of.examples" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofExamples'" - space-before.minimum="1em" - space-before.optimum="1em" - space-before.maximum="1em" - space-after="0.5em" - margin-left="{$title.margin.left}" - font-size="&hsize1;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="component.list.of.equations" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofEquations'" - space-before.minimum="1em" - space-before.optimum="1em" - space-before.maximum="1em" - space-after="0.5em" - margin-left="{$title.margin.left}" - font-size="&hsize1;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="component.list.of.procedures" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofProcedures'" - space-before.minimum="1em" - space-before.optimum="1em" - space-before.maximum="1em" - space-after="0.5em" - margin-left="{$title.margin.left}" - font-size="&hsize1;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - - <t:titlepage t:element="component.list.of.unknowns" t:wrapper="fo:block"> - <t:titlepage-content t:side="recto"> - <title - t:force="1" - t:named-template="gentext" - param:key="'ListofUnknown'" - space-before.minimum="1em" - space-before.optimum="1em" - space-before.maximum="1em" - space-after="0.5em" - margin-left="{$title.margin.left}" - font-size="&hsize1;" - font-weight="bold" - font-family="{$title.fontset}"/> - </t:titlepage-content> - - <t:titlepage-content t:side="verso"> - </t:titlepage-content> - - <t:titlepage-separator> - </t:titlepage-separator> - - <t:titlepage-before t:side="recto"> - </t:titlepage-before> - - <t:titlepage-before t:side="verso"> - </t:titlepage-before> - </t:titlepage> - -<!-- ==================================================================== --> - -</t:templates> diff --git a/doc/updating-firmware.inc b/doc/updating-firmware.inc index 8b29558c..d22fdb18 100644 --- a/doc/updating-firmware.inc +++ b/doc/updating-firmware.inc @@ -17,18 +17,12 @@ download the most recent version from http://www.altusmetrum.org/AltOS/ - 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. - - Self-programmable devices (TeleMega, TeleMetrum v2, EasyMega - and EasyMini) are reprogrammed by connecting them to your - computer over USB - === Updating TeleMega, TeleMetrum v2, EasyMega, EasyMini or TeleDongle v3 Firmware + Self-programmable devices (TeleMega, TeleMetrum v2, + EasyMega and EasyMini) 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. @@ -144,6 +138,13 @@ 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 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> -- cgit v1.2.3 From 14ad137fd14707bc7b45a3512a4a6f81915ca1c1 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Sat, 31 Oct 2015 22:40:13 -0700 Subject: doc: Convert AltOS doc to asciidoc It's still pretty stale, but at least it isn't in docbook? Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/Makefile | 12 +- doc/altos-docinfo.xml | 32 + doc/altos.txt | 1400 ++++++++++++++++++++++++++++++++++++++++++ doc/altos.xsl | 1612 ------------------------------------------------- 4 files changed, 1441 insertions(+), 1615 deletions(-) create mode 100644 doc/altos-docinfo.xml create mode 100644 doc/altos.txt delete mode 100644 doc/altos.xsl diff --git a/doc/Makefile b/doc/Makefile index df1a884c..04402c88 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -134,12 +134,18 @@ SVG=\ RELNOTES_PDF=$(RELNOTES_INC:.inc=.pdf) RELNOTES_HTML=$(RELNOTES_INC:.inc=.html) +ALTOS_TXT_FILES=\ + altos.txt + +ALTOS_RAW_FILES=$(ALTOS_TXT_FILES:.txt=.raw) +ALTOS_PDF_FILES=$(ALTOS_TXT_FILES:.txt=.pdf) + HTML=altusmetrum.html altos.html telemetry.html companion.html micropeak.html telegps.html $(RELNOTES_HTML) -PDF=altusmetrum.pdf $(RELNOTES_PDF) altos.pdf telemetry.pdf companion.pdf micropeak.pdf telegps.pdf \ +PDF=altusmetrum.pdf $(RELNOTES_PDF) $(ALTOS_PDF_FILES) telemetry.pdf companion.pdf micropeak.pdf telegps.pdf \ $(OUTLINE_PDF_FILES) -FOSTYLE=xorg-fo.xsl +FOSTYLE=am-fo.xsl TEMPLATES_TMPL=titlepage.templates.tmpl @@ -189,7 +195,7 @@ publish: $(DOC) git push) clean: - rm -f $(HTML) $(PDF) $(TEMPLATES_XSL) + rm -f $(HTML) $(PDF) $(TEMPLATES_XSL) $(RAW_FILES) $(TELEGPS_RAW_FILES) $(MICROPEAK_RAW_FILES) distclean: clean rm -f $(HTML) $(PDF) diff --git a/doc/altos-docinfo.xml b/doc/altos-docinfo.xml new file mode 100644 index 00000000..1b6ad648 --- /dev/null +++ b/doc/altos-docinfo.xml @@ -0,0 +1,32 @@ +<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> + <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 - Altos Metrum Operating System - - - Keith - Packard - - - 2010 - Keith Packard - - - - This document is released under the terms of the - - Creative Commons ShareAlike 3.0 - - license. - - - - - 1.1 - 05 November 2012 - Portable version - - - 0.1 - 22 November 2010 - Initial content - - - - - 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 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. - -
-
- 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 Radio peripheral -
- Radio Introduction - - 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: - - - - 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. - -
-
-
- -- cgit v1.2.3 From 22f399b13fbbc980315a1f6a9f5616586b680d77 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 31 Oct 2015 23:36:03 -0700 Subject: doc: Convert telemetry and companion docs to asciidoc Signed-off-by: Keith Packard --- doc/companion-docinfo.xml | 27 + doc/companion.txt | 241 +++++++++ doc/companion.xsl | 353 ------------- doc/telemetry-docinfo.xml | 27 + doc/telemetry.txt | 571 +++++++++++++++++++++ doc/telemetry.xsl | 1230 --------------------------------------------- 6 files changed, 866 insertions(+), 1583 deletions(-) create mode 100644 doc/companion-docinfo.xml create mode 100644 doc/companion.txt delete mode 100644 doc/companion.xsl create mode 100644 doc/telemetry-docinfo.xml create mode 100644 doc/telemetry.txt delete mode 100644 doc/telemetry.xsl diff --git a/doc/companion-docinfo.xml b/doc/companion-docinfo.xml new file mode 100644 index 00000000..2e0bc567 --- /dev/null +++ b/doc/companion-docinfo.xml @@ -0,0 +1,27 @@ +Protocol Definitions + + Keith + Packard + keithp@keithp.com + +13 January 2012 + + 2012 + Keith Packard + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + + + + 0.1 + 13 January 2012 + Initial content + + 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 @@ - - - -
- - AltOS Companion Port - Protocol Definitions - - Keith - Packard - - - 2012 - Keith Packard - - - - This document is released under the terms of the - - Creative Commons ShareAlike 3.0 - - license. - - - - - 0.1 - 13 January 2012 - Initial content - - - -
- 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. - -
- Command Message - - Companion Command Message - - - - - - - - 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 - - - - - - - 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 - - - - - - - - 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 - - - - - - - - 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/telemetry-docinfo.xml b/doc/telemetry-docinfo.xml new file mode 100644 index 00000000..c7b1f060 --- /dev/null +++ b/doc/telemetry-docinfo.xml @@ -0,0 +1,27 @@ +Packet Definitions + + Keith + Packard + keithp@keithp.com + +1 July 2011 + + 2011 + Keith Packard + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + + + + 0.1 + 1 July 2011 + Initial content + + 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 @@ - - - -
- - AltOS Telemetry - Packet Definitions - - Keith - Packard - - - 2011 - Keith Packard - - - - This document is released under the terms of the - - Creative Commons ShareAlike 3.0 - - license. - - - - - 0.1 - 01 July 2011 - Initial content - - - -
- 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 - - - - - - - - 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 - - - - - - - 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 - - - - - - - - Offset - Data Type - Name - Description - - - - - 5uint8_tstateFlight state - - - 6int16_taccelaccelerometer (TM only) - - - 8int16_tprespressure sensor - - - 10int16_ttemptemperature sensor - - - 12int16_tv_battbattery voltage - - - 14int16_tsense_ddrogue continuity sense (TM/Tm) - - - 16int16_tsense_mmain continuity sense (TM/Tm) - - - 18int16_taccelerationm/s² * 16 - - - 20int16_tspeedm/s * 16 - - - 22int16_theightm - - - 24int16_tground_presAverage barometer reading on ground - - - 26int16_tground_accelTM - - - 28int16_taccel_plus_gTM - - - 30int16_taccel_minus_gTM - - - 32 - - - -
-
-
- TeleMega Sensor Data - - - - - - - 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 - - - - - - - - Offset - Data Type - Name - Description - - - - - 5uint8_torientAngle from vertical in degrees - - - 6int16_taccelHigh G accelerometer - - - 8int32_tprespressure (Pa * 10) - - - 12int16_ttemptemperature (°C * 100) - - - 14int16_taccel_xX axis acceleration (across) - - - 16int16_taccel_yY axis acceleration (along) - - - 18int16_taccel_zZ axis acceleration (through) - - - 20int16_tgyro_xX axis rotation (across) - - - 22int16_tgyro_yY axis rotation (along) - - - 24int16_tgyro_zZ axis rotation (through) - - - 26int16_tmag_xX field strength (across) - - - 28int16_tmag_yY field strength (along) - - - 30int16_tmag_zZ field strength (through) - - - 32 - - - -
- - TeleMega Kalman and Voltage Data Packet Contents - - - - - - - - Offset - Data Type - Name - Description - - - - - 5uint8_tstateFlight state - - - 6int16_tv_battbattery voltage - - - 8int16_tv_pyropyro battery voltage - - - 10int8_t[6]sensepyro continuity sense - - - 16int32_tground_presAverage barometer reading on ground - - - 20int16_tground_accelAverage accelerometer reading on ground - - - 22int16_taccel_plus_gAccel calibration at +1g - - - 24int16_taccel_minus_gAccel calibration at -1g - - - 26int16_taccelerationm/s² * 16 - - - 28int16_tspeedm/s * 16 - - - 30int16_theightm - - - 32 - - - -
-
-
- TeleMetrum v2 Sensor Data - - - - - - - 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 - - - - - - - - Offset - Data Type - Name - Description - - - - - 5uint8_tstateFlight state - - - 6int16_taccelaccelerometer - - - 8int32_tprespressure sensor (Pa * 10) - - - 12int16_ttemptemperature sensor (°C * 100) - - - - 14int16_taccelerationm/s² * 16 - - - 16int16_tspeedm/s * 16 - - - 18int16_theightm - - - - 20int16_tv_battbattery voltage - - - 22int16_tsense_ddrogue continuity sense - - - 24int16_tsense_mmain continuity sense - - - 26pad[6]pad bytes - - - 32 - - - -
- - TeleMetrum v2 Calibration Data Packet Contents - - - - - - - - Offset - Data Type - Name - Description - - - - - 5pad[3]pad bytes - - - 8int32_tground_presAverage barometer reading on ground - - - 12int16_tground_accelAverage accelerometer reading on ground - - - 14int16_taccel_plus_gAccel calibration at +1g - - - 16int16_taccel_minus_gAccel calibration at -1g - - - 18pad[14]pad bytes - - - 32 - - - -
-
-
- Configuration Data - - - - - - - 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 - - - Sensor Packet Contents - - - - - - - - Offset - Data Type - Name - Description - - - - - 5uint8_ttypeDevice type - - - 6uint16_tflightFlight number - - - 8uint8_tconfig_majorConfig major version - - - 9uint8_tconfig_minorConfig minor version - - - 10uint16_tapogee_delay - Apogee deploy delay in seconds - - - 12uint16_tmain_deployMain deploy alt in meters - - - 14uint16_tflight_log_max - Maximum flight log size (kB) - - - 16charcallsign[8]Radio operator identifier - - - 24charversion[8]Software version identifier - - - 32 - - - -
-
-
- GPS Location - - - - - - - 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 - - - - - - - - Offset - Data Type - Name - Description - - - - - 5uint8_tflags - See GPS Flags table below - - - 6int16_taltitudem - - - 8int32_tlatitudedegrees * 107 - - - 12int32_tlongitudedegrees * 107 - - - 16uint8_tyear - - - 17uint8_tmonth - - - 18uint8_tday - - - 19uint8_thour - - - 20uint8_tminute - - - 21uint8_tsecond - - - 22uint8_tpdop* 5 - - - 23uint8_thdop* 5 - - - 24uint8_tvdop* 5 - - - 25uint8_tmode - See GPS Mode table below - - - 26uint16_tground_speedcm/s - - - 28int16_tclimb_ratecm/s - - - 30uint8_tcourse/ 2 - - - 31uint8_tunused[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 - - - - - - - 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 - - - - - - - Mode - Name - Decsription - - - - - 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 - - - - - - - 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 - - - - - - - - Offset - Data Type - Name - Description - - - - - 5uint8_tchannels - Number of reported satellite information - - - 6sat_info_tsats[12] - See Per-Satellite data table below - - - 30uint8_tunused[2] - - - 32 - - - -
- - GPS Per-Satellite data (sat_info_t) - - - - - - - - Offset - Data Type - Name - Description - - - - - 0uint8_tsvid - Space Vehicle Identifier - - - 1uint8_tc_n_1 - C/N1 signal quality indicator - - - 2 - - - -
-
-
- Companion Data Data - - - - - - - Type - Description - - - - - 0x07 - Companion Data 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 - - - - - - - - Offset - Data Type - Name - Description - - - - - 5uint8_tboard_id - Type of companion board attached - - - 6uint8_tupdate_period - How often telemetry is sent, in 1/100ths of a second - - - 7uint8_tchannels - Number of data channels supplied - - - 8uint16_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 - - - - - - - Part Number - Description - Used in - - - - - CC111110mW transceiver with integrated SoC - TeleDongle v0.2, TeleBT v1.0, TeleMetrum v1.x, TeleMini - - - CC112035mW transceiver with SW FEC - TeleMetrum v2, TeleMega - - - CC120035mW transceiver with HW FEC - TeleDongle v3.0, TeleBT v3.0 - - - CC115L14mW 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 - - - - - - - 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 - - - - - - - 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 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. - - - Packet Format - - - - - - - - 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. - -
-
-- cgit v1.2.3 From 5b782c8f45ed6c34ed0e7f1aff6ac298c9a879ff Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 31 Oct 2015 23:54:26 -0700 Subject: doc: Minor makefile cleanups Signed-off-by: Keith Packard --- doc/Makefile | 65 +++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 04402c88..29d3c428 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -22,7 +22,7 @@ RELNOTES_INC=\ release-notes-1.6.inc \ release-notes-1.6.1.inc -PICTURES=\ +IMAGES=\ altosui.png \ ascent.png \ configure-altimeter.png \ @@ -31,12 +31,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 \ @@ -47,6 +52,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 \ @@ -57,8 +63,25 @@ 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 @@ -134,42 +157,45 @@ SVG=\ RELNOTES_PDF=$(RELNOTES_INC:.inc=.pdf) RELNOTES_HTML=$(RELNOTES_INC:.inc=.html) -ALTOS_TXT_FILES=\ - altos.txt +ONEFILE_TXT_FILES=\ + altos.txt \ + companion.txt \ + telemetry.txt -ALTOS_RAW_FILES=$(ALTOS_TXT_FILES:.txt=.raw) -ALTOS_PDF_FILES=$(ALTOS_TXT_FILES:.txt=.pdf) +ONEFILE_RAW_FILES=$(ONEFILE_TXT_FILES:.txt=.raw) +ONEFILE_PDF_FILES=$(ONEFILE_TXT_FILES:.txt=.pdf) -HTML=altusmetrum.html altos.html telemetry.html companion.html micropeak.html telegps.html $(RELNOTES_HTML) +HTML=altusmetrum.html micropeak.html telegps.html $(RELNOTES_HTML) $(ONEFILE_HTML_FILES) -PDF=altusmetrum.pdf $(RELNOTES_PDF) $(ALTOS_PDF_FILES) telemetry.pdf companion.pdf micropeak.pdf telegps.pdf \ +PDF=altusmetrum.pdf micropeak.pdf telegps.pdf $(RELNOTES_PDF) $(ONEFILE_PDF_FILES) \ $(OUTLINE_PDF_FILES) -FOSTYLE=am-fo.xsl +FOP_STYLE=am-fo.xsl +FOP_XCONF=fop.xconf +STYLESHEET=am.css TEMPLATES_TMPL=titlepage.templates.tmpl TEMPLATES_XSL=$(TEMPLATES_TMPL:.tmpl=.xsl) -IMAGES=$(PICTURES) $(SVG) +PDF_CONFIG_FILES=$(FOP_STYLE) $(FOP_XCONF) $(TEMPLATES_XSL) +HTML_CONFIG_FILES=$(TEMPLATES_XSL) $(STYLESHEET) -DOC=$(HTML) $(PDF) $(IMAGES) +DOC=$(HTML) $(PDF) $(IMAGES) $(STYLESHEET) .SUFFIXES: .tmpl .xsl .inc .txt .raw .pdf .html -XSLTFLAGS=--stringparam section.autolabel 1 --xinclude - .txt.raw: - sed -e 's/@@VERSION@@/$(VERSION)/' -e 's/@@DATE@@/$(DATE)/' -e 's/^[ ]*//' -e 's/^\\//' $*.txt > $@ + sed -e 's/^[ ]*//' -e 's/^\\//' $*.txt > $@ .inc.raw: - sed -e 's/@@VERSION@@/$(VERSION)/' -e 's/@@DATE@@/$(DATE)/' -e 's/^[ ]*//' -e 's/^\\//' $*.inc > $@ + sed -e 's/^[ ]*//' -e 's/^\\//' $*.inc > $@ .raw.pdf: - a2x --verbose -a docinfo -f pdf --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file am-fo.xsl --fop --fop-opts="-c fop.xconf" $*.raw + a2x -a docinfo -f pdf --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(FOP_STYLE) --fop --fop-opts="-c $(FOP_XCONF)" $*.raw .raw.html: - a2x --verbose -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --stylesheet=am.css $*.raw + a2x -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --stylesheet=$(STYLESHEET) $*.raw .tmpl.xsl: xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.tmpl @@ -194,11 +220,14 @@ publish: $(DOC) git commit -F - /home/bdale/web/altusmetrum/AltOS/doc/* ; \ git push) +publish-keithp: $(DOC) + scp -p $(DOC) keithp.com:~keithp/public_html/altos + clean: rm -f $(HTML) $(PDF) $(TEMPLATES_XSL) $(RAW_FILES) $(TELEGPS_RAW_FILES) $(MICROPEAK_RAW_FILES) distclean: clean rm -f $(HTML) $(PDF) -$(PDF): $(FOSTYLE) $(TEMPLATES_XSL) -$(HTML): $(TEMPLATES_XSL) +$(PDF): $(PDF_CONFIG_FILES) +$(HTML): $(HTML_CONFIG_FILES) -- cgit v1.2.3 From f2816b305fc9e18a1190e392d43ff489936f10f0 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 1 Nov 2015 04:18:34 -0800 Subject: doc: Switch to free fonts. Publish fonts with docs. Signed-off-by: Keith Packard --- doc/Makefile | 20 +++++++-- doc/am-fo.xsl | 20 ++++----- doc/am.css | 69 ++++++++++++++++++++++++++++---- doc/fonts/FrutigerLTStd-Italic.otf | Bin 27736 -> 0 bytes doc/fonts/FrutigerLTStd-Light.otf | Bin 27440 -> 0 bytes doc/fonts/FrutigerLTStd-LightItalic.otf | Bin 27888 -> 0 bytes doc/fonts/FrutigerLTStd-Roman.otf | Bin 27328 -> 0 bytes doc/fonts/OpenSans-Bold.ttf | Bin 0 -> 224592 bytes doc/fonts/OpenSans-BoldItalic.ttf | Bin 0 -> 213292 bytes doc/fonts/OpenSans-ExtraBold.ttf | Bin 0 -> 222584 bytes doc/fonts/OpenSans-ExtraBoldItalic.ttf | Bin 0 -> 213420 bytes doc/fonts/OpenSans-Italic.ttf | Bin 0 -> 212896 bytes doc/fonts/OpenSans-Light.ttf | Bin 0 -> 222412 bytes doc/fonts/OpenSans-LightItalic.ttf | Bin 0 -> 213128 bytes doc/fonts/OpenSans-Regular.ttf | Bin 0 -> 217360 bytes doc/fonts/OpenSans-Semibold.ttf | Bin 0 -> 221328 bytes doc/fonts/OpenSans-SemiboldItalic.ttf | Bin 0 -> 212820 bytes doc/fop.xconf | 16 ++++---- 18 files changed, 98 insertions(+), 27 deletions(-) delete mode 100644 doc/fonts/FrutigerLTStd-Italic.otf delete mode 100644 doc/fonts/FrutigerLTStd-Light.otf delete mode 100644 doc/fonts/FrutigerLTStd-LightItalic.otf delete mode 100644 doc/fonts/FrutigerLTStd-Roman.otf create mode 100644 doc/fonts/OpenSans-Bold.ttf create mode 100644 doc/fonts/OpenSans-BoldItalic.ttf create mode 100644 doc/fonts/OpenSans-ExtraBold.ttf create mode 100644 doc/fonts/OpenSans-ExtraBoldItalic.ttf create mode 100644 doc/fonts/OpenSans-Italic.ttf create mode 100644 doc/fonts/OpenSans-Light.ttf create mode 100644 doc/fonts/OpenSans-LightItalic.ttf create mode 100644 doc/fonts/OpenSans-Regular.ttf create mode 100644 doc/fonts/OpenSans-Semibold.ttf create mode 100644 doc/fonts/OpenSans-SemiboldItalic.ttf diff --git a/doc/Makefile b/doc/Makefile index 29d3c428..0b66a1d1 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -174,6 +174,16 @@ FOP_STYLE=am-fo.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-Semibold.ttf \ + fonts/OpenSans-SemiboldItalic.ttf + TEMPLATES_TMPL=titlepage.templates.tmpl TEMPLATES_XSL=$(TEMPLATES_TMPL:.tmpl=.xsl) @@ -212,16 +222,20 @@ micropeak.pdf micropeak.html: micropeak-docinfo.xml $(MICROPEAK_RAW_FILES) $(IMA 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: $(DOC) +publish-keithp: $(DOC) $(FONTS) scp -p $(DOC) keithp.com:~keithp/public_html/altos + scp -p $(FONTS) keithp.com:~keithp/public_html/altos/fonts clean: rm -f $(HTML) $(PDF) $(TEMPLATES_XSL) $(RAW_FILES) $(TELEGPS_RAW_FILES) $(MICROPEAK_RAW_FILES) diff --git a/doc/am-fo.xsl b/doc/am-fo.xsl index 35279f22..2166afd4 100644 --- a/doc/am-fo.xsl +++ b/doc/am-fo.xsl @@ -30,8 +30,8 @@ left - - + + 12 @@ -43,9 +43,6 @@ 10 1 1 - - - @@ -108,6 +105,12 @@ +0.5pt +#0080ff +0.5pt +0.5pt +#0080ff + 12pt @@ -122,15 +125,14 @@ - 0.5pt solid black - #EEEEEE + 0.5pt solid #0080ff 50% - 0.5pt solid black + 0.5pt solid #0080ff 12pt - 4pt + 2pt diff --git a/doc/am.css b/doc/am.css index 2461e111..e939245c 100644 --- a/doc/am.css +++ b/doc/am.css @@ -2,9 +2,65 @@ 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: "Frutiger LT Std 45 Light",sans-serif; - font-size: 14pt; + font-family: "Open Sans",sans-serif; + font-size: 12pt; } code, pre { @@ -41,7 +97,7 @@ a:visited { h1, h2, h3, h4, h5, h6 { color: #0080ff; - font-family: "Frutiger LT Std 45 Light",sans-serif; + font-family: "Open Sans",sans-serif; } div.revhistory table { @@ -63,7 +119,7 @@ div.sidebar p.title { font-weight: normal; color: #0080ff; - font-family: "Frutiger LT Std 45 Light",sans-serif; + font-family: "Open Sans",sans-serif; margin-bottom: 0.2em; } @@ -108,8 +164,8 @@ div.footnotes hr { } div.navheader th, div.navheader td, div.navfooter td { - font-family: "Frutiger LT Std 45 Light",sans-serif; - font-size: 14pt; + font-family: "Open Sans",sans-serif; + font-size: 12pt; font-weight: normal; color: #0080ff; } @@ -244,7 +300,6 @@ div.revhistory table, th, td, tr { } div.revhistory th { color: #0080ff; - font-family: "Frutiger LT Std 45 Light",sans-serif; } /* Keep TOC and index lines close together. */ diff --git a/doc/fonts/FrutigerLTStd-Italic.otf b/doc/fonts/FrutigerLTStd-Italic.otf deleted file mode 100644 index c02ecd00..00000000 Binary files a/doc/fonts/FrutigerLTStd-Italic.otf and /dev/null differ diff --git a/doc/fonts/FrutigerLTStd-Light.otf b/doc/fonts/FrutigerLTStd-Light.otf deleted file mode 100644 index 6d013a61..00000000 Binary files a/doc/fonts/FrutigerLTStd-Light.otf and /dev/null differ diff --git a/doc/fonts/FrutigerLTStd-LightItalic.otf b/doc/fonts/FrutigerLTStd-LightItalic.otf deleted file mode 100644 index 70237778..00000000 Binary files a/doc/fonts/FrutigerLTStd-LightItalic.otf and /dev/null differ diff --git a/doc/fonts/FrutigerLTStd-Roman.otf b/doc/fonts/FrutigerLTStd-Roman.otf deleted file mode 100644 index a6d6edbc..00000000 Binary files a/doc/fonts/FrutigerLTStd-Roman.otf and /dev/null differ diff --git a/doc/fonts/OpenSans-Bold.ttf b/doc/fonts/OpenSans-Bold.ttf new file mode 100644 index 00000000..fd79d43b Binary files /dev/null and b/doc/fonts/OpenSans-Bold.ttf differ diff --git a/doc/fonts/OpenSans-BoldItalic.ttf b/doc/fonts/OpenSans-BoldItalic.ttf new file mode 100644 index 00000000..9bc80095 Binary files /dev/null and b/doc/fonts/OpenSans-BoldItalic.ttf differ diff --git a/doc/fonts/OpenSans-ExtraBold.ttf b/doc/fonts/OpenSans-ExtraBold.ttf new file mode 100644 index 00000000..21f6f84a Binary files /dev/null and b/doc/fonts/OpenSans-ExtraBold.ttf differ diff --git a/doc/fonts/OpenSans-ExtraBoldItalic.ttf b/doc/fonts/OpenSans-ExtraBoldItalic.ttf new file mode 100644 index 00000000..31cb6883 Binary files /dev/null and b/doc/fonts/OpenSans-ExtraBoldItalic.ttf differ diff --git a/doc/fonts/OpenSans-Italic.ttf b/doc/fonts/OpenSans-Italic.ttf new file mode 100644 index 00000000..c90da48f Binary files /dev/null and b/doc/fonts/OpenSans-Italic.ttf differ diff --git a/doc/fonts/OpenSans-Light.ttf b/doc/fonts/OpenSans-Light.ttf new file mode 100644 index 00000000..0d381897 Binary files /dev/null and b/doc/fonts/OpenSans-Light.ttf differ diff --git a/doc/fonts/OpenSans-LightItalic.ttf b/doc/fonts/OpenSans-LightItalic.ttf new file mode 100644 index 00000000..68299c4b Binary files /dev/null and b/doc/fonts/OpenSans-LightItalic.ttf differ diff --git a/doc/fonts/OpenSans-Regular.ttf b/doc/fonts/OpenSans-Regular.ttf new file mode 100644 index 00000000..db433349 Binary files /dev/null and b/doc/fonts/OpenSans-Regular.ttf differ diff --git a/doc/fonts/OpenSans-Semibold.ttf b/doc/fonts/OpenSans-Semibold.ttf new file mode 100644 index 00000000..1a7679e3 Binary files /dev/null and b/doc/fonts/OpenSans-Semibold.ttf differ diff --git a/doc/fonts/OpenSans-SemiboldItalic.ttf b/doc/fonts/OpenSans-SemiboldItalic.ttf new file mode 100644 index 00000000..59b6d16b Binary files /dev/null and b/doc/fonts/OpenSans-SemiboldItalic.ttf differ diff --git a/doc/fop.xconf b/doc/fop.xconf index 0f470ffd..9ac42820 100644 --- a/doc/fop.xconf +++ b/doc/fop.xconf @@ -38,20 +38,20 @@ the location of this file. - - + - - + - - + - - + -- cgit v1.2.3 From 1c0f2cd7cbd8fa1360d6b18a1bf8ac0707634aa4 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 1 Nov 2015 04:20:18 -0800 Subject: doc: Place html book contents on left side of page with separate scrollbar This lets the user see the toc while browsing the document Signed-off-by: Keith Packard --- doc/am.css | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/doc/am.css b/doc/am.css index e939245c..c2faa015 100644 --- a/doc/am.css +++ b/doc/am.css @@ -110,6 +110,74 @@ div titlepage { 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%; +} + +div.toc { + position: fixed; + left: 0px; + top: 0px; + height: 100%; + width: 25em; + margin-right: 5ex; + margin-left: 0px; + float: left; + border-right: 2px solid #0080ff; + border-collapse: collapse; + overflow: auto; +} + +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.toc p:first-child, div.list-of-figures p:first-child, div.list-of-tables p:first-child, -- cgit v1.2.3 From edcb80f25875200a73269045db71c1579b0c2c82 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 1 Nov 2015 04:22:27 -0800 Subject: doc: Split revhistory to separate file for html docs This avoids having the revhistory clutter the top of the document. Signed-off-by: Keith Packard --- doc/Makefile | 20 ++++++++++++++++---- doc/altos-docinfo.xml | 1 + doc/altusmetrum-docinfo.xml | 1 + doc/am-html.xsl | 14 ++++++++++++++ doc/am.css | 36 ++++++++++++++++++++---------------- doc/common.xsl | 26 ++++++++++++++++++++++---- doc/companion-docinfo.xml | 1 + doc/micropeak-docinfo.xml | 1 + doc/telegps-docinfo.xml | 1 + doc/telemetry-docinfo.xml | 1 + 10 files changed, 78 insertions(+), 24 deletions(-) create mode 100644 doc/am-html.xsl diff --git a/doc/Makefile b/doc/Makefile index 0b66a1d1..d3c88b37 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -167,10 +167,16 @@ ONEFILE_PDF_FILES=$(ONEFILE_TXT_FILES:.txt=.pdf) HTML=altusmetrum.html micropeak.html telegps.html $(RELNOTES_HTML) $(ONEFILE_HTML_FILES) +HTML_REVHISTORY=\ + altusmetrum-revhistory.html \ + micropeak-revhistory.html \ + telegps-revhistory.html + PDF=altusmetrum.pdf micropeak.pdf telegps.pdf $(RELNOTES_PDF) $(ONEFILE_PDF_FILES) \ $(OUTLINE_PDF_FILES) FOP_STYLE=am-fo.xsl +HTML_STYLE=am-html.xsl FOP_XCONF=fop.xconf STYLESHEET=am.css @@ -189,9 +195,9 @@ TEMPLATES_TMPL=titlepage.templates.tmpl TEMPLATES_XSL=$(TEMPLATES_TMPL:.tmpl=.xsl) PDF_CONFIG_FILES=$(FOP_STYLE) $(FOP_XCONF) $(TEMPLATES_XSL) -HTML_CONFIG_FILES=$(TEMPLATES_XSL) $(STYLESHEET) +HTML_CONFIG_FILES=$(TEMPLATES_XSL) -DOC=$(HTML) $(PDF) $(IMAGES) $(STYLESHEET) +DOC=$(HTML) $(HTML_REVHISTORY) $(PDF) $(IMAGES) $(STYLESHEET) .SUFFIXES: .tmpl .xsl .inc .txt .raw .pdf .html @@ -205,7 +211,7 @@ DOC=$(HTML) $(PDF) $(IMAGES) $(STYLESHEET) a2x -a docinfo -f pdf --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(FOP_STYLE) --fop --fop-opts="-c $(FOP_XCONF)" $*.raw .raw.html: - a2x -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --stylesheet=$(STYLESHEET) $*.raw + a2x -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(HTML_STYLE) --stylesheet=$(STYLESHEET) $*.raw .tmpl.xsl: xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.tmpl @@ -214,6 +220,12 @@ all: $(HTML) $(PDF) $(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) $(RAW_INC) $(IMAGES) telegps.html telegps.pdf: telegps-docinfo.xml $(TELEGPS_RAW_FILES) $(IMAGES) @@ -238,7 +250,7 @@ publish-keithp: $(DOC) $(FONTS) scp -p $(FONTS) keithp.com:~keithp/public_html/altos/fonts clean: - rm -f $(HTML) $(PDF) $(TEMPLATES_XSL) $(RAW_FILES) $(TELEGPS_RAW_FILES) $(MICROPEAK_RAW_FILES) + rm -f $(HTML) $(HTML_REVHISTORY) $(PDF) $(TEMPLATES_XSL) $(RAW_FILES) $(TELEGPS_RAW_FILES) $(MICROPEAK_RAW_FILES) distclean: clean rm -f $(HTML) $(PDF) diff --git a/doc/altos-docinfo.xml b/doc/altos-docinfo.xml index 1b6ad648..b9193a8f 100644 --- a/doc/altos-docinfo.xml +++ b/doc/altos-docinfo.xml @@ -19,6 +19,7 @@ + 1.1 05 November 2012 diff --git a/doc/altusmetrum-docinfo.xml b/doc/altusmetrum-docinfo.xml index 19c1e5d9..11df900c 100644 --- a/doc/altusmetrum-docinfo.xml +++ b/doc/altusmetrum-docinfo.xml @@ -36,6 +36,7 @@ + 1.6.1 15 July 2015 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 @@ + + + + + diff --git a/doc/am.css b/doc/am.css index c2faa015..7723b14a 100644 --- a/doc/am.css +++ b/doc/am.css @@ -348,24 +348,16 @@ div.variablelist p.title margin-bottom: -0.8em; } -table { - border: none; -} - div.revhistory { border-style: none; } -div.revhistory table, th, td, tr { - margin-top: 1em; - border-width: 1px; +div.revhistory table, div.revhistory th, div.revhistory td { border-collapse: collapse; - border-top: 1px; - border-bottom: 1px; - border-left: 1px; - border-right: 1px; - border: 1px solid black; + border: 1px solid #0080ff; + padding: 0.25em; } + div.revhistory th { color: #0080ff; } @@ -385,12 +377,18 @@ div.indexdiv dl, div.indexdiv dt Table styling does not work because of overriding attributes in generated HTML. */ +div.table-contents p, +div.informaltable p +{ + margin: 0px; +} +/* div.table table, div.informaltable table { margin-left: 0; - margin-right: 5%; - margin-bottom: 0.8em; + margin-right: 0.25em; + margin-bottom: 0.25em; } div.informaltable table { @@ -404,9 +402,15 @@ div.informaltable tfoot, div.informaltable tbody { /* No effect in IE6. */ - border-top: 3px solid #527bbd; - border-bottom: 3px solid #527bbd; + border-top: 1px solid #0080ff; + border-bottom: 1px solid #0080ff; + border-left: 1px solid #0080ff; + border-right: 1px solid #0080ff !important; + border-width: 1px !important; } +*/ + + div.table thead, div.table tfoot, div.informaltable thead, div.informaltable tfoot { diff --git a/doc/common.xsl b/doc/common.xsl index 2e5cbc23..1bb323c0 100644 --- a/doc/common.xsl +++ b/doc/common.xsl @@ -56,17 +56,35 @@ - - + - + - + + + 12pt + bold + center + + + + 0.5pt solid #0080ff + 50% + + + + 0.5pt solid #0080ff + 12pt + 2pt + + + + diff --git a/doc/companion-docinfo.xml b/doc/companion-docinfo.xml index 2e0bc567..243bded0 100644 --- a/doc/companion-docinfo.xml +++ b/doc/companion-docinfo.xml @@ -19,6 +19,7 @@ + 0.1 13 January 2012 diff --git a/doc/micropeak-docinfo.xml b/doc/micropeak-docinfo.xml index b401a193..4b33e0be 100644 --- a/doc/micropeak-docinfo.xml +++ b/doc/micropeak-docinfo.xml @@ -23,6 +23,7 @@ + 1.3.2 12 February 2014 diff --git a/doc/telegps-docinfo.xml b/doc/telegps-docinfo.xml index fcceae3f..633e56cc 100644 --- a/doc/telegps-docinfo.xml +++ b/doc/telegps-docinfo.xml @@ -28,6 +28,7 @@ + 1.6.1 15 July 2015 diff --git a/doc/telemetry-docinfo.xml b/doc/telemetry-docinfo.xml index c7b1f060..19f90ca4 100644 --- a/doc/telemetry-docinfo.xml +++ b/doc/telemetry-docinfo.xml @@ -19,6 +19,7 @@ + 0.1 1 July 2011 -- cgit v1.2.3 From 553d9041b52cbb88662fcc5e6a277ce43bd151cd Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 1 Nov 2015 04:23:56 -0800 Subject: doc: Get images and tables all centered and labeled A bunch of images were using image: instead of image:: and some images and tables were missing titles. Signed-off-by: Keith Packard --- doc/altosui.inc | 80 +++++++++++++++++++++++++-------------------------- doc/easymega.inc | 1 + doc/easymini.inc | 20 ++++++++----- doc/micropeak.txt | 24 ++++++++-------- doc/specs.inc | 2 ++ doc/telemega.inc | 1 + doc/telemetrum.inc | 1 + doc/telemini-v1.0.inc | 1 + doc/telemini-v2.0.inc | 1 + 9 files changed, 72 insertions(+), 59 deletions(-) diff --git a/doc/altosui.inc b/doc/altosui.inc index fb034ad8..a7bf4449 100644 --- a/doc/altosui.inc +++ b/doc/altosui.inc @@ -677,7 +677,8 @@ === Configure AltosUI - image:configure-altosui.png[width="2.4in"] + .Configure AltosUI Dialog + image::configure-altosui.png[width="2.4in"] This button presents a dialog so that you can configure the AltosUI global settings. @@ -770,45 +771,44 @@ === Configure Groundstation - 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. + .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 diff --git a/doc/easymega.inc b/doc/easymega.inc index f6c06431..c126004b 100644 --- a/doc/easymega.inc +++ b/doc/easymega.inc @@ -14,6 +14,7 @@ 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 diff --git a/doc/easymini.inc b/doc/easymini.inc index a7f06c01..fb2b6098 100644 --- a/doc/easymini.inc +++ b/doc/easymini.inc @@ -4,19 +4,25 @@ 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. The connectors and - screw terminals match TeleMini v2.0, so you can easily swap between - EasyMini and TeleMini. + 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 on the end of the - board opposite the telemetry antenna. Using the picture + 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 @@ -53,7 +59,7 @@ |Switch connection to positive battery terminal |==== - === Connecting A Battery To TeleMini v2.0 + === Connecting A Battery To EasyMini There are two possible battery connections on EasyMini. You can use either method; both feed @@ -84,7 +90,7 @@ 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 TeleMini + To connect the negative pyro battery terminal to EasyMini ground, connect it to the negative external battery connection, top terminal 4. diff --git a/doc/micropeak.txt b/doc/micropeak.txt index d62e4633..085be0ed 100644 --- a/doc/micropeak.txt +++ b/doc/micropeak.txt @@ -78,7 +78,7 @@ == The MicroPeak USB adapter .MicroPeak USB Adapter - image::MicroPeakUSB-2.0.jpg[width="4.5in"] + 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 @@ -103,25 +103,25 @@ * Start the MicroPeak application. - image::micropeak-nofont.svg[width="0.5in"] + 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"] + 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"] + 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"] + image::micropeak-download.png[width="2in",align="center"] * The MicroPeak USB adapter has a small phototransistor under the hole in the center of the @@ -133,7 +133,7 @@ MicroPeak board itself. .MicroPeak Downloading - image::MicroPeakUSB-2.0-inuse.jpg[width="4.5in"] + 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 @@ -145,7 +145,7 @@ MicroPeak board and try again. .MicroPeak Save Dialog - image::micropeak-save-dialog.png[width="2.3in"] + 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 @@ -185,7 +185,7 @@ ==== MicroPeak Graphs .MicroPeak Graph - image::micropeak-graph.png[width="4.5in"] + 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 @@ -196,7 +196,7 @@ ==== MicroPeak Flight Statistics .MicroPeak Flight Statistics - image::micropeak-statistics.png[width="4.5in"] + image::micropeak-statistics.png[width="4.5in",align="center"] The Statistics tab presents overall data from the flight. Note that the Maximum height value @@ -211,7 +211,7 @@ ==== Raw Flight Data .MicroPeak Raw Flight Data - image::micropeak-raw-data.png[width="4.5in"] + 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. @@ -219,7 +219,7 @@ ==== Configuring the Graph .MicroPeak Graph Configuration - image::micropeak-graph-configure.png[width="4.5in"] + 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 @@ -227,7 +227,7 @@ === Setting MicroPeak Preferences .MicroPeak Preferences - image::micropeak-preferences.png[width="1.8in"] + 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 diff --git a/doc/specs.inc b/doc/specs.inc index 0991bd2d..6af3bd76 100644 --- a/doc/specs.inc +++ b/doc/specs.inc @@ -4,6 +4,7 @@ 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 @@ -91,6 +92,7 @@ |============================== <<<< + .Altus Metrum Flight Computer Mechanical Components [options="header",grid="all"] |============================== |Device|Connectors|Screw Terminals|Width|Length|Tube Size diff --git a/doc/telemega.inc b/doc/telemega.inc index fcfd8d8e..4383f228 100644 --- a/doc/telemega.inc +++ b/doc/telemega.inc @@ -14,6 +14,7 @@ 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 diff --git a/doc/telemetrum.inc b/doc/telemetrum.inc index fa7d202c..7c9dadb5 100644 --- a/doc/telemetrum.inc +++ b/doc/telemetrum.inc @@ -37,6 +37,7 @@ 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 diff --git a/doc/telemini-v1.0.inc b/doc/telemini-v1.0.inc index ea70ac2a..e0d674f6 100644 --- a/doc/telemini-v1.0.inc +++ b/doc/telemini-v1.0.inc @@ -26,6 +26,7 @@ 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 diff --git a/doc/telemini-v2.0.inc b/doc/telemini-v2.0.inc index bd6756a8..5803a2ca 100644 --- a/doc/telemini-v2.0.inc +++ b/doc/telemini-v2.0.inc @@ -18,6 +18,7 @@ connections for the apogee pyro circuit and the power switch. Counting from the left, the connections are as follows: + .TeleMini v2.0 Screw Terminals [options="header",grid="all",cols="2,3,10"] |==== |Terminal #|Terminal Name|Description -- cgit v1.2.3 From 13d03ee8ba3a300ef2a3a380b60f08dbe37793b0 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 1 Nov 2015 05:08:27 -0800 Subject: doc: Make pdf titles less ridiculously large Instead of having them grow at 20% per nesting level, use 10% instead. Signed-off-by: Keith Packard --- doc/am-fo.xsl | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/doc/am-fo.xsl b/doc/am-fo.xsl index 2166afd4..5743a24c 100644 --- a/doc/am-fo.xsl +++ b/doc/am-fo.xsl @@ -33,7 +33,7 @@ -12 +11 pt @@ -112,14 +112,49 @@ #0080ff + + + + pt + + + + + + + pt + + + + + + + pt + + + + + + + pt + + + + + + + pt + + + - 12pt + 11pt bold center - 12pt + 11pt bold center @@ -131,12 +166,12 @@ 0.5pt solid #0080ff - 12pt + 11pt 2pt - 9pt + 11pt -- cgit v1.2.3 From c877ecce7b67272eb6dcba50a58b59cd1cbfa5ab Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 1 Nov 2015 05:43:59 -0800 Subject: doc: verbose mode for a2x --- doc/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index d3c88b37..2aecc230 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -208,10 +208,10 @@ DOC=$(HTML) $(HTML_REVHISTORY) $(PDF) $(IMAGES) $(STYLESHEET) sed -e 's/^[ ]*//' -e 's/^\\//' $*.inc > $@ .raw.pdf: - a2x -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 pdf --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(FOP_STYLE) --fop --fop-opts="-c $(FOP_XCONF)" $*.raw .raw.html: - a2x -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(HTML_STYLE) --stylesheet=$(STYLESHEET) $*.raw + a2x --verbose -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(HTML_STYLE) --stylesheet=$(STYLESHEET) $*.raw .tmpl.xsl: xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.tmpl -- cgit v1.2.3 From 8642690da76a86736b97026e2a259d8cbad26262 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 1 Nov 2015 06:20:27 -0800 Subject: altosui: telemini outline pdf changed name It's now telemini-outline.pdf, just like the other outline files. Signed-off-by: Keith Packard --- altosui/Makefile.am | 2 +- altosui/altos-windows.nsi.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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" -- cgit v1.2.3 From ef2ba847ca53a8ddfcddd4e51a0dd43c45161c85 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 1 Nov 2015 21:05:20 -0800 Subject: doc: Add product logos to books This places the product logo on the title verso in pdf form, and above the TOC in html form. Signed-off-by: Keith Packard --- doc/Makefile | 12 +- doc/altusmetrum-docinfo.xml | 9 ++ doc/altusmetrum-oneline.svg | 354 +++++++++++++++++++++++++++++++++++++++++ doc/am-fo.xsl | 14 +- doc/am.css | 40 +++-- doc/common.xsl | 8 +- doc/micropeak-docinfo.xml | 7 + doc/micropeak-oneline-font.svg | 199 +++++++++++++++++++++++ doc/micropeak-oneline.svg | 239 ++++++++++++++++++++++++++++ doc/telegps-docinfo.xml | 8 + doc/telegps-oneline-font.svg | 304 +++++++++++++++++++++++++++++++++++ doc/telegps-oneline.svg | 332 ++++++++++++++++++++++++++++++++++++++ doc/titlepage.templates.tmpl | 62 ++++---- 13 files changed, 1529 insertions(+), 59 deletions(-) create mode 100644 doc/altusmetrum-oneline.svg create mode 100644 doc/micropeak-oneline-font.svg create mode 100644 doc/micropeak-oneline.svg create mode 100644 doc/telegps-oneline-font.svg create mode 100644 doc/telegps-oneline.svg diff --git a/doc/Makefile b/doc/Makefile index 2aecc230..89a302ff 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -83,7 +83,10 @@ IMAGES=\ telemetrum-v2.0-th.jpg \ telemini.svg \ telemini-v1-top.jpg \ - telemini-v2-top.jpg + telemini-v2-top.jpg \ + altusmetrum-oneline.svg \ + telegps-oneline.svg \ + micropeak-oneline.svg TXT_FILES=altusmetrum.txt @@ -177,6 +180,7 @@ PDF=altusmetrum.pdf micropeak.pdf telegps.pdf $(RELNOTES_PDF) $(ONEFILE_PDF_FILE FOP_STYLE=am-fo.xsl HTML_STYLE=am-html.xsl +COMMON_STYLE=common.xsl FOP_XCONF=fop.xconf STYLESHEET=am.css @@ -187,6 +191,8 @@ FONTS=\ 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 @@ -194,8 +200,8 @@ TEMPLATES_TMPL=titlepage.templates.tmpl TEMPLATES_XSL=$(TEMPLATES_TMPL:.tmpl=.xsl) -PDF_CONFIG_FILES=$(FOP_STYLE) $(FOP_XCONF) $(TEMPLATES_XSL) -HTML_CONFIG_FILES=$(TEMPLATES_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) diff --git a/doc/altusmetrum-docinfo.xml b/doc/altusmetrum-docinfo.xml index 11df900c..69a769b6 100644 --- a/doc/altusmetrum-docinfo.xml +++ b/doc/altusmetrum-docinfo.xml @@ -26,6 +26,15 @@ + + + + + + + + + This document is released under the terms of the 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 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/am-fo.xsl b/doc/am-fo.xsl index 5743a24c..605339d4 100644 --- a/doc/am-fo.xsl +++ b/doc/am-fo.xsl @@ -106,10 +106,10 @@ 0.5pt -#0080ff +#78079a 0.5pt 0.5pt -#0080ff +#78079a @@ -160,12 +160,12 @@ - 0.5pt solid #0080ff + 0.5pt solid #78079a 50% - 0.5pt solid #0080ff + 0.5pt solid #78079a 11pt 2pt @@ -176,12 +176,12 @@ normal - #0080ff + #78079a normal - #0080ff + #78079a @@ -191,7 +191,7 @@ normal - #0080ff + #78079a diff --git a/doc/am.css b/doc/am.css index 7723b14a..1dee27ea 100644 --- a/doc/am.css +++ b/doc/am.css @@ -87,16 +87,16 @@ body div { } a:link { - color: #0080ff; + color: #78079a; } a:visited { - color: #0080ff; + color: #78079a; } h1, h2, h3, h4, h5, h6 { - color: #0080ff; + color: #78079a; font-family: "Open Sans",sans-serif; } @@ -119,16 +119,26 @@ div.warning p, div.note p, div.error p { margin-left: 5%; } -div.toc { +h3.corpauthor img { position: fixed; left: 0px; top: 0px; - height: 100%; - width: 25em; + width: 410px; + height: 90px; + border-right: 2px solid #78079a; + border-bottom: 2px solid #78079a; +} + +div.toc { + position: fixed; + left: 0px; + top: 92px; + bottom: 0; + width: 410px; margin-right: 5ex; margin-left: 0px; float: left; - border-right: 2px solid #0080ff; + border-right: 2px solid #78079a; border-collapse: collapse; overflow: auto; } @@ -186,7 +196,7 @@ div.example p.title, div.sidebar p.title { font-weight: normal; - color: #0080ff; + color: #78079a; font-family: "Open Sans",sans-serif; margin-bottom: 0.2em; } @@ -235,7 +245,7 @@ div.navheader th, div.navheader td, div.navfooter td { font-family: "Open Sans",sans-serif; font-size: 12pt; font-weight: normal; - color: #0080ff; + color: #78079a; } div.navheader img, div.navfooter img { border-style: none; @@ -354,12 +364,12 @@ div.revhistory { div.revhistory table, div.revhistory th, div.revhistory td { border-collapse: collapse; - border: 1px solid #0080ff; + border: 1px solid #78079a; padding: 0.25em; } div.revhistory th { - color: #0080ff; + color: #78079a; } /* Keep TOC and index lines close together. */ @@ -402,10 +412,10 @@ div.informaltable tfoot, div.informaltable tbody { /* No effect in IE6. */ - border-top: 1px solid #0080ff; - border-bottom: 1px solid #0080ff; - border-left: 1px solid #0080ff; - border-right: 1px solid #0080ff !important; + border-top: 1px solid #78079a; + border-bottom: 1px solid #78079a; + border-left: 1px solid #78079a; + border-right: 1px solid #78079a !important; border-width: 1px !important; } */ diff --git a/doc/common.xsl b/doc/common.xsl index 1bb323c0..94b120af 100644 --- a/doc/common.xsl +++ b/doc/common.xsl @@ -56,12 +56,12 @@ - + - + @@ -73,12 +73,12 @@ - 0.5pt solid #0080ff + 0.5pt solid #78079a 50% - 0.5pt solid #0080ff + 0.5pt solid #78079a 12pt 2pt diff --git a/doc/micropeak-docinfo.xml b/doc/micropeak-docinfo.xml index 4b33e0be..37c6e770 100644 --- a/doc/micropeak-docinfo.xml +++ b/doc/micropeak-docinfo.xml @@ -13,6 +13,13 @@ + + + + + + + This document is released under the terms of the 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + μ + + + MicroPeak + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/telegps-docinfo.xml b/doc/telegps-docinfo.xml index 633e56cc..4ba3f73c 100644 --- a/doc/telegps-docinfo.xml +++ b/doc/telegps-docinfo.xml @@ -18,6 +18,14 @@ + + + + + + + + This document is released under the terms of the 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + TeleGPS + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/doc/titlepage.templates.tmpl b/doc/titlepage.templates.tmpl index 9de1b31f..1669e465 100644 --- a/doc/titlepage.templates.tmpl +++ b/doc/titlepage.templates.tmpl @@ -132,35 +132,37 @@ - - - - <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 @@ -168,7 +170,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 @@ -181,6 +182,7 @@ <copyright/> <abstract/> <legalnotice font-size="8pt"/> + <corpauthor text-align="center"/> <revhistory space-before="0.5in"/> </t:titlepage-content> -- cgit v1.2.3 From 4c1206a47431c7d873228fdd7328e1b9ac93a390 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Fri, 13 Nov 2015 19:45:02 -0800 Subject: Break out common pieces from TeleGPS and AltusMetrum This creates shared files for portions of the TeleGPS and AltusMetrum manual to avoid duplicating text between the two. Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/Makefile | 19 +- doc/altosui.inc | 346 +-------------------------------- doc/altusmetrum.txt | 2 + doc/aprs-operation.inc | 85 ++++++++ doc/config-device.inc | 240 +++++++++++++++++++++++ doc/config-ui.inc | 105 ++++++++++ doc/installation.inc | 15 +- doc/load-maps.inc | 60 ++++++ doc/micropeak.txt | 4 +- doc/release-notes-0.9.inc | 4 +- doc/system-operation.inc | 404 ++++----------------------------------- doc/telegps-application.inc | 224 +--------------------- doc/telegps-dedication.inc | 19 ++ doc/telegps-quick-start.inc | 13 +- doc/telegps-system-operation.inc | 126 +----------- doc/telegps.txt | 4 +- doc/usage.inc | 142 ++++++++++++-- 17 files changed, 728 insertions(+), 1084 deletions(-) create mode 100644 doc/aprs-operation.inc create mode 100644 doc/config-device.inc create mode 100644 doc/config-ui.inc create mode 100644 doc/load-maps.inc create mode 100644 doc/telegps-dedication.inc diff --git a/doc/Makefile b/doc/Makefile index 89a302ff..f8fdb5e8 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -90,6 +90,13 @@ IMAGES=\ 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 \ @@ -109,23 +116,23 @@ INC_FILES=\ system-operation.inc \ pyro-channels.inc \ flight-data-recording.inc \ - handling.inc \ specs.inc \ + $(COMMON_INC_FILES) \ release-notes.inc \ $(RELNOTES_INC) RAW_FILES=$(TXT_FILES:.txt=.raw) $(INC_FILES:.inc=.raw) TELEGPS_INC_FILES=\ - dedication.inc \ + telegps-dedication.inc \ telegps-quick-start.inc \ telegps-using.inc \ telegps-system-operation.inc \ telegps-application.inc \ - handling.inc \ telegps-specs.inc \ telegps-updating-firmware.inc \ - telegps-release-notes.inc + telegps-release-notes.inc \ + $(COMMON_INC_FILES) TELEGPS_TXT_FILES=\ telegps.txt @@ -214,10 +221,10 @@ DOC=$(HTML) $(HTML_REVHISTORY) $(PDF) $(IMAGES) $(STYLESHEET) 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 icons -a docinfo -f pdf --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(FOP_STYLE) --fop --fop-opts="-c $(FOP_XCONF)" $*.raw .raw.html: - a2x --verbose -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(HTML_STYLE) --stylesheet=$(STYLESHEET) $*.raw + a2x --verbose -a icons -a docinfo -f xhtml --xsltproc-opts "--stringparam toc.section.depth 2" --xsl-file $(HTML_STYLE) --stylesheet=$(STYLESHEET) $*.raw .tmpl.xsl: xsltproc --output $@ /usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl $*.tmpl diff --git a/doc/altosui.inc b/doc/altosui.inc index a7bf4449..df5a3cee 100644 --- a/doc/altosui.inc +++ b/doc/altosui.inc @@ -285,8 +285,7 @@ traced on a dark gray background instead. You can pre-load images for your favorite launch sites - before you leave home; check out the 'Preload Maps' - section below. + before you leave home; check out <<_load_maps>>. ==== Igniter @@ -478,202 +477,8 @@ The rest of the dialog contains the parameters to be configured. - ==== 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. + include::config-device.raw[] - ==== 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. 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. - - ==== 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. - - ==== Callsign - - This sets the call sign included in each - telemetry packet. Set this as needed to - conform to your local radio regulations. - - ==== 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. - - ==== 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. - - ==== 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. - - ==== 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[] === Configure AltosUI @@ -683,91 +488,7 @@ This button presents a dialog so that you can configure the AltosUI global settings. - ==== Voice Settings - - 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. - - 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 - - ==== Log Directory - - 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. - - 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. - - ==== 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 AltosUI - 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. - - ==== 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. - - ==== Font Size - - Selects the set of fonts used in the flight - monitor window. Choose between the small, - medium and large sets. - - ==== Serial Debug - - 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. - - ==== 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. + include::config-ui.raw[] === Configure Groundstation @@ -890,66 +611,7 @@ with the standard telemetry format used in v1.0 and later firmware. - === 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. + include::load-maps.raw[] === Monitor Idle diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt index a2f78dda..f8d284ec 100644 --- a/doc/altusmetrum.txt +++ b/doc/altusmetrum.txt @@ -1,6 +1,8 @@ = The Altus Metrum System :doctype: book :numbered: +:altusmetrum: 1 +:application: AltosUI include::dedication.raw[] diff --git a/doc/aprs-operation.inc b/doc/aprs-operation.inc new file mode 100644 index 00000000..e514e110 --- /dev/null +++ b/doc/aprs-operation.inc @@ -0,0 +1,85 @@ + === 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}>> in the {application} chapter. + + 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 about the flight computer. It sends four fields 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 + + |4 + |A3.7 + |Apogee Igniter Voltage + + |5 + |M3.7 + |Main Igniter Voltage + + |6 + |1286 + |Device Serial Number + |==== + + 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 + .... + + 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. + + 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/config-device.inc b/doc/config-device.inc new file mode 100644 index 00000000..fb09416c --- /dev/null +++ b/doc/config-device.inc @@ -0,0 +1,240 @@ +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[] + +==== 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. + +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. + + ==== 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. + + ==== 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[] + +==== 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. + + +ifdef::altusmetrum[] + + ==== 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::altusmetrum[] diff --git a/doc/config-ui.inc b/doc/config-ui.inc new file mode 100644 index 00000000..c7e7f1ac --- /dev/null +++ b/doc/config-ui.inc @@ -0,0 +1,105 @@ +==== 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 + +==== Log Directory + + {application} 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. + + 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. + +==== 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. + +==== 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. + +==== 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. + +==== 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. diff --git a/doc/installation.inc b/doc/installation.inc index 44433298..32d81984 100644 --- a/doc/installation.inc +++ b/doc/installation.inc @@ -22,13 +22,14 @@ Check polarity and voltage before connecting any battery not purchased from Altus Metrum or Spark Fun. - 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. + 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 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/micropeak.txt b/doc/micropeak.txt index 085be0ed..a3d644d2 100644 --- a/doc/micropeak.txt +++ b/doc/micropeak.txt @@ -149,8 +149,8 @@ * 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. + from the recorded barometric pressure data. See + <<_analyzing_micropeak_data> for more details on that. === Analyzing MicroPeak Data diff --git a/doc/release-notes-0.9.inc b/doc/release-notes-0.9.inc index 66810e5d..0ee7ea51 100644 --- a/doc/release-notes-0.9.inc +++ b/doc/release-notes-0.9.inc @@ -18,8 +18,8 @@ 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 + * 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. diff --git a/doc/system-operation.inc b/doc/system-operation.inc index d7c56eaa..dd8d7d02 100644 --- a/doc/system-operation.inc +++ b/doc/system-operation.inc @@ -28,72 +28,6 @@ completes initialization and self test, and decides which mode to enter next. - 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. - - .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 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. - |==== - 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 @@ -317,308 +251,52 @@ === 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 + 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! - - === APRS - - 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. - - 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. - - 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 about the flight computer. It sends four fields 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 - - |4 - |A3.7 - |Apogee Igniter Voltage - - |5 - |M3.7 - |Main Igniter Voltage - - |6 - |1286 - |Device Serial Number - |==== - - 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 - .... - - 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. - - 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. + 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! + + :aprsdevices: TeleMetrum v2.0 and TeleMega + :configure_section: _configure_altimeter + include::aprs-operation.raw[] === 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”. 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. - - ==== Radio Frequency - - 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. - - ==== Callsign - - 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. - - ==== Telemetry/RDF/APRS Enable - - You can completely disable the radio while in - flight, if necessary. This doesn't disable the - packet link in idle mode. - - ==== 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 - - 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. - - ==== APRS SSID - - 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. - - ==== Apogee Delay - - 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. - - 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. - - ==== 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. - - ==== Main Deployment Altitude - - 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. - - ==== Maximum Flight Log - - 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. - - Even though our flight computers (except TeleMini v1.0) can store - multiple flights, we strongly recommend downloading and saving - flight data after each flight. - - ==== Ignite Mode - - 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. - - 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. - - ==== Pad Orientation - - 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. - - ==== Configurable Pyro Channels - - 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: - - include::pyro-channels.raw[] - + there is no need to set a “mach delay”. All of the + configurable parameters can be set using AltosUI + over USB or or radio link via TeleDongle. Read + <<_configure_altimeter>> for more information. diff --git a/doc/telegps-application.inc b/doc/telegps-application.inc index c5ecc11f..41dda968 100644 --- a/doc/telegps-application.inc +++ b/doc/telegps-application.inc @@ -91,7 +91,7 @@ You can pre-load images for your favorite launch sites before you leave home; check out - the 'Preload Maps' section below. + <<_load_maps>>. ==== Location @@ -233,155 +233,14 @@ within that application. With this, you can use Google Earth to see the whole path in 3D. - === Load Maps - - .Load Maps Window - image::load-maps.png[width="5.2in"] - - 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. - - 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 - - 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. + include::load-maps.raw[] === Preferences .TeleGPS Preferences Window image::telegps-preferences.png[width="2.4in"] - 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. - - 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 - - ==== Log Directory - - 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. - - 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. - - ==== 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 AltosUI - 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. - - ==== 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. - - ==== Font Size - - Selects the set of fonts used in the flight - monitor window. Choose between the small, - medium and large sets. - - ==== Serial Debug - - 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. - - ==== 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. + include::config-ui.raw[] === Close @@ -485,82 +344,7 @@ The rest of the dialog contains the parameters to be configured. - ==== 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. 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. - - ==== 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. - - ==== Callsign - - This sets the call sign included in each - telemetry packet. Set this as needed to - conform to your local radio regulations. - - ==== Logging Trigger Motion - - If TeleGPS moves less than this distance over - a long period of time, it will not log that - location, saving storage space. - - ==== Position Reporting Interval - - 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. + include::config-device.raw[] === Flash Device 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-quick-start.inc b/doc/telegps-quick-start.inc index e8db8ac3..6492743d 100644 --- a/doc/telegps-quick-start.inc +++ b/doc/telegps-quick-start.inc @@ -3,22 +3,21 @@ TeleGPS is designed to be easy to use. Requiring no external components, flying takes just a few steps. - First, download and install the software from + 1. First, download and install the software from http://altusmetrum.org/AltOS. This will make sure that you have the right device drivers installed. - Next, plug in the battery and USB cable and connect TeleGPS to + 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. - 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. + 3. Start the TeleGPS application and set the callsign and frequency + on your TeleGPS device; refer to <<_configure_device>> for instructions. - Unplug TeleGPS when the battery charger light goes green. This + 4. Unplug TeleGPS when the battery charger light goes green. This will enable the radio and logging portions of the TeleGPS firmware. - Connect TeleDongle to your computer and start TeleGPS or start + 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-system-operation.inc b/doc/telegps-system-operation.inc index e8790db8..40ab467c 100644 --- a/doc/telegps-system-operation.inc +++ b/doc/telegps-system-operation.inc @@ -19,131 +19,13 @@ ground with our 10mW units and over 100k feet AGL with the 40mW devices. - === APRS - - 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; that - process is described in the Configure TeleGPS - section of the TeleGPS Application chapter. - - 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. - - 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. - - .TeleGPS 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 - - |4 - |1286 - |Device Serial Number - |==== - - Here's an example of an APRS comment showing GPS lock with 6 - satellites in view and a battery at 4.0V from device 1286. - - .... - L6 B4.0 1286 - .... - - Make sure your battery is above 3.8V 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. + :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. Read - the Configure TeleGPS section in the TeleGPS Software chapter below - for more information. - - ==== Radio Frequency - - 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. - - ==== Callsign - - This sets the callsign used for telemetry and APRS to - identify the device. - - ==== Telemetry/RDF/APRS Enable - - You can completely disable the radio, if necessary, leaving - TeleGPS only logging data to internal memory. - - ==== APRS Interval - - 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. - - ==== Maximum Flight Log - - 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. - - ==== Logging Trigger Motion - - If TeleGPS moves less than this distance over a long period - of time, it will not log that location, saving storage space. - - ==== Position Reporting Interval - - 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. + the Configure TeleGPS section in the TeleGPS Software chapter diff --git a/doc/telegps.txt b/doc/telegps.txt index 059036ec..6726b340 100644 --- a/doc/telegps.txt +++ b/doc/telegps.txt @@ -1,8 +1,10 @@ = TeleGPS Owner's Manual :doctype: book :numbered: +:telegps: 1 +:application: TeleGPS - include::dedication.raw[] + include::telegps-dedication.raw[] include::telegps-quick-start.raw[] diff --git a/doc/usage.inc b/doc/usage.inc index cc694dda..b2ab0c27 100644 --- a/doc/usage.inc +++ b/doc/usage.inc @@ -50,6 +50,122 @@ 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. + 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. + + 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. + + .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 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. + |==== + + === 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 disabled, and the radio goes into + transmit-only mode. 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 + and in packet mode over the radio. You can configure + the flight computer, download data or display + the current state. + + 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. + + For EasyMini, if the USB cable is connected to a + computer, it will enter Idle mode. Otherwise, it will + enter Flight/Pad mode. + + 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. + + 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 @@ -63,13 +179,14 @@ === Using a Separate Pyro Battery - 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. + 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, @@ -78,7 +195,8 @@ 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. + 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 @@ -89,7 +207,7 @@ [WARNING] TeleMega, EasyMega and TeleMetrum are only designed to - use 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. + 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. -- cgit v1.2.3 From 87cb41dfa07153b4dc44f723c65888945b3a11b1 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Fri, 13 Nov 2015 20:56:45 -0800 Subject: doc: Reformat 'Using MicroPeak' section Use labeled paragraphs to make the steps stand out. Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/micropeak.txt | 101 +++++++++++++++++++++++++++++------------------------- 1 file changed, 55 insertions(+), 46 deletions(-) diff --git a/doc/micropeak.txt b/doc/micropeak.txt index a3d644d2..d5036a00 100644 --- a/doc/micropeak.txt +++ b/doc/micropeak.txt @@ -24,56 +24,65 @@ 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. + 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. + 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 -- cgit v1.2.3 From 2133c235af9511a42b65b239c6fcbeafa0e6d272 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Fri, 13 Nov 2015 20:58:08 -0800 Subject: doc: Provide more actual links instead of just chapter names Replace 'see chapter "foo"' with 'see <<foo>>' so that a link is created to directly go to the relevant text. Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/altosui.inc | 12 ++++++------ doc/aprs-operation.inc | 2 +- doc/telegps-application.inc | 4 +--- doc/telegps-system-operation.inc | 7 +++---- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/doc/altosui.inc b/doc/altosui.inc index df5a3cee..3c26b441 100644 --- a/doc/altosui.inc +++ b/doc/altosui.inc @@ -315,9 +315,9 @@ 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. + the specified TeleDongle. See + <<_controlling_an_altimeter_over_the_radio_link>> for + more information. After the device has been selected, a dialog showing the flight data saved in the device will be shown @@ -343,7 +343,7 @@ 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. + <<_monitor_flight>> to learn how this window operates. === Graph Data @@ -567,8 +567,8 @@ 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. + the directions for flashing devices in + <<_updating_device_firmware>>. === Fire Igniter diff --git a/doc/aprs-operation.inc b/doc/aprs-operation.inc index e514e110..9b1d91eb 100644 --- a/doc/aprs-operation.inc +++ b/doc/aprs-operation.inc @@ -6,7 +6,7 @@ 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}>> in the {application} chapter. + <<{configure_section}>>. AltOS supports both compressed and uncompressed APRS position report data formats. The compressed format diff --git a/doc/telegps-application.inc b/doc/telegps-application.inc index 41dda968..3e6b385e 100644 --- a/doc/telegps-application.inc +++ b/doc/telegps-application.inc @@ -342,12 +342,10 @@ The rest of the dialog contains the parameters to be configured. - 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 the Updating Device Firmware chapter below. + devices in <<_updating_device_firmware>>. diff --git a/doc/telegps-system-operation.inc b/doc/telegps-system-operation.inc index 40ab467c..c9fce7f0 100644 --- a/doc/telegps-system-operation.inc +++ b/doc/telegps-system-operation.inc @@ -25,7 +25,6 @@ === Configurable Parameters - 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 + Configuring TeleGPS is very simple; the few configurable + parameters can all be set using the TeleGPS application over + USB. Check out <<_configure_device>>. -- cgit v1.2.3 From 6260ee1419ba5c122939b28e3e8fc6f8ecf48928 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Fri, 13 Nov 2015 20:58:58 -0800 Subject: doc: Move pad beeps table to usage chapter This places all of the sound information in one place. Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/system-operation.inc | 35 ++-------------------- doc/usage.inc | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 33 deletions(-) diff --git a/doc/system-operation.inc b/doc/system-operation.inc index dd8d7d02..4503f525 100644 --- a/doc/system-operation.inc +++ b/doc/system-operation.inc @@ -59,39 +59,8 @@ memory, the flight computer will emit a warbling tone (much slower than the “no continuity tone”) - Here's a summary of all of the “pad” and “idle” mode indications. - - .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. - |==== + 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 diff --git a/doc/usage.inc b/doc/usage.inc index b2ab0c27..caccc168 100644 --- a/doc/usage.inc +++ b/doc/usage.inc @@ -124,6 +124,84 @@ |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. + |==== + + 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. + === Turning On the Power Connect a battery and power switch and turn the switch -- cgit v1.2.3 From b030dfb3df859b3b3cb9c666394f315edcd11f49 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Fri, 13 Nov 2015 20:59:25 -0800 Subject: doc: Reformat html versions a bit Color more text black, including toc. Add a bit of space around the toc. Make paragraph labels bold. Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/am.css | 51 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/doc/am.css b/doc/am.css index 1dee27ea..05889a16 100644 --- a/doc/am.css +++ b/doc/am.css @@ -125,8 +125,8 @@ h3.corpauthor img { top: 0px; width: 410px; height: 90px; - border-right: 2px solid #78079a; - border-bottom: 2px solid #78079a; + border-right: 2px solid #808080; + border-bottom: 2px solid #808080; } div.toc { @@ -134,15 +134,30 @@ div.toc { left: 0px; top: 92px; bottom: 0; - width: 410px; - margin-right: 5ex; - margin-left: 0px; + width: 390px; + margin-right: 0; + margin-left: 0; + padding-left: 10px; + padding-right: 10px; float: left; - border-right: 2px solid #78079a; + 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; } @@ -188,10 +203,6 @@ div.table-contents table { margin-right: auto; } -div.toc p:first-child, -div.list-of-figures p:first-child, -div.list-of-tables p:first-child, -div.list-of-examples p:first-child, div.example p.title, div.sidebar p.title { @@ -204,13 +215,13 @@ div.sidebar p.title body h1 { margin: .0em 0 0 -4%; line-height: 1.3; - border-bottom: 2px solid silver; + border-bottom: 2px solid #808080; } body h2 { margin: 0.5em 0 0 -4%; line-height: 1.3; - border-bottom: 2px solid silver; + border-bottom: 2px solid #808080; } body h3 { @@ -221,7 +232,7 @@ body h3 { body h4 { margin: .8em 0 0 -3%; line-height: 1.3; - border-top: 2px solid silver;goog + border-top: 2px solid #808080; } body h5 { @@ -238,7 +249,7 @@ body hr { border: none; /* Broken on IE6 */ } div.footnotes hr { - border: 1px solid silver; + border: 1px solid #808080; } div.navheader th, div.navheader td, div.navfooter td { @@ -254,7 +265,7 @@ div.navheader a, div.navfooter a { font-weight: normal; } div.navfooter hr { - border: 1px solid silver; + border: 1px solid #808080; } body td { @@ -291,7 +302,7 @@ tt.literal, code.literal { } .programlisting, .screen { - border: 1px solid silver; + border: 1px solid #808080; background: #f4f4f4; margin: 0.5em 10% 0.5em 0; padding: 0.5em 1em; @@ -301,7 +312,7 @@ div.sidebar { background: #ffffee; margin: 1.0em 10% 0.5em 0; padding: 0.5em 1em; - border: 1px solid silver; + border: 1px solid #808080; } div.sidebar * { padding: 0; } div.sidebar div { margin: 0; } @@ -331,7 +342,7 @@ dt { } dt span.term { - font-style: normal; + font-weight: bold; } div.variablelist dd p { @@ -364,12 +375,12 @@ div.revhistory { div.revhistory table, div.revhistory th, div.revhistory td { border-collapse: collapse; - border: 1px solid #78079a; + border: 1px solid #808080; padding: 0.25em; } div.revhistory th { - color: #78079a; + color: black; } /* Keep TOC and index lines close together. */ -- cgit v1.2.3 From 992c0eab6275cec7d5035b99952537fd7ece2ed4 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Fri, 13 Nov 2015 22:55:35 -0800 Subject: doc: Split out EasyMini into a separate manual EasyMini uses a tiny fraction of the overall system software; splitting the manual out makes it a lot smaller. Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/Makefile | 19 ++++- doc/altosui.inc | 86 ++++++++++++++----- doc/altusmetrum.txt | 10 ++- doc/config-device.inc | 187 +++++++++++++++++++++-------------------- doc/config-ui.inc | 10 ++- doc/easymini-device.inc | 116 +++++++++++++++++++++++++ doc/easymini-docinfo.xml | 48 +++++++++++ doc/easymini-release-notes.inc | 7 ++ doc/easymini.inc | 116 ------------------------- doc/easymini.txt | 34 ++++++++ doc/flight-data-recording.inc | 48 +++++++++-- doc/getting-started.inc | 25 ++++-- doc/installation.inc | 26 +++++- doc/specs.inc | 22 +++++ doc/system-operation.inc | 75 ++++++++++++----- doc/telegps.txt | 2 + doc/updating-firmware.inc | 37 ++++++-- doc/usage.inc | 41 ++++++--- doc/using-am-products.inc | 51 ++++++++--- 19 files changed, 660 insertions(+), 300 deletions(-) create mode 100644 doc/easymini-device.inc create mode 100644 doc/easymini-docinfo.xml create mode 100644 doc/easymini-release-notes.inc delete mode 100644 doc/easymini.inc create mode 100644 doc/easymini.txt diff --git a/doc/Makefile b/doc/Makefile index f8fdb5e8..7a4e0fa3 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -105,7 +105,7 @@ INC_FILES=\ telemetrum.inc \ telemini-v1.0.inc \ telemini-v2.0.inc \ - easymini.inc \ + easymini-device.inc \ telemega.inc \ easymega.inc \ installation.inc \ @@ -146,6 +146,14 @@ 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 \ @@ -175,14 +183,15 @@ ONEFILE_TXT_FILES=\ ONEFILE_RAW_FILES=$(ONEFILE_TXT_FILES:.txt=.raw) ONEFILE_PDF_FILES=$(ONEFILE_TXT_FILES:.txt=.pdf) -HTML=altusmetrum.html micropeak.html telegps.html $(RELNOTES_HTML) $(ONEFILE_HTML_FILES) +HTML=altusmetrum.html micropeak.html telegps.html easymini.html $(RELNOTES_HTML) $(ONEFILE_HTML_FILES) HTML_REVHISTORY=\ altusmetrum-revhistory.html \ micropeak-revhistory.html \ - telegps-revhistory.html + telegps-revhistory.html \ + easymini-revhistory.html -PDF=altusmetrum.pdf micropeak.pdf telegps.pdf $(RELNOTES_PDF) $(ONEFILE_PDF_FILES) \ +PDF=altusmetrum.pdf micropeak.pdf telegps.pdf easymini.pdf $(RELNOTES_PDF) $(ONEFILE_PDF_FILES) \ $(OUTLINE_PDF_FILES) FOP_STYLE=am-fo.xsl @@ -245,6 +254,8 @@ 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) $(FONTS) diff --git a/doc/altosui.inc b/doc/altosui.inc index 3c26b441..76a24d91 100644 --- a/doc/altosui.inc +++ b/doc/altosui.inc @@ -11,6 +11,7 @@ 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> @@ -298,26 +299,34 @@ 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. TeleMetrum data is recorded at a much + 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. The 'Save Flight Data' button allows you to + 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. If - you select a TeleDongle device, flight data will be + 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 @@ -342,8 +351,12 @@ flash memory. Once a flight record is selected, the flight monitor interface - is displayed and the flight is re-enacted in real time. Check + 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 @@ -392,6 +405,7 @@ Shows overall data computed from the flight. + ifdef::gps[] ==== Map .Flight Map @@ -401,6 +415,7 @@ 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 @@ -412,8 +427,11 @@ 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. + file. + ifdef::gps[] + It has a selector to choose between CSV and KML + file formats. + endif::gps[] ==== Comma Separated Value Format @@ -432,20 +450,29 @@ standard units, with the barometric data reported in both pressure, altitude and height above pad units. - ==== Keyhole Markup Language (for Google Earth) + 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. + 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. + 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, @@ -490,6 +517,7 @@ include::config-ui.raw[] + ifdef::radio[] === Configure Groundstation .Configure Groundstation Dialog @@ -557,16 +585,27 @@ 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. 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 + 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>>. @@ -577,10 +616,13 @@ This activates the igniter circuits in the flight computer to help test recovery systems - deployment. Because this command can operate over the + 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 @@ -598,6 +640,7 @@ point you start over again at selecting the desired igniter. + ifdef::radio[] === Scan Channels .Scan Channels Window @@ -610,9 +653,13 @@ 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 @@ -632,3 +679,4 @@ communicate with the flight computer; they must both match the configuration in the flight computer exactly. + endif::radio[] diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt index f8d284ec..598de8e6 100644 --- a/doc/altusmetrum.txt +++ b/doc/altusmetrum.txt @@ -2,6 +2,14 @@ :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[] @@ -18,7 +26,7 @@ include::telemini-v2.0.raw[] - include::easymini.raw[] + include::easymini-device.raw[] include::telemega.raw[] diff --git a/doc/config-device.inc b/doc/config-device.inc index fb09416c..bf1edb97 100644 --- a/doc/config-device.inc +++ b/doc/config-device.inc @@ -37,85 +37,87 @@ ifdef::altusmetrum[] endif::altusmetrum[] -==== 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. +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[] @@ -153,6 +155,7 @@ ifdef::altusmetrum[] is fired first, followed after a two second delay by the 'main' channel. + ifdef::telemetrum,telemega,easymega[] ==== Pad Orientation Because they include accelerometers, @@ -172,6 +175,7 @@ ifdef::altusmetrum[] 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 @@ -185,21 +189,22 @@ ifdef::altusmetrum[] endif::altusmetrum[] -==== Logging Trigger Motion +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. + 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. + ==== 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::altusmetrum[] diff --git a/doc/config-ui.inc b/doc/config-ui.inc index c7e7f1ac..fdcfb9dc 100644 --- a/doc/config-ui.inc +++ b/doc/config-ui.inc @@ -1,3 +1,4 @@ +ifdef::radio[] ==== Voice Settings {application} provides voice announcements during @@ -13,11 +14,12 @@ 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 - TeleMetrum flash data to this directory. This + flash data to this directory. This directory is also used as the staring point when selecting data files for display or export. @@ -28,6 +30,7 @@ change where {application} reads and writes data files. +ifdef::radio[] ==== Callsign This value is transmitted in each command @@ -46,6 +49,7 @@ exactly match the callsign configured in the flight computer. This matching is case sensitive. +endif::radio[] ==== Imperial Units @@ -86,13 +90,16 @@ {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 @@ -103,3 +110,4 @@ frequency settings of any devices, it only changes the set of frequencies shown in the menus. +endif::radio[] 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..f3c7ba19 --- /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>2015</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>13 November 2015</date> + <revremark> + First release of separate EasyMini doc + </revremark> + </revision> +</revhistory> diff --git a/doc/easymini-release-notes.inc b/doc/easymini-release-notes.inc new file mode 100644 index 00000000..e448b394 --- /dev/null +++ b/doc/easymini-release-notes.inc @@ -0,0 +1,7 @@ +[appendix] +== Release Notes + + :leveloffset: 2 + include::release-notes-1.6.1.raw[] + + :leveloffset: 0 diff --git a/doc/easymini.inc b/doc/easymini.inc deleted file mode 100644 index fb2b6098..00000000 --- a/doc/easymini.inc +++ /dev/null @@ -1,116 +0,0 @@ -== 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.txt b/doc/easymini.txt new file mode 100644 index 00000000..ddb18376 --- /dev/null +++ b/doc/easymini.txt @@ -0,0 +1,34 @@ += EasyMini +: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 index ed56b82e..d0ffa7f1 100644 --- a/doc/flight-data-recording.inc +++ b/doc/flight-data-recording.inc @@ -2,9 +2,15 @@ == Flight Data Recording 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 + 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. @@ -12,14 +18,24 @@ [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 |TeleMini v2.0 |16 |1MB |10 + 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, @@ -28,26 +44,42 @@ stored. Decrease the size and you can store more flights. Configuration data is also stored in the flash memory on - TeleMetrum v1.x, TeleMini and EasyMini. This consumes 64kB + 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. TeleMetrum v2.0, TeleMega and EasyMega + 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. For instance, a TeleMetrum v2.0 flight spending + 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 - computer, except for TeleMini v1.0, which only holds data for a - single flight. You can adjust the size. + 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 diff --git a/doc/getting-started.inc b/doc/getting-started.inc index 8401f4d0..9c0df26d 100644 --- a/doc/getting-started.inc +++ b/doc/getting-started.inc @@ -5,24 +5,30 @@ === 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. - 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. + 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 TeleMini v2.0 - and EasyMini, anything supplying between 4 and 12 volts should + You can also choose to use another battery with + ifdef::telemini[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. + ifdef::telemetrum,telemega,easymega[] [NOTE] ==== On TeleMetrum v1 boards, when the GPS chip is initially @@ -45,7 +51,9 @@ 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 @@ -58,6 +66,7 @@ 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 @@ -71,6 +80,7 @@ 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 @@ -83,3 +93,4 @@ without network access, you'll want to download offline map data before wandering away from the network. + endif::radio[] diff --git a/doc/installation.inc b/doc/installation.inc index 32d81984..d390551e 100644 --- a/doc/installation.inc +++ b/doc/installation.inc @@ -5,11 +5,14 @@ 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 + 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 and - match batteries sold by Spark Fun. These batteries are + 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 @@ -20,7 +23,15 @@ [WARNING] Check polarity and voltage before connecting any battery not - purchased from Altus Metrum or Spark Fun. + 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 @@ -35,12 +46,18 @@ 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 @@ -49,3 +66,4 @@ 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/specs.inc b/doc/specs.inc index 6af3bd76..72664625 100644 --- a/doc/specs.inc +++ b/doc/specs.inc @@ -9,6 +9,7 @@ |================================ |Device | Barometer | Z-axis accel | GPS | 3D sensors | Storage | RF Output | Battery + ifdef::telemetrum[] |TeleMetrum v1.0 |MP3H6115 10km (33k') |MMA2202 50g @@ -44,7 +45,9 @@ |8MB |40mW |3.7V + endif::telemetrum[] + ifdef::telemini[] |TeleMini v1.0 |MP3H6115 10km (33k') |- @@ -62,7 +65,9 @@ |1MB |10mW |3.7-12V + endif::telemini[] + ifdef::easymini[] |EasyMini v1.0 |MS5607 30km (100k') |- @@ -71,7 +76,9 @@ |1MB |- |3.7-12V + endif::easymini[] + ifdef::telemega[] |TeleMega v1.0 |MS5607 30km (100k') |MMA6555 102g @@ -80,7 +87,9 @@ |8MB |40mW |3.7V + endif::telemega[] + ifdef::easymega[] |EasyMega v1.0 |MS5607 30km (100k') |MMA6555 102g @@ -89,6 +98,8 @@ |8MB |- |3.7V + endif::easymega[] + |============================== <<<< @@ -97,13 +108,16 @@ |============================== |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 @@ -117,25 +131,33 @@ |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 index 4503f525..313415ca 100644 --- a/doc/system-operation.inc +++ b/doc/system-operation.inc @@ -5,7 +5,10 @@ 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 + 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 @@ -13,12 +16,20 @@ 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 + idle mode. + endif::telemetrum,telemega,easymega[] + Since + ifdef::telemini[TeleMini v2.0 and EasyMini don't] + ifndef::telemini[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. TeleMini v1.0 + 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 @@ -45,13 +56,16 @@ 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. 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. + 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 @@ -70,6 +84,7 @@ 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 @@ -80,7 +95,9 @@ 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 @@ -99,8 +116,11 @@ 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. + 'idle' mode after the initial five second startup + period. + endif::telemini[] + ifdef::gps[] === GPS TeleMetrum and TeleMega include a complete GPS receiver. A @@ -120,7 +140,9 @@ 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 @@ -199,25 +221,38 @@ 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. Thanks + 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” 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. - + 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 @@ -255,10 +290,13 @@ 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 @@ -266,6 +304,5 @@ 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 - over USB or or radio link via TeleDongle. Read + configurable parameters can be set using AltosUI. Read <<_configure_altimeter>> for more information. diff --git a/doc/telegps.txt b/doc/telegps.txt index 6726b340..47eafe37 100644 --- a/doc/telegps.txt +++ b/doc/telegps.txt @@ -2,6 +2,8 @@ :doctype: book :numbered: :telegps: 1 +:radio: 1 +:gps: 1 :application: TeleGPS include::telegps-dedication.raw[] diff --git a/doc/updating-firmware.inc b/doc/updating-firmware.inc index d22fdb18..11ea1283 100644 --- a/doc/updating-firmware.inc +++ b/doc/updating-firmware.inc @@ -1,12 +1,21 @@ [appendix] == Updating Device Firmware + ifdef::telemega[] 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 + 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 @@ -17,11 +26,15 @@ 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 (TeleMega, TeleMetrum v2, - EasyMega and EasyMini) are reprogrammed by connecting - them to your computer over USB + 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. @@ -36,7 +49,7 @@ . 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. + such as EasyMini-v1.0-1.6.0.ihx. . Make sure the configuration parameters are reasonable looking. If the serial number and/or RF @@ -62,6 +75,7 @@ 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 @@ -72,7 +86,9 @@ 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 @@ -83,7 +99,9 @@ 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 @@ -94,7 +112,9 @@ 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 @@ -102,13 +122,16 @@ 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: @@ -129,6 +152,7 @@ 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 @@ -341,3 +365,4 @@ 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 index caccc168..3f59a50f 100644 --- a/doc/usage.inc +++ b/doc/usage.inc @@ -54,15 +54,19 @@ 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 (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. + 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"] @@ -80,7 +84,8 @@ |Idle |I |dit dit - |Ready to accept commands over USB or radio link. + |Ready to accept commands over USB + ifdef::radio[or radio link.] |Pad |P @@ -163,6 +168,7 @@ 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 @@ -201,6 +207,7 @@ 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 @@ -216,30 +223,39 @@ Flight/Pad:: The flight computer is waiting to detect launch and then fly the rocket. In this mode, the USB - link is disabled, and the radio goes into - transmit-only mode. The only way to get out of this + 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 - and in packet mode over the radio. You can configure + 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. @@ -278,14 +294,19 @@ === Using a Different Kind of Battery - EasyMini and TeleMini v2 are designed to use either a + 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 index 8d7d005a..8bca563d 100644 --- a/doc/using-am-products.inc +++ b/doc/using-am-products.inc @@ -1,23 +1,32 @@ == Using Altus Metrum Products + ifdef::radio[] === Being Legal - First off, 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. + First off, 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. An 850mAh battery weighs less than a 9V + 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. A 110mAh battery weighs less + 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 TeleMini or EasyMini. + 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 @@ -28,9 +37,11 @@ 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] @@ -42,28 +53,35 @@ 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, you can use the radio link to + 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 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 + 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 + 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 @@ -72,7 +90,9 @@ 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 @@ -102,6 +122,7 @@ 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 @@ -115,7 +136,7 @@ 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 + 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! @@ -125,6 +146,7 @@ === 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 @@ -135,6 +157,7 @@ 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 -- cgit v1.2.3 From 688c5ee98565a25e77c8618e1957ed3b8eff5a56 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Fri, 13 Nov 2015 23:17:11 -0800 Subject: doc: Try a different trick for asciidoc build issues asciidoc creates temp files in the current directory using basename of the source filename. Doing html and pdf builds in parallel causes chaos as a result. Fix this by having the pdf target build both serially, and then have the html target just depend on the pdf target. Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/Makefile | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 7a4e0fa3..b0c09ffe 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -230,25 +230,24 @@ DOC=$(HTML) $(HTML_REVHISTORY) $(PDF) $(IMAGES) $(STYLESHEET) sed -e 's/^[ ]*//' -e 's/^\\//' $*.inc > $@ .raw.pdf: - a2x --verbose -a icons -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 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 -.raw.html: - a2x --verbose -a icons -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) -$(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) $(RAW_INC) $(IMAGES) +altusmetrum.pdf altusmetrum.html: altusmetrum-docinfo.xml $(RAW_FILES) $(IMAGES) telegps.html telegps.pdf: telegps-docinfo.xml $(TELEGPS_RAW_FILES) $(IMAGES) -- cgit v1.2.3 From 19f700f1c99d2f3dcd8775cc629037312d853ee1 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Fri, 13 Nov 2015 23:36:02 -0800 Subject: doc: Construct html index for documentation This gets uploaded to keith's machine as an easy way to see what's available. Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/Makefile | 45 +++++++++++++++++++++++++-------------------- doc/easymini.txt | 2 +- doc/make-am-html | 30 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 21 deletions(-) create mode 100755 doc/make-am-html diff --git a/doc/Makefile b/doc/Makefile index b0c09ffe..939969ab 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -3,24 +3,24 @@ # RELNOTES_INC=\ - release-notes-0.7.1.inc \ - release-notes-0.8.inc \ - release-notes-0.9.inc \ - release-notes-0.9.2.inc \ - release-notes-1.0.1.inc \ - release-notes-1.1.inc \ - release-notes-1.1.1.inc \ - release-notes-1.2.inc \ - release-notes-1.2.1.inc \ - release-notes-1.3.inc \ - release-notes-1.3.1.inc \ - release-notes-1.3.2.inc \ - release-notes-1.4.inc \ - release-notes-1.4.1.inc \ - release-notes-1.4.2.inc \ - release-notes-1.5.inc \ + release-notes-1.6.1.inc \ release-notes-1.6.inc \ - release-notes-1.6.1.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 \ @@ -183,6 +183,8 @@ ONEFILE_TXT_FILES=\ ONEFILE_RAW_FILES=$(ONEFILE_TXT_FILES:.txt=.raw) ONEFILE_PDF_FILES=$(ONEFILE_TXT_FILES:.txt=.pdf) +AM_HTML=am.html + HTML=altusmetrum.html micropeak.html telegps.html easymini.html $(RELNOTES_HTML) $(ONEFILE_HTML_FILES) HTML_REVHISTORY=\ @@ -268,15 +270,18 @@ publish: $(DOC) $(FONTS) git commit -F - /home/bdale/web/altusmetrum/AltOS/doc/* /home/bdale/web/altusmetrum/AltOS/doc/fonts/* ; \ git push) -publish-keithp: $(DOC) $(FONTS) - scp -p $(DOC) keithp.com:~keithp/public_html/altos +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) $(HTML_REVHISTORY) $(PDF) $(TEMPLATES_XSL) $(RAW_FILES) $(TELEGPS_RAW_FILES) $(MICROPEAK_RAW_FILES) + rm -f am.html $(HTML) $(HTML_REVHISTORY) $(PDF) $(TEMPLATES_XSL) $(RAW_FILES) $(TELEGPS_RAW_FILES) $(MICROPEAK_RAW_FILES) distclean: clean rm -f $(HTML) $(PDF) $(PDF): $(PDF_CONFIG_FILES) $(HTML): $(HTML_CONFIG_FILES) + +am.html: Makefile make-am-html $(HTML) + sh ./make-am-html $(HTML) > $@ diff --git a/doc/easymini.txt b/doc/easymini.txt index ddb18376..1a75b929 100644 --- a/doc/easymini.txt +++ b/doc/easymini.txt @@ -1,4 +1,4 @@ -= EasyMini += EasyMini Owner's Manual :doctype: book :numbered: :altusmetrum: 1 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 + + + + +

Altus Metrum Documentation

+EOF + +for i in "$@"; do + echo '

' + grep '' $i | head -1 | sed -e 's/.*<title>//' -e 's;.*;;' + pdf=`basename "$i" .html`.pdf + echo 'html' + echo 'pdf' + echo '

' +done + +cat << 'EOF' + + +EOF -- cgit v1.2.3 From f28d59ddf3e1b763ce5757f572e79085963818e9 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 14 Nov 2015 00:01:05 -0800 Subject: doc: Remove some bogus bits from am.css Just commented out stuff which had a nested comment and was thus invalid Signed-off-by: Keith Packard --- doc/am.css | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/doc/am.css b/doc/am.css index 05889a16..393ef81b 100644 --- a/doc/am.css +++ b/doc/am.css @@ -403,34 +403,6 @@ div.informaltable p { margin: 0px; } -/* -div.table table, -div.informaltable table -{ - margin-left: 0; - margin-right: 0.25em; - margin-bottom: 0.25em; -} -div.informaltable table -{ - margin-top: 0.4em -} -div.table thead, -div.table tfoot, -div.table tbody, -div.informaltable thead, -div.informaltable tfoot, -div.informaltable tbody -{ - /* No effect in IE6. */ - border-top: 1px solid #78079a; - border-bottom: 1px solid #78079a; - border-left: 1px solid #78079a; - border-right: 1px solid #78079a !important; - border-width: 1px !important; -} -*/ - div.table thead, div.table tfoot, div.informaltable thead, div.informaltable tfoot -- cgit v1.2.3 From a1b760d0a01e7087bcc214fcd395541fbf268fe8 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 23 Dec 2015 10:18:24 -0800 Subject: ao-tools/ao-dbg: Stop using sigvec Signed-off-by: Keith Packard --- ao-tools/ao-dbg/ao-dbg-main.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) 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); -- cgit v1.2.3 From 8aa0ab9fe9ca41f6d520d388973164bc0c599a06 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 24 Dec 2015 00:28:59 -0800 Subject: altos: Add TeleMega v2.0, including PWM driver Signed-off-by: Keith Packard --- src/Makefile | 1 + src/drivers/ao_pwm.h | 29 +++ src/stm/ao_pwm_stm.c | 174 ++++++++++++++ src/telemega-v2.0/.gitignore | 2 + src/telemega-v2.0/Makefile | 158 +++++++++++++ src/telemega-v2.0/ao_pins.h | 394 +++++++++++++++++++++++++++++++ src/telemega-v2.0/ao_telemega.c | 105 ++++++++ src/telemega-v2.0/flash-loader/Makefile | 8 + src/telemega-v2.0/flash-loader/ao_pins.h | 34 +++ 9 files changed, 905 insertions(+) create mode 100644 src/drivers/ao_pwm.h create mode 100644 src/stm/ao_pwm_stm.c create mode 100644 src/telemega-v2.0/.gitignore create mode 100644 src/telemega-v2.0/Makefile create mode 100644 src/telemega-v2.0/ao_pins.h create mode 100644 src/telemega-v2.0/ao_telemega.c create mode 100644 src/telemega-v2.0/flash-loader/Makefile create mode 100644 src/telemega-v2.0/flash-loader/ao_pins.h 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_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 + * + * 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 + +void +ao_pwm_set(uint8_t pwm, uint16_t value); + +void +ao_pwm_init(void); + +#endif /* _AO_PWM_H_ */ diff --git a/src/stm/ao_pwm_stm.c b/src/stm/ao_pwm_stm.c new file mode 100644 index 00000000..cea21030 --- /dev/null +++ b/src/stm/ao_pwm_stm.c @@ -0,0 +1,174 @@ +/* + * Copyright © 2015 Keith Packard + * + * 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; /* turn on the timer */ + } +} + +static void +ao_pwm_down(void) +{ + if (--pwm_running == 0) { + struct stm_tim234 *tim = &AO_PWM_TIMER; + tim->arr = 0; /* turn off the timer */ + } +} + +void +ao_pwm_set(uint8_t pwm, uint16_t value) +{ + struct stm_tim234 *tim = &AO_PWM_TIMER; + + if (value != 0) { + if (pwm_value[pwm] == 0) + ao_pwm_up(); + } else { + if (pwm_value[pwm] != 0) + ao_pwm_down(); + } + pwm_value[pwm] = value; + 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; + } +} + +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 \0Set PWM ch to val" }, + { 0, NULL }, +}; + +void +ao_pwm_init(void) +{ + struct stm_tim234 *tim = &AO_PWM_TIMER; + + stm_rcc.apb1enr |= AO_PWM_TIMER_ENABLE; + tim->ccr1 = 0; + tim->ccr2 = 0; + tim->ccr3 = 0; + tim->ccr4 = 0; + tim->arr = 0; /* turn off the timer */ + tim->psc = 0; + 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) | + (1 << 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) | + (1 << 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) | + (1 << 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) | + (1 << 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)); + + tim->cr1 = ((STM_TIM234_CR1_CKD_1 << STM_TIM234_CR1_CKD) | + (1 << 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)); + + stm_afr_set(&stm_gpiod, 12, STM_AFR_AF2); +#if NUM_PWM > 1 + stm_afr_set(&stm_gpiod, 13, STM_AFR_AF2); +#endif +#if NUM_PWM > 2 + stm_afr_set(&stm_gpiod, 14, STM_AFR_AF2); +#endif +#if NUM_PWM > 3 + stm_afr_set(&stm_gpiod, 15, STM_AFR_AF2); +#endif + + ao_cmd_register(&ao_pwm_cmds[0]); +} 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..2e0e8908 --- /dev/null +++ b/src/telemega-v2.0/Makefile @@ -0,0 +1,158 @@ +# +# 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_cc1120_CC1120.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_cc1120.c \ + ao_fec_tx.c \ + ao_fec_rx.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..b88dd08c --- /dev/null +++ b/src/telemega-v2.0/ao_pins.h @@ -0,0 +1,394 @@ +/* + * Copyright © 2012 Keith Packard + * + * 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 0x6ca333 + +#define AO_FEC_DEBUG 0 +#define AO_CC1120_SPI_CS_PORT (&stm_gpioc) +#define AO_CC1120_SPI_CS_PIN 5 +#define AO_CC1120_SPI_BUS AO_SPI_2_PB13_PB14_PB15 +#define AO_CC1120_SPI stm_spi2 + +#define AO_CC1120_INT_PORT (&stm_gpioe) +#define AO_CC1120_INT_PIN 1 +#define AO_CC1120_MCU_WAKEUP_PORT (&stm_gpioc) +#define AO_CC1120_MCU_WAKEUP_PIN (0) + +#define AO_CC1120_INT_GPIO 2 +#define AO_CC1120_INT_GPIO_IOCFG CC1120_IOCFG2 + +#define AO_CC1120_MARC_GPIO 3 +#define AO_CC1120_MARC_GPIO_IOCFG CC1120_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 1024 +#define AO_PWM_TIMER stm_tim4 +#define AO_PWM_TIMER_ENABLE STM_RCC_APB1ENR_TIM4EN + +#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 + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if HAS_SAMPLE_PROFILE +#include +#endif +#include +#if HAS_STACK_GUARD +#include +#endif +#include + +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 + * + * 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 + +/* 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_ */ -- cgit v1.2.3 From 742f7c834bb5d651d2bebf2069d4e8facc33390d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 25 Dec 2015 23:20:29 -0800 Subject: altos: Get stm32l pwm driver working Fix the CCMR1_OC1PE and CCMR2_OC3PE values. Disable clock when no PWM outputs are running. Fix the apb1enr value for the timer. Set ARR value to PWM_MAX - 1 -- ARR is off by one. Sets the GPIO pins to 40MHz bandwidth for sharper edges. Tested on EasyMega, but that code is not included as it breaks the companion protocol. Signed-off-by: Keith Packard --- src/stm/ao_pwm_stm.c | 80 +++++++++++++++++++++++++++------------------ src/stm/stm32l.h | 4 +-- src/telemega-v2.0/ao_pins.h | 14 +++++++- 3 files changed, 64 insertions(+), 34 deletions(-) diff --git a/src/stm/ao_pwm_stm.c b/src/stm/ao_pwm_stm.c index cea21030..ce1fa6f3 100644 --- a/src/stm/ao_pwm_stm.c +++ b/src/stm/ao_pwm_stm.c @@ -27,11 +27,23 @@ 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; /* turn on the timer */ + 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); } } @@ -40,7 +52,19 @@ ao_pwm_down(void) { if (--pwm_running == 0) { struct stm_tim234 *tim = &AO_PWM_TIMER; - tim->arr = 0; /* turn off the 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); } } @@ -49,14 +73,12 @@ 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(); - } else { - if (pwm_value[pwm] != 0) - ao_pwm_down(); } - pwm_value[pwm] = value; switch (pwm) { case 0: tim->ccr1 = value; @@ -71,6 +93,11 @@ ao_pwm_set(uint8_t pwm, uint16_t value) tim->ccr4 = value; break; } + if (value == 0) { + if (pwm_value[pwm] != 0) + ao_pwm_down(); + } + pwm_value[pwm] = value; } static void @@ -100,13 +127,10 @@ ao_pwm_init(void) { struct stm_tim234 *tim = &AO_PWM_TIMER; - stm_rcc.apb1enr |= AO_PWM_TIMER_ENABLE; - tim->ccr1 = 0; - tim->ccr2 = 0; - tim->ccr3 = 0; - tim->ccr4 = 0; - tim->arr = 0; /* turn off the timer */ - tim->psc = 0; + 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) | @@ -119,26 +143,26 @@ ao_pwm_init(void) tim->ccmr1 = ((0 << STM_TIM234_CCMR1_OC2CE) | (STM_TIM234_CCMR1_OC2M_PWM_MODE_1 << STM_TIM234_CCMR1_OC2M) | - (1 << STM_TIM234_CCMR1_OC2PE) | + (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) | - (1 << STM_TIM234_CCMR1_OC1PE) | + (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) | - (1 << STM_TIM234_CCMR2_OC4PE) | + (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) | - (1 << STM_TIM234_CCMR2_OC3PE) | + (0 << STM_TIM234_CCMR2_OC3PE) | (0 << STM_TIM234_CCMR2_OC3FE) | (STM_TIM234_CCMR2_CC3S_OUTPUT << STM_TIM234_CCMR2_CC3S)); tim->egr = 0; @@ -150,25 +174,19 @@ ao_pwm_init(void) (STM_TIM234_CR2_MMS_RESET<< STM_TIM234_CR2_MMS) | (0 << STM_TIM234_CR2_CCDS)); - tim->cr1 = ((STM_TIM234_CR1_CKD_1 << STM_TIM234_CR1_CKD) | - (1 << 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)); - - stm_afr_set(&stm_gpiod, 12, STM_AFR_AF2); + 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(&stm_gpiod, 13, STM_AFR_AF2); + 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(&stm_gpiod, 14, STM_AFR_AF2); + 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(&stm_gpiod, 15, STM_AFR_AF2); + 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/telemega-v2.0/ao_pins.h b/src/telemega-v2.0/ao_pins.h index b88dd08c..ed5935b4 100644 --- a/src/telemega-v2.0/ao_pins.h +++ b/src/telemega-v2.0/ao_pins.h @@ -387,8 +387,20 @@ struct ao_adc { */ #define NUM_PWM 4 -#define PWM_MAX 1024 +#define PWM_MAX 1023 #define AO_PWM_TIMER stm_tim4 #define AO_PWM_TIMER_ENABLE STM_RCC_APB1ENR_TIM4EN +#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_ */ -- cgit v1.2.3 From 0fd370af8bc8842000415c4d182d84b4bf6f90fa Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 25 Dec 2015 23:27:45 -0800 Subject: altos: Set AO_PWM_TIMER_SCALE for telemega-v2.0 This is needed to configure the PWM timer correctly Signed-off-by: Keith Packard --- pdclib | 2 +- src/telemega-v2.0/ao_pins.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pdclib b/pdclib index 8b1c9061..bd33f664 160000 --- a/pdclib +++ b/pdclib @@ -1 +1 @@ -Subproject commit 8b1c9061fa3a8f1b30ee13b373afe5cc1ad9d382 +Subproject commit bd33f6640cf5882f8630766a9acdd1bc420a9dda diff --git a/src/telemega-v2.0/ao_pins.h b/src/telemega-v2.0/ao_pins.h index ed5935b4..8409a106 100644 --- a/src/telemega-v2.0/ao_pins.h +++ b/src/telemega-v2.0/ao_pins.h @@ -390,6 +390,7 @@ struct ao_adc { #define PWM_MAX 1023 #define AO_PWM_TIMER stm_tim4 #define AO_PWM_TIMER_ENABLE STM_RCC_APB1ENR_TIM4EN +#define AO_PWM_TIMER_SCALE 1 #define AO_PWM_0_GPIO (&stm_gpiod) #define AO_PWM_0_PIN 12 -- cgit v1.2.3 From fe8b7ab9dd1949c53af8f09f08679bdf0280c104 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 9 Jan 2016 16:28:53 -0800 Subject: Switch TeleMega v2.0 to CC1200 radio chip That's what we're using, after all Signed-off-by: Keith Packard --- src/telemega-v2.0/Makefile | 6 ++---- src/telemega-v2.0/ao_pins.h | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/telemega-v2.0/Makefile b/src/telemega-v2.0/Makefile index 2e0e8908..6a1c05b0 100644 --- a/src/telemega-v2.0/Makefile +++ b/src/telemega-v2.0/Makefile @@ -21,7 +21,7 @@ INC = \ ao_hmc5883.h \ ao_mpu6000.h \ ao_mma655x.h \ - ao_cc1120_CC1120.h \ + ao_cc1200_CC1200.h \ ao_profile.h \ ao_task.h \ ao_whiten.h \ @@ -85,9 +85,7 @@ ALTOS_SRC = \ ao_freq.c \ ao_dma_stm.c \ ao_spi_stm.c \ - ao_cc1120.c \ - ao_fec_tx.c \ - ao_fec_rx.c \ + ao_cc1200.c \ ao_data.c \ ao_ms5607.c \ ao_mma655x.c \ diff --git a/src/telemega-v2.0/ao_pins.h b/src/telemega-v2.0/ao_pins.h index 8409a106..d796826c 100644 --- a/src/telemega-v2.0/ao_pins.h +++ b/src/telemega-v2.0/ao_pins.h @@ -301,24 +301,24 @@ struct ao_adc { /* gets pretty close to 434.550 */ -#define AO_RADIO_CAL_DEFAULT 0x6ca333 +#define AO_RADIO_CAL_DEFAULT 5695733 #define AO_FEC_DEBUG 0 -#define AO_CC1120_SPI_CS_PORT (&stm_gpioc) -#define AO_CC1120_SPI_CS_PIN 5 -#define AO_CC1120_SPI_BUS AO_SPI_2_PB13_PB14_PB15 -#define AO_CC1120_SPI stm_spi2 +#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_CC1120_INT_PORT (&stm_gpioe) -#define AO_CC1120_INT_PIN 1 -#define AO_CC1120_MCU_WAKEUP_PORT (&stm_gpioc) -#define AO_CC1120_MCU_WAKEUP_PIN (0) +#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_CC1120_INT_GPIO 2 -#define AO_CC1120_INT_GPIO_IOCFG CC1120_IOCFG2 +#define AO_CC1200_INT_GPIO 2 +#define AO_CC1200_INT_GPIO_IOCFG CC1200_IOCFG2 -#define AO_CC1120_MARC_GPIO 3 -#define AO_CC1120_MARC_GPIO_IOCFG CC1120_IOCFG3 +#define AO_CC1200_MARC_GPIO 3 +#define AO_CC1200_MARC_GPIO_IOCFG CC1200_IOCFG3 #define HAS_BOOT_RADIO 0 -- cgit v1.2.3 From 4344bf3de532f54e0185421975c3c8dff1ac8bc2 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 9 Jan 2016 21:33:23 -0800 Subject: altos: Insert inter telemetry-packet delay The receivers take some time to reset the radio between packets, so make sure we don't send back-to-back telemetry too quickly by delaying after sending each telemetry packet. --- src/kernel/ao_telemetry.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) 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 -- cgit v1.2.3 From efd6cd5682be3d0cead71ecfa00f37428b64785f Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 10 Jan 2016 12:15:50 -0800 Subject: Elide pyro channel information from EasyMini docs Signed-off-by: Keith Packard --- doc/config-device.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/config-device.inc b/doc/config-device.inc index bf1edb97..35848882 100644 --- a/doc/config-device.inc +++ b/doc/config-device.inc @@ -206,7 +206,7 @@ ifdef::telegps[] in the log. endif::telegps[] -ifdef::altusmetrum[] +ifdef::telemega,easymega[] ==== Configure Pyro Channels @@ -242,4 +242,4 @@ ifdef::altusmetrum[] include::pyro-channels.raw[] -endif::altusmetrum[] +endif::telemega,easymega[] -- cgit v1.2.3 From 88671454e931ea5e5946438df3c437493e2356c8 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 10 Jan 2016 12:21:24 -0800 Subject: Elide flight computer info from APRS section of TeleGPS manual Signed-off-by: Keith Packard --- doc/aprs-operation.inc | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/doc/aprs-operation.inc b/doc/aprs-operation.inc index 9b1d91eb..09f929d0 100644 --- a/doc/aprs-operation.inc +++ b/doc/aprs-operation.inc @@ -26,10 +26,9 @@ 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 about the flight computer. It sends four fields as - shown in the following table. + 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"] @@ -48,6 +47,8 @@ |B4.0 |Altimeter Battery Voltage + ifdef::altusmetrum[] + |4 |A3.7 |Apogee Igniter Voltage @@ -59,8 +60,19 @@ |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. @@ -68,13 +80,25 @@ .... 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, 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. + 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 -- cgit v1.2.3 From b560b20cc7d4d5ac219613b29707f7cb8a018273 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 10 Jan 2016 12:30:11 -0800 Subject: altoslib: Remove debug message from AltosMap Signed-off-by: Keith Packard --- altoslib/AltosMap.java | 1 - 1 file changed, 1 deletion(-) diff --git a/altoslib/AltosMap.java b/altoslib/AltosMap.java index a2855192..4a8a9fda 100644 --- a/altoslib/AltosMap.java +++ b/altoslib/AltosMap.java @@ -324,7 +324,6 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener { if (!tiles.containsKey(point)) { AltosLatLon ul = transform.lat_lon(point); AltosLatLon center = transform.lat_lon(new AltosPointDouble(x + AltosMap.px_size/2, y + AltosMap.px_size/2)); - debug("make tile %g,%g\n", center.lat, center.lon); AltosMapTile tile = map_interface.new_tile(this, ul, center, zoom, maptype, px_size); tiles.put(point, tile); } -- cgit v1.2.3 From 7041c386cdf37716f8daf0bc1a9204db620e3de9 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 10 Jan 2016 12:30:34 -0800 Subject: Update java library versions altoslib is API incompatible with 1.6.1 release due to altos.state updates. Signed-off-by: Keith Packard --- altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java | 2 +- .../src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java | 2 +- altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java | 2 +- altoslib/AltosAccel.java | 2 +- altoslib/AltosCRCException.java | 2 +- altoslib/AltosCSV.java | 2 +- altoslib/AltosCompanion.java | 2 +- altoslib/AltosConfigData.java | 2 +- altoslib/AltosConfigDataException.java | 2 +- altoslib/AltosConfigValues.java | 2 +- altoslib/AltosConvert.java | 2 +- altoslib/AltosDebug.java | 2 +- altoslib/AltosDistance.java | 2 +- altoslib/AltosEeprom.java | 2 +- altoslib/AltosEepromChunk.java | 2 +- altoslib/AltosEepromDownload.java | 2 +- altoslib/AltosEepromFile.java | 2 +- altoslib/AltosEepromGPS.java | 2 +- altoslib/AltosEepromHeader.java | 2 +- altoslib/AltosEepromIterable.java | 2 +- altoslib/AltosEepromList.java | 2 +- altoslib/AltosEepromLog.java | 2 +- altoslib/AltosEepromMega.java | 2 +- altoslib/AltosEepromMetrum2.java | 2 +- altoslib/AltosEepromMini.java | 2 +- altoslib/AltosEepromMonitor.java | 2 +- altoslib/AltosEepromTM.java | 2 +- altoslib/AltosEepromTm.java | 2 +- altoslib/AltosFile.java | 2 +- altoslib/AltosFlash.java | 2 +- altoslib/AltosFlashListener.java | 2 +- altoslib/AltosFlightDisplay.java | 2 +- altoslib/AltosFlightReader.java | 2 +- altoslib/AltosFlightStats.java | 2 +- altoslib/AltosFontListener.java | 2 +- altoslib/AltosFrequency.java | 2 +- altoslib/AltosGPS.java | 2 +- altoslib/AltosGPSSat.java | 2 +- altoslib/AltosGreatCircle.java | 2 +- altoslib/AltosHeight.java | 2 +- altoslib/AltosHexfile.java | 2 +- altoslib/AltosHexsym.java | 2 +- altoslib/AltosIMU.java | 2 +- altoslib/AltosIdle.java | 2 +- altoslib/AltosIdleFetch.java | 2 +- altoslib/AltosIdleMonitor.java | 2 +- altoslib/AltosIdleMonitorListener.java | 2 +- altoslib/AltosIgnite.java | 2 +- altoslib/AltosImage.java | 2 +- altoslib/AltosKML.java | 2 +- altoslib/AltosLatLon.java | 2 +- altoslib/AltosLatitude.java | 2 +- altoslib/AltosLaunchSite.java | 2 +- altoslib/AltosLaunchSiteListener.java | 2 +- altoslib/AltosLaunchSites.java | 2 +- altoslib/AltosLib.java | 2 +- altoslib/AltosLine.java | 2 +- altoslib/AltosLink.java | 2 +- altoslib/AltosListenerState.java | 2 +- altoslib/AltosLocation.java | 2 +- altoslib/AltosLog.java | 2 +- altoslib/AltosLongitude.java | 2 +- altoslib/AltosMag.java | 2 +- altoslib/AltosMap.java | 2 +- altoslib/AltosMapCache.java | 2 +- altoslib/AltosMapCacheListener.java | 2 +- altoslib/AltosMapInterface.java | 2 +- altoslib/AltosMapLine.java | 2 +- altoslib/AltosMapLoader.java | 2 +- altoslib/AltosMapLoaderListener.java | 2 +- altoslib/AltosMapMark.java | 2 +- altoslib/AltosMapPath.java | 2 +- altoslib/AltosMapPathPoint.java | 2 +- altoslib/AltosMapRectangle.java | 2 +- altoslib/AltosMapStore.java | 2 +- altoslib/AltosMapStoreListener.java | 2 +- altoslib/AltosMapTile.java | 2 +- altoslib/AltosMapTileListener.java | 2 +- altoslib/AltosMapTransform.java | 2 +- altoslib/AltosMapZoomListener.java | 2 +- altoslib/AltosMma655x.java | 2 +- altoslib/AltosMs5607.java | 2 +- altoslib/AltosNoSymbol.java | 2 +- altoslib/AltosOrient.java | 2 +- altoslib/AltosParse.java | 2 +- altoslib/AltosPointDouble.java | 2 +- altoslib/AltosPointInt.java | 2 +- altoslib/AltosPreferences.java | 2 +- altoslib/AltosPreferencesBackend.java | 2 +- altoslib/AltosProgrammer.java | 2 +- altoslib/AltosPyro.java | 2 +- altoslib/AltosQuaternion.java | 2 +- altoslib/AltosRectangle.java | 2 +- altoslib/AltosReplayReader.java | 2 +- altoslib/AltosRomconfig.java | 2 +- altoslib/AltosRotation.java | 2 +- altoslib/AltosSavedState.java | 2 +- altoslib/AltosSelfFlash.java | 2 +- altoslib/AltosSensorEMini.java | 2 +- altoslib/AltosSensorMM.java | 2 +- altoslib/AltosSensorMega.java | 2 +- altoslib/AltosSensorMetrum.java | 2 +- altoslib/AltosSensorTGPS.java | 2 +- altoslib/AltosSensorTM.java | 2 +- altoslib/AltosSensorTMini.java | 2 +- altoslib/AltosSpeed.java | 2 +- altoslib/AltosState.java | 2 +- altoslib/AltosStateIterable.java | 2 +- altoslib/AltosStateUpdate.java | 2 +- altoslib/AltosTelemetry.java | 2 +- altoslib/AltosTelemetryCompanion.java | 2 +- altoslib/AltosTelemetryConfiguration.java | 2 +- altoslib/AltosTelemetryFile.java | 2 +- altoslib/AltosTelemetryIterable.java | 2 +- altoslib/AltosTelemetryLegacy.java | 2 +- altoslib/AltosTelemetryLocation.java | 2 +- altoslib/AltosTelemetryMap.java | 2 +- altoslib/AltosTelemetryMegaData.java | 2 +- altoslib/AltosTelemetryMegaSensor.java | 2 +- altoslib/AltosTelemetryMetrumData.java | 2 +- altoslib/AltosTelemetryMetrumSensor.java | 2 +- altoslib/AltosTelemetryMini.java | 2 +- altoslib/AltosTelemetryRaw.java | 2 +- altoslib/AltosTelemetryReader.java | 2 +- altoslib/AltosTelemetrySatellite.java | 2 +- altoslib/AltosTelemetrySensor.java | 2 +- altoslib/AltosTelemetryStandard.java | 2 +- altoslib/AltosTemperature.java | 2 +- altoslib/AltosUnits.java | 2 +- altoslib/AltosUnitsListener.java | 2 +- altoslib/AltosVersion.java.in | 2 +- altoslib/AltosVoltage.java | 2 +- altoslib/AltosWriter.java | 2 +- altosui/Altos.java | 4 ++-- altosui/AltosAscent.java | 4 ++-- altosui/AltosCompanionInfo.java | 4 ++-- altosui/AltosConfig.java | 4 ++-- altosui/AltosConfigPyroUI.java | 4 ++-- altosui/AltosConfigTD.java | 4 ++-- altosui/AltosConfigTDUI.java | 4 ++-- altosui/AltosConfigUI.java | 4 ++-- altosui/AltosConfigureUI.java | 2 +- altosui/AltosDescent.java | 4 ++-- altosui/AltosFlightStatus.java | 4 ++-- altosui/AltosFlightStatusTableModel.java | 2 +- altosui/AltosFlightStatusUpdate.java | 2 +- altosui/AltosFlightUI.java | 4 ++-- altosui/AltosGraphUI.java | 4 ++-- altosui/AltosIdleMonitorUI.java | 4 ++-- altosui/AltosIgniteUI.java | 4 ++-- altosui/AltosIgnitor.java | 4 ++-- altosui/AltosLanded.java | 4 ++-- altosui/AltosLaunch.java | 2 +- altosui/AltosLaunchUI.java | 2 +- altosui/AltosPad.java | 4 ++-- altosui/AltosUI.java | 4 ++-- altosuilib/AltosBTDevice.java | 4 ++-- altosuilib/AltosBTDeviceIterator.java | 4 ++-- altosuilib/AltosBTKnown.java | 4 ++-- altosuilib/AltosBTManage.java | 4 ++-- altosuilib/AltosCSVUI.java | 4 ++-- altosuilib/AltosConfigFreqUI.java | 4 ++-- altosuilib/AltosDataChooser.java | 4 ++-- altosuilib/AltosDevice.java | 2 +- altosuilib/AltosDeviceDialog.java | 2 +- altosuilib/AltosDeviceUIDialog.java | 2 +- altosuilib/AltosDisplayThread.java | 4 ++-- altosuilib/AltosEepromDelete.java | 4 ++-- altosuilib/AltosEepromManage.java | 4 ++-- altosuilib/AltosEepromMonitor.java | 2 +- altosuilib/AltosEepromMonitorUI.java | 4 ++-- altosuilib/AltosEepromSelect.java | 4 ++-- altosuilib/AltosFlashUI.java | 4 ++-- altosuilib/AltosFlightInfoTableModel.java | 2 +- altosuilib/AltosFlightStatsTable.java | 4 ++-- altosuilib/AltosGraph.java | 4 ++-- altosuilib/AltosGraphDataPoint.java | 4 ++-- altosuilib/AltosGraphDataSet.java | 4 ++-- altosuilib/AltosInfoTable.java | 4 ++-- altosuilib/AltosLed.java | 2 +- altosuilib/AltosLights.java | 2 +- altosuilib/AltosPositionListener.java | 2 +- altosuilib/AltosRomconfigUI.java | 4 ++-- altosuilib/AltosScanUI.java | 4 ++-- altosuilib/AltosSerial.java | 4 ++-- altosuilib/AltosSerialInUseException.java | 2 +- altosuilib/AltosUIAxis.java | 4 ++-- altosuilib/AltosUIConfigure.java | 4 ++-- altosuilib/AltosUIDataMissing.java | 2 +- altosuilib/AltosUIDataPoint.java | 2 +- altosuilib/AltosUIDataSet.java | 2 +- altosuilib/AltosUIDialog.java | 2 +- altosuilib/AltosUIEnable.java | 4 ++-- altosuilib/AltosUIFlightTab.java | 4 ++-- altosuilib/AltosUIFrame.java | 2 +- altosuilib/AltosUIFreqList.java | 4 ++-- altosuilib/AltosUIGraph.java | 4 ++-- altosuilib/AltosUIGrapher.java | 4 ++-- altosuilib/AltosUIImage.java | 2 +- altosuilib/AltosUIIndicator.java | 4 ++-- altosuilib/AltosUILib.java | 4 ++-- altosuilib/AltosUIListener.java | 2 +- altosuilib/AltosUIMapNew.java | 4 ++-- altosuilib/AltosUIMapPreloadNew.java | 4 ++-- altosuilib/AltosUIMarker.java | 4 ++-- altosuilib/AltosUIPreferences.java | 4 ++-- altosuilib/AltosUIPreferencesBackend.java | 4 ++-- altosuilib/AltosUIRateList.java | 4 ++-- altosuilib/AltosUISeries.java | 4 ++-- altosuilib/AltosUITelemetryList.java | 4 ++-- altosuilib/AltosUIUnitsIndicator.java | 4 ++-- altosuilib/AltosUIVoltageIndicator.java | 4 ++-- altosuilib/AltosUSBDevice.java | 2 +- altosuilib/AltosVoice.java | 2 +- altosuilib/GrabNDrag.java | 2 +- altosuilib/OSXAdapter.java | 2 +- configure.ac | 4 ++-- micropeak/MicroData.java | 4 ++-- micropeak/MicroDataPoint.java | 2 +- micropeak/MicroDeviceDialog.java | 2 +- micropeak/MicroDownload.java | 4 ++-- micropeak/MicroExport.java | 4 ++-- micropeak/MicroFile.java | 4 ++-- micropeak/MicroFileChooser.java | 4 ++-- micropeak/MicroFrame.java | 2 +- micropeak/MicroGraph.java | 4 ++-- micropeak/MicroPeak.java | 4 ++-- micropeak/MicroRaw.java | 4 ++-- micropeak/MicroSave.java | 4 ++-- micropeak/MicroSerial.java | 2 +- micropeak/MicroSerialLog.java | 2 +- micropeak/MicroStats.java | 4 ++-- micropeak/MicroStatsTable.java | 4 ++-- micropeak/MicroUSB.java | 4 ++-- telegps/TeleGPS.java | 4 ++-- telegps/TeleGPSConfig.java | 4 ++-- telegps/TeleGPSConfigUI.java | 4 ++-- telegps/TeleGPSDisplayThread.java | 4 ++-- telegps/TeleGPSGraphUI.java | 4 ++-- telegps/TeleGPSInfo.java | 4 ++-- telegps/TeleGPSPreferences.java | 2 +- telegps/TeleGPSState.java | 4 ++-- telegps/TeleGPSStatus.java | 4 ++-- telegps/TeleGPSStatusUpdate.java | 2 +- 263 files changed, 342 insertions(+), 342 deletions(-) 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 1a27e4eb..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 { 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 ce3b57af..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 { 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 82e89bb0..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; 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 150f5a64..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.*; 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 594f053f..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.*; diff --git a/altoslib/AltosEepromFile.java b/altoslib/AltosEepromFile.java index 002b7fff..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.*; 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 fdf79fa2..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.*; 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 1a364106..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.*; 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 4a8a9fda..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.*; 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 55faa17c..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.*; 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 c4b07f62..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; 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 12cd5adf..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.*; 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 821adc84..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.*; diff --git a/altoslib/AltosTelemetryCompanion.java b/altoslib/AltosTelemetryCompanion.java index 96125aca..c47f9486 100644 --- a/altoslib/AltosTelemetryCompanion.java +++ b/altoslib/AltosTelemetryCompanion.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 AltosTelemetryCompanion extends AltosTelemetryStandard { AltosCompanion 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 d87939ff..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.*; 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 c2a5ab3c..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; 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/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 f44e2616..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; 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 939c4688..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; 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 d056e256..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 { diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java index c29f0db3..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(); 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 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 { LinkedList devices = new LinkedList(); 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 { LinkedBlockingQueue 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 fac4ad72..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 { 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 ce76e906..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 { 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 { 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 { 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 { 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 { 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 { 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/configure.ac b/configure.ac index e037e0f2..7440692c 100644 --- a/configure.ac +++ b/configure.ac @@ -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/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 { 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/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 11bca5d0..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 { 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 { -- cgit v1.2.3 From 54c20f1caf7f2e09284a9839cfa854d71f5634a2 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 10 Jan 2016 11:44:17 -0800 Subject: Add release notes for 1.6.2 Signed-off-by: Keith Packard --- doc/Makefile | 1 + doc/RELNOTES | 25 ++++++++++++++++++++ doc/altusmetrum-docinfo.xml | 9 +++++++- doc/easymini-docinfo.xml | 4 ++-- doc/easymini-release-notes.inc | 2 +- doc/release-notes-0.7.1-docinfo.xml | 2 +- doc/release-notes-0.8-docinfo.xml | 2 +- doc/release-notes-0.9-docinfo.xml | 2 +- doc/release-notes-0.9.2-docinfo.xml | 2 +- doc/release-notes-1.0.1-docinfo.xml | 2 +- doc/release-notes-1.1-docinfo.xml | 2 +- doc/release-notes-1.1.1-docinfo.xml | 2 +- doc/release-notes-1.2-docinfo.xml | 2 +- doc/release-notes-1.2.1-docinfo.xml | 2 +- doc/release-notes-1.3-docinfo.xml | 2 +- doc/release-notes-1.3.1-docinfo.xml | 2 +- doc/release-notes-1.3.2-docinfo.xml | 2 +- doc/release-notes-1.4-docinfo.xml | 2 +- doc/release-notes-1.4.1-docinfo.xml | 2 +- doc/release-notes-1.4.2-docinfo.xml | 2 +- doc/release-notes-1.5-docinfo.xml | 2 +- doc/release-notes-1.6-docinfo.xml | 2 +- doc/release-notes-1.6.1-docinfo.xml | 2 +- doc/release-notes-1.6.2-docinfo.xml | 29 +++++++++++++++++++++++ doc/release-notes-1.6.2.inc | 46 +++++++++++++++++++++++++++++++++++++ doc/release-notes.inc | 4 ++++ doc/telegps-release-notes.inc | 4 ++++ doc/titlepage.templates.tmpl | 22 ++++++++++-------- 28 files changed, 150 insertions(+), 32 deletions(-) create mode 100644 doc/RELNOTES create mode 100644 doc/release-notes-1.6.2-docinfo.xml create mode 100644 doc/release-notes-1.6.2.inc diff --git a/doc/Makefile b/doc/Makefile index 939969ab..08835ad3 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -3,6 +3,7 @@ # RELNOTES_INC=\ + release-notes-1.6.2.inc \ release-notes-1.6.1.inc \ release-notes-1.6.inc \ release-notes-1.5.inc \ diff --git a/doc/RELNOTES b/doc/RELNOTES new file mode 100644 index 00000000..0b04ac5f --- /dev/null +++ b/doc/RELNOTES @@ -0,0 +1,25 @@ +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 + +* Add release-notes-${version}.inc and + release-notes-${version}-docinfo.xml to git diff --git a/doc/altusmetrum-docinfo.xml b/doc/altusmetrum-docinfo.xml index 69a769b6..9f2dda1c 100644 --- a/doc/altusmetrum-docinfo.xml +++ b/doc/altusmetrum-docinfo.xml @@ -30,7 +30,7 @@ - + @@ -46,6 +46,13 @@ + + 1.6.2 + 10 January 2016 + + Minor release adding TeleMega v2.0 support. + + 1.6.1 15 July 2015 diff --git a/doc/easymini-docinfo.xml b/doc/easymini-docinfo.xml index f3c7ba19..7789d2f3 100644 --- a/doc/easymini-docinfo.xml +++ b/doc/easymini-docinfo.xml @@ -10,7 +10,7 @@ keithp@keithp.com - 2015 + 2016 Bdale Garbee and Keith Packard @@ -40,7 +40,7 @@ 1.6.2 - 13 November 2015 + 10 January 2016 First release of separate EasyMini doc diff --git a/doc/easymini-release-notes.inc b/doc/easymini-release-notes.inc index e448b394..352a989b 100644 --- a/doc/easymini-release-notes.inc +++ b/doc/easymini-release-notes.inc @@ -2,6 +2,6 @@ == Release Notes :leveloffset: 2 - include::release-notes-1.6.1.raw[] + include::release-notes-1.6.2.raw[] :leveloffset: 0 diff --git a/doc/release-notes-0.7.1-docinfo.xml b/doc/release-notes-0.7.1-docinfo.xml index 71bc3180..9657f2a6 100644 --- a/doc/release-notes-0.7.1-docinfo.xml +++ b/doc/release-notes-0.7.1-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-0.8-docinfo.xml b/doc/release-notes-0.8-docinfo.xml index d06249f5..d593da31 100644 --- a/doc/release-notes-0.8-docinfo.xml +++ b/doc/release-notes-0.8-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-0.9-docinfo.xml b/doc/release-notes-0.9-docinfo.xml index 0602cb02..605472f2 100644 --- a/doc/release-notes-0.9-docinfo.xml +++ b/doc/release-notes-0.9-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-0.9.2-docinfo.xml b/doc/release-notes-0.9.2-docinfo.xml index ec1e4482..40e53634 100644 --- a/doc/release-notes-0.9.2-docinfo.xml +++ b/doc/release-notes-0.9.2-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.0.1-docinfo.xml b/doc/release-notes-1.0.1-docinfo.xml index 95a7681d..23972104 100644 --- a/doc/release-notes-1.0.1-docinfo.xml +++ b/doc/release-notes-1.0.1-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.1-docinfo.xml b/doc/release-notes-1.1-docinfo.xml index 032a06c5..93273918 100644 --- a/doc/release-notes-1.1-docinfo.xml +++ b/doc/release-notes-1.1-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.1.1-docinfo.xml b/doc/release-notes-1.1.1-docinfo.xml index 4c2c8b1c..41ea12da 100644 --- a/doc/release-notes-1.1.1-docinfo.xml +++ b/doc/release-notes-1.1.1-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.2-docinfo.xml b/doc/release-notes-1.2-docinfo.xml index f35f033d..ba2c9d56 100644 --- a/doc/release-notes-1.2-docinfo.xml +++ b/doc/release-notes-1.2-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.2.1-docinfo.xml b/doc/release-notes-1.2.1-docinfo.xml index 968c0434..d0f08b9c 100644 --- a/doc/release-notes-1.2.1-docinfo.xml +++ b/doc/release-notes-1.2.1-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.3-docinfo.xml b/doc/release-notes-1.3-docinfo.xml index b10fd9dd..aa569df4 100644 --- a/doc/release-notes-1.3-docinfo.xml +++ b/doc/release-notes-1.3-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.3.1-docinfo.xml b/doc/release-notes-1.3.1-docinfo.xml index 52264773..f67cf3b8 100644 --- a/doc/release-notes-1.3.1-docinfo.xml +++ b/doc/release-notes-1.3.1-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.3.2-docinfo.xml b/doc/release-notes-1.3.2-docinfo.xml index f55aef04..82b7677e 100644 --- a/doc/release-notes-1.3.2-docinfo.xml +++ b/doc/release-notes-1.3.2-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.4-docinfo.xml b/doc/release-notes-1.4-docinfo.xml index 216c0ae3..12a38ce5 100644 --- a/doc/release-notes-1.4-docinfo.xml +++ b/doc/release-notes-1.4-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.4.1-docinfo.xml b/doc/release-notes-1.4.1-docinfo.xml index d87052f7..6224b16e 100644 --- a/doc/release-notes-1.4.1-docinfo.xml +++ b/doc/release-notes-1.4.1-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.4.2-docinfo.xml b/doc/release-notes-1.4.2-docinfo.xml index 4b4f7b21..8fd94324 100644 --- a/doc/release-notes-1.4.2-docinfo.xml +++ b/doc/release-notes-1.4.2-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.5-docinfo.xml b/doc/release-notes-1.5-docinfo.xml index 3d018630..0c0cace7 100644 --- a/doc/release-notes-1.5-docinfo.xml +++ b/doc/release-notes-1.5-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.6-docinfo.xml b/doc/release-notes-1.6-docinfo.xml index 760d5e60..5ae58bb5 100644 --- a/doc/release-notes-1.6-docinfo.xml +++ b/doc/release-notes-1.6-docinfo.xml @@ -15,7 +15,7 @@ - + diff --git a/doc/release-notes-1.6.1-docinfo.xml b/doc/release-notes-1.6.1-docinfo.xml index 1b27b79a..dc0a2d67 100644 --- a/doc/release-notes-1.6.1-docinfo.xml +++ b/doc/release-notes-1.6.1-docinfo.xml @@ -15,7 +15,7 @@ - + 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 @@ + + Bdale + Garbee + bdale@gag.com + + + Keith + Packard + keithp@keithp.com + +10 January 2016 + + 2016 + Bdale Garbee and Keith Packard + + + + + + + + + This document is released under the terms of the + + Creative Commons ShareAlike 3.0 + + license. + + 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.inc b/doc/release-notes.inc index 70653ed9..a6240d43 100644 --- a/doc/release-notes.inc +++ b/doc/release-notes.inc @@ -1,6 +1,10 @@ [appendix] == Release Notes + :leveloffset: 2 + include::release-notes-1.6.2.raw[] + + <<<< :leveloffset: 2 include::release-notes-1.6.1.raw[] diff --git a/doc/telegps-release-notes.inc b/doc/telegps-release-notes.inc index 7a53bd2d..dcdabc05 100644 --- a/doc/telegps-release-notes.inc +++ b/doc/telegps-release-notes.inc @@ -1,6 +1,10 @@ [appendix] == Release Notes + :leveloffset: 2 + include::release-notes-1.6.2.raw[] + + <<<< :leveloffset: 2 include::release-notes-1.6.1.raw[] diff --git a/doc/titlepage.templates.tmpl b/doc/titlepage.templates.tmpl index 1669e465..f437fb76 100644 --- a/doc/titlepage.templates.tmpl +++ b/doc/titlepage.templates.tmpl @@ -36,6 +36,8 @@ start-indent="0pt" text-align="center"> + + --> - <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" @@ -103,7 +105,7 @@ <subtitle font-family="{$title.fontset}" text-align="center"/> - <corpauthor/> + <corpauthor space-before="0.25in"/> <authorgroup/> <author/> <othercredit/> @@ -177,12 +179,12 @@ <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"/> + <corpauthor text-align="center" space-before="0.5in"/> <revhistory space-before="0.5in"/> </t:titlepage-content> -- cgit v1.2.3 From 4e29bcd07819415ebe44e22536305e9c51d9ae4c Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Sun, 10 Jan 2016 15:44:08 -0800 Subject: altos: Set TeleMega v2.0 PWM to support servos Typical servos use a 50Hz signal with less than 10% duty cycle. Set the divider to 10 and the range to 64000 to provide a reasonable level of detail down in the low range. Signed-off-by: Keith Packard <keithp@keithp.com> --- src/telemega-v2.0/ao_pins.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/telemega-v2.0/ao_pins.h b/src/telemega-v2.0/ao_pins.h index d796826c..a0c7cc46 100644 --- a/src/telemega-v2.0/ao_pins.h +++ b/src/telemega-v2.0/ao_pins.h @@ -387,10 +387,10 @@ struct ao_adc { */ #define NUM_PWM 4 -#define PWM_MAX 1023 +#define PWM_MAX 64000 #define AO_PWM_TIMER stm_tim4 #define AO_PWM_TIMER_ENABLE STM_RCC_APB1ENR_TIM4EN -#define AO_PWM_TIMER_SCALE 1 +#define AO_PWM_TIMER_SCALE 10 #define AO_PWM_0_GPIO (&stm_gpiod) #define AO_PWM_0_PIN 12 -- cgit v1.2.3 From a66e57e0e92cdbd3c6a10b835c50f55647c07351 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Sun, 10 Jan 2016 15:56:21 -0800 Subject: altos: Switch PWM constants to end up exposing µsec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This changes the constants so the clock runs at 1MHz, making the step 1µsec each. Then make the period 20000 steps, or 20ms for a 50Hz frequency as before. Signed-off-by: Keith Packard <keithp@keithp.com> --- src/telemega-v2.0/ao_pins.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/telemega-v2.0/ao_pins.h b/src/telemega-v2.0/ao_pins.h index a0c7cc46..9095a350 100644 --- a/src/telemega-v2.0/ao_pins.h +++ b/src/telemega-v2.0/ao_pins.h @@ -387,10 +387,10 @@ struct ao_adc { */ #define NUM_PWM 4 -#define PWM_MAX 64000 +#define PWM_MAX 20000 #define AO_PWM_TIMER stm_tim4 #define AO_PWM_TIMER_ENABLE STM_RCC_APB1ENR_TIM4EN -#define AO_PWM_TIMER_SCALE 10 +#define AO_PWM_TIMER_SCALE 32 #define AO_PWM_0_GPIO (&stm_gpiod) #define AO_PWM_0_PIN 12 -- cgit v1.2.3 From ff9c034dc942ec4bc5cc30cc593ea2165e143d55 Mon Sep 17 00:00:00 2001 From: Bdale Garbee <bdale@gag.com> Date: Sun, 10 Jan 2016 17:38:26 -0700 Subject: new build dependency on asciidoc --- debian/control | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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), -- cgit v1.2.3 From ebe009b9c7c2f4de3405479f800a33b449fcbb1e Mon Sep 17 00:00:00 2001 From: Bdale Garbee <bdale@gag.com> Date: Sun, 10 Jan 2016 17:41:38 -0700 Subject: now building for m4, too --- pdclib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdclib b/pdclib index bd33f664..8b1c9061 160000 --- a/pdclib +++ b/pdclib @@ -1 +1 @@ -Subproject commit bd33f6640cf5882f8630766a9acdd1bc420a9dda +Subproject commit 8b1c9061fa3a8f1b30ee13b373afe5cc1ad9d382 -- cgit v1.2.3 From 3fdaf745f98f42f1ec4ae7cc682f47be8d8568eb Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Sun, 10 Jan 2016 14:37:05 -0800 Subject: Bump version to 1.6.2, altosdroid to 10 Signed-off-by: Keith Packard <keithp@keithp.com> --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 7440692c..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.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 -- cgit v1.2.3 From 86ccbac16f5cd0be4a4c11260816b4799cda46f2 Mon Sep 17 00:00:00 2001 From: Bdale Garbee <bdale@gag.com> Date: Sun, 10 Jan 2016 17:43:34 -0700 Subject: modify bringup scripts to handle TeleMega v2.0 --- ao-bringup/test-telemega | 2 +- ao-bringup/test-telemega-v1.0 | 66 +++++++++++++++++++++++++++++++++++++++++ ao-bringup/turnon_telemega | 2 +- ao-bringup/turnon_telemega_v1.0 | 63 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 131 insertions(+), 2 deletions(-) create mode 100755 ao-bringup/test-telemega-v1.0 create mode 100755 ao-bringup/turnon_telemega_v1.0 diff --git a/ao-bringup/test-telemega b/ao-bringup/test-telemega index 2e497886..b801b20c 100755 --- a/ao-bringup/test-telemega +++ b/ao-bringup/test-telemega @@ -1,6 +1,6 @@ #!/bin/sh -VERSION=1.0 +VERSION=2.0 PRODUCT=TeleMega BASE=`echo $PRODUCT | tr 'A-Z' 'a-z'` diff --git a/ao-bringup/test-telemega-v1.0 b/ao-bringup/test-telemega-v1.0 new file mode 100755 index 00000000..2e497886 --- /dev/null +++ b/ao-bringup/test-telemega-v1.0 @@ -0,0 +1,66 @@ +#!/bin/sh + +VERSION=1.0 +PRODUCT=TeleMega +BASE=`echo $PRODUCT | tr 'A-Z' 'a-z'` + +echo "$PRODUCT-v$VERSION Test Program" +echo "Copyright 2014 by Keith Packard. Released under GPL v2" +echo +echo "Expectations:" +echo "\t$PRODUCT v$VERSION powered from USB" +echo + +ret=1 +ao-list | while read product serial dev; do + case "$product" in + "$PRODUCT-v$VERSION") + + echo "Testing $product $serial $dev" + + ./test-igniters $dev main drogue 3 0 1 2 + echo"" + + echo "Testing baro sensor" + ../ao-tools/ao-test-baro/ao-test-baro --tty="$dev" + + case $? in + 0) + ;; + *) + echo "failed" + exit 1 + esac + echo"" + + FLASHSIZE=8388608 + + echo "Testing flash" + ../ao-tools/ao-test-flash/ao-test-flash --tty="$dev" "$FLASHSIZE" + + case $? in + 0) + ;; + *) + echo "failed" + exit 1 + esac + echo"" + + echo "Testing GPS" + ../ao-tools/ao-test-gps/ao-test-gps --tty="$dev" + + case $? in + 0) + ;; + *) + echo "failed" + exit 1 + esac + echo"" + + echo "$PRODUCT-v$VERSION" serial "$serial" is ready to ship + ret=0 + ;; + esac +done diff --git a/ao-bringup/turnon_telemega b/ao-bringup/turnon_telemega index 7b95bf20..62f51fba 100755 --- a/ao-bringup/turnon_telemega +++ b/ao-bringup/turnon_telemega @@ -14,7 +14,7 @@ else exit 1 fi -VERSION=1.0 +VERSION=2.0 REPO=~/altusmetrumllc/Binaries echo "TeleMega v$VERSION Turn-On and Calibration Program" diff --git a/ao-bringup/turnon_telemega_v1.0 b/ao-bringup/turnon_telemega_v1.0 new file mode 100755 index 00000000..7b95bf20 --- /dev/null +++ b/ao-bringup/turnon_telemega_v1.0 @@ -0,0 +1,63 @@ +#!/bin/sh + +if [ -x /usr/bin/ao-flash-stm ]; then + FLASH_STM=/usr/bin/ao-flash-stm +else + echo "Can't find ao-flash-stm! Aborting." + exit 1 +fi + +if [ -x /usr/bin/ao-usbload ]; then + USBLOAD=/usr/bin/ao-usbload +else + echo "Can't find ao-usbload! Aborting." + exit 1 +fi + +VERSION=1.0 +REPO=~/altusmetrumllc/Binaries + +echo "TeleMega v$VERSION Turn-On and Calibration Program" +echo "Copyright 2014 by Bdale Garbee. Released under GPL v2" +echo +echo "Expectations:" +echo "\tTeleMega v$VERSION powered from USB" +echo "\t\twith ST-Link-V2 cabled to debug header" +echo "\t\twith coax from UHF to frequency counter" +echo +echo -n "TeleMega-$VERSION serial number: " +read SERIAL + +echo $FLASH_STM + +$FLASH_STM $REPO/loaders/telemega-v$VERSION*.elf || exit 1 + +sleep 5 + +$USBLOAD --serial=$SERIAL $REPO/telemega-v$VERSION*.elf || exit 1 + +sleep 5 + +dev=`ao-list | awk '/TeleMega-v'"$VERSION"'/ { print $3; exit(0); }'` + +case "$dev" in +/dev/tty*) + echo "TeleMega found on $dev" + ;; +*) + echo 'No TeleMega-v'"$VERSION"' found' + exit 1 + ;; +esac + +echo 'E 0' > $dev + +SERIAL=$SERIAL ./cal-freq $dev + +../ao-tools/ao-cal-accel/ao-cal-accel $dev + +echo 'E 1' > $dev + +./test-telemega + +exit $? -- cgit v1.2.3 From 4043e0707cdc77158f709c19dd134f92b4604270 Mon Sep 17 00:00:00 2001 From: Bdale Garbee <bdale@gag.com> Date: Sun, 10 Jan 2016 17:45:45 -0700 Subject: modify release procedure to reflect Keith setting version in confgure.ac --- Releasing | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Releasing b/Releasing index f374fa00..e482d71b 100644 --- a/Releasing +++ b/Releasing @@ -5,6 +5,8 @@ These are Bdale's notes on how to do a release. git checkout master + - update the version in configure.ac if Keith hasn't already + - make sure the Google Maps API key is in the build chroot and root sudo mkdir -p /var/cache/pbuilder/base.cow/opt/google /opt/google sudo cp ~/altusmetrumllc/google-maps-api-key \ @@ -19,8 +21,6 @@ These are Bdale's notes on how to do a release. git checkout branch-<version> # the x.y parts only - cherry-pick or merge appropriate content from master - - update the version in configure.ac - - make sure there is a doc/release-notes-<version>.xsl - make sure that doc/altusmetrum.xsl has the right copyright year, and add release to the revision history at the front (release notes -- cgit v1.2.3 From 3547e65eecbe7bd4e16dc6f2048b7a69f29d05ff Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Sun, 10 Jan 2016 16:59:37 -0800 Subject: doc: Update copyright year in altusmetrum doc And note that this need to be checked for each release in RELNOTES Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/RELNOTES | 9 +++++++++ doc/altusmetrum-docinfo.xml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/doc/RELNOTES b/doc/RELNOTES index 0b04ac5f..8f7d2540 100644 --- a/doc/RELNOTES +++ b/doc/RELNOTES @@ -21,5 +21,14 @@ Creating documentation for a new release of AltOS 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/altusmetrum-docinfo.xml b/doc/altusmetrum-docinfo.xml index 9f2dda1c..8644584f 100644 --- a/doc/altusmetrum-docinfo.xml +++ b/doc/altusmetrum-docinfo.xml @@ -18,7 +18,7 @@ <surname>Towns</surname> </author> <copyright> - <year>2015</year> + <year>2016</year> <holder>Bdale Garbee and Keith Packard</holder> </copyright> <mediaobject> -- cgit v1.2.3 From 6cbf93995d90fc4790eb77bcaa233742857fe052 Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Sun, 10 Jan 2016 17:01:57 -0800 Subject: doc: fix typo in using external active switch circuit section the -> then (bdale) Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/usage.inc | 2 +- pdclib | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/usage.inc b/doc/usage.inc index 3f59a50f..8349f86c 100644 --- a/doc/usage.inc +++ b/doc/usage.inc @@ -267,7 +267,7 @@ 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 + hook these up for each flight computer below. Then follow the instructions that come with your active switch to connect it up. diff --git a/pdclib b/pdclib index 8b1c9061..bd33f664 160000 --- a/pdclib +++ b/pdclib @@ -1 +1 @@ -Subproject commit 8b1c9061fa3a8f1b30ee13b373afe5cc1ad9d382 +Subproject commit bd33f6640cf5882f8630766a9acdd1bc420a9dda -- cgit v1.2.3 From 6a00f186a06f22638882f43f49fa0c03ea387eac Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Sun, 10 Jan 2016 17:13:56 -0800 Subject: doc: Remove telemini v2.0. Add telemega v2.0 Reflect hardware we've actually shipped. Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/Makefile | 2 - doc/altusmetrum-docinfo.xml | 2 +- doc/altusmetrum.txt | 2 - doc/flight-data-recording.inc | 1 - doc/getting-started.inc | 1 - doc/specs.inc | 8 --- doc/system-operation.inc | 3 +- doc/telemega.inc | 12 +++++ doc/telemini-v2-top.jpg | Bin 579692 -> 0 bytes doc/telemini-v2.0.inc | 112 ------------------------------------------ 10 files changed, 14 insertions(+), 129 deletions(-) delete mode 100644 doc/telemini-v2-top.jpg delete mode 100644 doc/telemini-v2.0.inc diff --git a/doc/Makefile b/doc/Makefile index 08835ad3..6a04a591 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -84,7 +84,6 @@ IMAGES=\ telemetrum-v2.0-th.jpg \ telemini.svg \ telemini-v1-top.jpg \ - telemini-v2-top.jpg \ altusmetrum-oneline.svg \ telegps-oneline.svg \ micropeak-oneline.svg @@ -105,7 +104,6 @@ INC_FILES=\ usage.inc \ telemetrum.inc \ telemini-v1.0.inc \ - telemini-v2.0.inc \ easymini-device.inc \ telemega.inc \ easymega.inc \ diff --git a/doc/altusmetrum-docinfo.xml b/doc/altusmetrum-docinfo.xml index 8644584f..63c1e035 100644 --- a/doc/altusmetrum-docinfo.xml +++ b/doc/altusmetrum-docinfo.xml @@ -115,7 +115,7 @@ <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 + for TeleMega, TeleMetrum v2.0 and EasyMini and fixes bugs in AltosUI and the AltOS firmware. </revremark> </revision> diff --git a/doc/altusmetrum.txt b/doc/altusmetrum.txt index 598de8e6..15fc28fc 100644 --- a/doc/altusmetrum.txt +++ b/doc/altusmetrum.txt @@ -24,8 +24,6 @@ include::telemini-v1.0.raw[] - include::telemini-v2.0.raw[] - include::easymini-device.raw[] include::telemega.raw[] diff --git a/doc/flight-data-recording.inc b/doc/flight-data-recording.inc index d0ffa7f1..32e44840 100644 --- a/doc/flight-data-recording.inc +++ b/doc/flight-data-recording.inc @@ -25,7 +25,6 @@ endif::telemetrum[] ifdef::telemini[] |TeleMini v1.0 |2 |5kB |4 - |TeleMini v2.0 |16 |1MB |10 endif::telemini[] ifdef::easymini[] |EasyMini |16 |1MB |10 diff --git a/doc/getting-started.inc b/doc/getting-started.inc index 9c0df26d..decaf4d4 100644 --- a/doc/getting-started.inc +++ b/doc/getting-started.inc @@ -22,7 +22,6 @@ USB power source. You can also choose to use another battery with - ifdef::telemini[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 diff --git a/doc/specs.inc b/doc/specs.inc index 72664625..a6c7b69a 100644 --- a/doc/specs.inc +++ b/doc/specs.inc @@ -57,14 +57,6 @@ |10mW |3.7V - |TeleMini v2.0 - |MS5607 30km (100k') - |- - |- - |- - |1MB - |10mW - |3.7-12V endif::telemini[] ifdef::easymini[] diff --git a/doc/system-operation.inc b/doc/system-operation.inc index 313415ca..e68b2acb 100644 --- a/doc/system-operation.inc +++ b/doc/system-operation.inc @@ -19,8 +19,7 @@ idle mode. endif::telemetrum,telemega,easymega[] Since - ifdef::telemini[TeleMini v2.0 and EasyMini don't] - ifndef::telemini[EasyMini doesn't] + 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, diff --git a/doc/telemega.inc b/doc/telemega.inc index 4383f228..55f77bc4 100644 --- a/doc/telemega.inc +++ b/doc/telemega.inc @@ -9,6 +9,18 @@ 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 diff --git a/doc/telemini-v2-top.jpg b/doc/telemini-v2-top.jpg deleted file mode 100644 index bc8ae45b..00000000 Binary files a/doc/telemini-v2-top.jpg and /dev/null differ diff --git a/doc/telemini-v2.0.inc b/doc/telemini-v2.0.inc deleted file mode 100644 index 5803a2ca..00000000 --- a/doc/telemini-v2.0.inc +++ /dev/null @@ -1,112 +0,0 @@ -== TeleMini v2.0 - - .TeleMini v2.0 Board - image::telemini-v2-top.jpg[width="5.5in"] - - 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. - - === TeleMini v2.0 Screw Terminals - - 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: - - .TeleMini v2.0 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 TeleMini v2.0 - - There are two possible battery connections on TeleMini - v2.0. 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 TeleMini v2.0 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 TeleMini v2.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. - - To connect the negative pyro battery terminal to TeleMini - 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 TeleMini v2.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 (top - terminal 1 for the Main charge, bottom terminal 1 for the - Apogee charge). - - === Using an Active Switch with TeleMini v2.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. 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. -- cgit v1.2.3 From 81b8f4da612b527915f68f632fbd94a46bc1795f Mon Sep 17 00:00:00 2001 From: Keith Packard <keithp@keithp.com> Date: Sun, 10 Jan 2016 17:22:35 -0800 Subject: doc: Remove extraneous 'first off' from legal paragraph Not helpful (bdale) Signed-off-by: Keith Packard <keithp@keithp.com> --- doc/using-am-products.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/using-am-products.inc b/doc/using-am-products.inc index 8bca563d..1969529f 100644 --- a/doc/using-am-products.inc +++ b/doc/using-am-products.inc @@ -3,7 +3,7 @@ ifdef::radio[] === Being Legal - First off, in the US, you need an + 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. -- cgit v1.2.3 From 73ce3f73526edfabccd3b98e6e67de6d82a84b63 Mon Sep 17 00:00:00 2001 From: Bdale Garbee <bdale@gag.com> Date: Sun, 10 Jan 2016 18:58:31 -0700 Subject: submodule madness --- pdclib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdclib b/pdclib index bd33f664..8b1c9061 160000 --- a/pdclib +++ b/pdclib @@ -1 +1 @@ -Subproject commit bd33f6640cf5882f8630766a9acdd1bc420a9dda +Subproject commit 8b1c9061fa3a8f1b30ee13b373afe5cc1ad9d382 -- cgit v1.2.3