diff options
Diffstat (limited to 'ao-tools')
| -rw-r--r-- | ao-tools/Makefile.am | 3 | ||||
| -rw-r--r-- | ao-tools/ao-cal-accel/.gitignore | 1 | ||||
| -rw-r--r-- | ao-tools/ao-cal-accel/Makefile.am | 11 | ||||
| -rw-r--r-- | ao-tools/ao-cal-accel/ao-cal-accel.1 | 58 | ||||
| -rw-r--r-- | ao-tools/ao-cal-accel/ao-cal-accel.c | 284 | ||||
| -rw-r--r-- | ao-tools/ao-send-telem/ao-send-telem.c | 6 | ||||
| -rw-r--r-- | ao-tools/ao-test-baro/.gitignore | 1 | ||||
| -rw-r--r-- | ao-tools/ao-test-baro/Makefile.am | 11 | ||||
| -rw-r--r-- | ao-tools/ao-test-baro/ao-test-baro.1 | 56 | ||||
| -rw-r--r-- | ao-tools/ao-test-baro/ao-test-baro.c | 238 | ||||
| -rw-r--r-- | ao-tools/ao-test-flash/.gitignore | 1 | ||||
| -rw-r--r-- | ao-tools/ao-test-flash/Makefile.am | 11 | ||||
| -rw-r--r-- | ao-tools/ao-test-flash/ao-test-flash.1 | 59 | ||||
| -rw-r--r-- | ao-tools/ao-test-flash/ao-test-flash.c | 245 | ||||
| -rw-r--r-- | ao-tools/ao-test-igniter/.gitignore | 1 | ||||
| -rw-r--r-- | ao-tools/ao-test-igniter/Makefile.am | 11 | ||||
| -rw-r--r-- | ao-tools/ao-test-igniter/ao-test-igniter.1 | 59 | ||||
| -rw-r--r-- | ao-tools/ao-test-igniter/ao-test-igniter.c | 223 | ||||
| -rw-r--r-- | ao-tools/lib/cc-convert.c | 23 | ||||
| -rw-r--r-- | ao-tools/lib/cc-telemetry.c | 1 | ||||
| -rw-r--r-- | ao-tools/lib/cc.h | 161 | 
21 files changed, 1462 insertions, 2 deletions
| diff --git a/ao-tools/Makefile.am b/ao-tools/Makefile.am index a42988d6..2d873e50 100644 --- a/ao-tools/Makefile.am +++ b/ao-tools/Makefile.am @@ -1,7 +1,8 @@  SUBDIRS=lib ao-rawload ao-dbg ao-bitbang ao-eeprom ao-list \  	ao-load ao-telem ao-send-telem ao-sky-flash \  	ao-dumpflash ao-edit-telem ao-dump-up ao-elftohex \ -	ao-flash ao-usbload +	ao-flash ao-usbload ao-test-igniter ao-test-baro \ +	ao-test-flash ao-cal-accel  if LIBSTLINK  SUBDIRS += ao-stmload  endif diff --git a/ao-tools/ao-cal-accel/.gitignore b/ao-tools/ao-cal-accel/.gitignore new file mode 100644 index 00000000..73402b2b --- /dev/null +++ b/ao-tools/ao-cal-accel/.gitignore @@ -0,0 +1 @@ +ao-cal-accel diff --git a/ao-tools/ao-cal-accel/Makefile.am b/ao-tools/ao-cal-accel/Makefile.am new file mode 100644 index 00000000..d278097a --- /dev/null +++ b/ao-tools/ao-cal-accel/Makefile.am @@ -0,0 +1,11 @@ +bin_PROGRAMS=ao-cal-accel + +AM_CFLAGS=-I$(top_srcdir)/ao-tools/lib $(LIBUSB_CFLAGS) + +ao_cal_accel_DEPENDENCIES = $(top_builddir)/ao-tools/lib/libao-tools.a + +ao_cal_accel_LDADD=$(top_builddir)/ao-tools/lib/libao-tools.a $(LIBUSB_LIBS) + +ao_cal_accel_SOURCES=ao-cal-accel.c + +man_MANS = ao-cal-accel.1 diff --git a/ao-tools/ao-cal-accel/ao-cal-accel.1 b/ao-tools/ao-cal-accel/ao-cal-accel.1 new file mode 100644 index 00000000..eb75d7c7 --- /dev/null +++ b/ao-tools/ao-cal-accel/ao-cal-accel.1 @@ -0,0 +1,58 @@ +.\" +.\" Copyright © 2009 Keith Packard <keithp@keithp.com> +.\" +.\" This program is free software; you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation; either version 2 of the License, or +.\" (at your option) any later version. +.\" +.\" 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. +.\" +.\" +.TH AO-LOAD 1 "ao-cal-accel" "" +.SH NAME +ao-cal-accel \- Calibrate AltOS flight computer accelerometers +.SH SYNOPSIS +.B "ao-cal-accel" +[\-T \fItty-device\fP] +[\--tty \fItty-device\fP] +[\-D \fIaltos-device\fP] +[\--device \fIaltos-device\fP] +.SH DESCRIPTION +.I ao-cal-accel +drives the built-in accelerometer calibration and validates the results. +.SH OPTIONS +.TP +\-T tty-device | --tty tty-device +This selects which tty device the debugger uses to communicate with +the target device. The special name 'BITBANG' directs ao-dbg to use +the cp2103 connection, otherwise this should be a usb serial port +connected to a suitable cc1111 debug node. +.TP +\-D AltOS-device | --device AltOS-device +Search for a connected device. This requires an argument of one of the +following forms: +.IP +TeleMega:2 +.br +TeleMega +.br +2 +.IP +Leaving out the product name will cause the tool to select a suitable +product, leaving out the serial number will cause the tool to match +one of the available devices. +.SH USAGE +.I ao-cal-accel +opens the target device, executes the accelerometer calibration +command, verifies that it executed correctly, then shows the resulting +calibration values and saves them to configuration memory. +.SH AUTHOR +Keith Packard diff --git a/ao-tools/ao-cal-accel/ao-cal-accel.c b/ao-tools/ao-cal-accel/ao-cal-accel.c new file mode 100644 index 00000000..9a988648 --- /dev/null +++ b/ao-tools/ao-cal-accel/ao-cal-accel.c @@ -0,0 +1,284 @@ +/* + * Copyright © 2014 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <err.h> +#include <fcntl.h> +#include <gelf.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <sysexits.h> +#include <unistd.h> +#include <getopt.h> +#include <string.h> +#include <stdbool.h> +#include <termios.h> +#include "ao-elf.h" +#include "ccdbg.h" +#include "cc-usb.h" +#include "cc.h" +#include "ao-verbose.h" + +static const struct option options[] = { +	{ .name = "tty", .has_arg = 1, .val = 'T' }, +	{ .name = "device", .has_arg = 1, .val = 'D' }, +	{ .name = "raw", .has_arg = 0, .val = 'r' }, +	{ .name = "verbose", .has_arg = 1, .val = 'v' }, +	{ 0, 0, 0, 0}, +}; + +static void usage(char *program) +{ +	fprintf(stderr, "usage: %s [--verbose=<verbose>] [--device=<device>] [-tty=<tty>]\n", program); +	exit(1); +} + +void +done(struct cc_usb *cc, int code) +{ +	cc_usb_close(cc); +	exit (code); +} + +static int +ends_with(char *whole, char *suffix) +{ +	int whole_len = strlen(whole); +	int suffix_len = strlen(suffix); + +	if (suffix_len > whole_len) +		return 0; +	return strcmp(whole + whole_len - suffix_len, suffix) == 0; +} + +static int +starts_with(char *whole, char *prefix) +{ +	int whole_len = strlen(whole); +	int prefix_len = strlen(prefix); + +	if (prefix_len > whole_len) +		return 0; +	return strncmp(whole, prefix, prefix_len) == 0; +} + +static char ** +tok(char *line) { +	char	**strs = malloc (sizeof (char *)), *str; +	int	n = 0; + +	while ((str = strtok(line, " \t"))) { +		line = NULL; +		strs = realloc(strs, (n + 2) * sizeof (char *)); +		strs[n] = strdup(str); +		n++; +	} +	strs[n] = '\0'; +	return strs; +} + +static void +free_strs(char **strs) { +	char	*str; +	int	i; + +	for (i = 0; (str = strs[i]) != NULL; i++) +		free(str); +	free(strs); +} + +struct flash { +	struct flash	*next; +	char		line[512]; +	char		**strs; +}; + +static struct flash * +flash(struct cc_usb *usb) +{ +	struct flash	*head = NULL, **tail = &head; +	cc_usb_printf(usb, "c s\nv\n"); +	for (;;) { +		char	line[512]; +		struct flash	*b; + +		cc_usb_getline(usb, line, sizeof (line)); +		b = malloc (sizeof (struct flash)); +		strcpy(b->line, line); +		b->strs = tok(line); +		b->next = NULL; +		*tail = b; +		tail = &b->next; +		if (strstr(line, "software-version")) +			break; +	} +	return head; +} + +static void +free_flash(struct flash *b) { +	struct flash *n; + +	while (b) { +		n = b->next; +		free_strs(b->strs); +		free(b); +		b = n; +	} +} + +char ** +find_flash(struct flash *b, char *word0) { +	int i; +	for (;b; b = b->next) { +		if (strstr(b->line, word0)) +			return b->strs; +	} +	return NULL; +} + +void +await_key(void) +{ +	struct termios	termios, termios_save; +	char	buf[512]; + +	tcgetattr(0, &termios); +	termios_save = termios; +	cfmakeraw(&termios); +	tcsetattr(0, TCSAFLUSH, &termios); +	read(0, buf, sizeof (buf)); +	tcsetattr(0, TCSAFLUSH, &termios_save); +} + +int +do_cal(struct cc_usb *usb) { +	struct flash	*b; +	char	**accel; +	char	line[1024]; +	int	l; +	int	running = 0; +	int	worked = 1; + +	cc_usb_printf(usb, "E 1\nc a 0\n"); + +	for (;;) { +		int	c = cc_usb_getchar_timeout(usb, 20*1000); + +		if (c == '\n') +			l = 0; +		else if (l < sizeof (line) - 1) +			line[l++] = c; +		line[l] = '\0'; +		putchar(c); fflush(stdout); +		if (strstr(line, "press a key...")) { +			await_key(); +			cc_usb_printf(usb, " "); +			l = 0; +			running = 1; +		} +		else if (strstr(line, "Invalid")) +			worked = 0; +		if (running && strstr(line, ">")) { +			printf("\n"); +			break; +		} +	} +	cc_usb_printf(usb, "E 0\n"); + +	if (!worked) { +		printf("Calibration failed\n"); +		return 0; +	} + +	b = flash(usb); + +	accel = find_flash(b, "Accel cal"); +	if (!accel) { +		printf("no response\n"); +		return 0; +	} + +	printf ("Accel cal +1g: %s -1g: %s\n", +		accel[3], accel[5]); + +	printf ("Saving..."); fflush(stdout); +	cc_usb_printf (usb, "c w\n"); +	cc_usb_sync(usb); +	b = flash(usb); +	printf ("done\n"); + +	return worked; +} + +int +main (int argc, char **argv) +{ +	char			*device = NULL; +	char			*filename; +	Elf			*e; +	unsigned int		s; +	int			i; +	int			c; +	int			tries; +	struct cc_usb		*cc = NULL; +	char			*tty = NULL; +	int			success; +	int			verbose = 0; +	int			ret = 0; +	int			expected_size; + +	while ((c = getopt_long(argc, argv, "rT:D:c:s:v:", options, NULL)) != -1) { +		switch (c) { +		case 'T': +			tty = optarg; +			break; +		case 'D': +			device = optarg; +			break; +		case 'v': +			verbose++; +			break; +		default: +			usage(argv[0]); +			break; +		} +	} + +	ao_verbose = verbose; + +	if (verbose > 1) +		ccdbg_add_debug(CC_DEBUG_BITBANG); + +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "AltosFlash"); +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "TeleMega"); +	if (!tty) +		tty = getenv("ALTOS_TTY"); +	if (!tty) +		tty="/dev/ttyACM0"; + +	cc = cc_usb_open(tty); + +	if (!cc) +		exit(1); + +	if (!do_cal(cc)) +		ret = 1; +	done(cc, ret); +} diff --git a/ao-tools/ao-send-telem/ao-send-telem.c b/ao-tools/ao-send-telem/ao-send-telem.c index 3db44542..26c3263e 100644 --- a/ao-tools/ao-send-telem/ao-send-telem.c +++ b/ao-tools/ao-send-telem/ao-send-telem.c @@ -85,6 +85,12 @@ packet_state(union ao_telemetry_all *telem)  	case AO_TELEMETRY_MEGA_DATA:  		cur_state = telem->mega_data.state;  		break; +	case AO_TELEMETRY_METRUM_SENSOR: +		cur_state = telem->metrum_sensor.state; +		break; +	case AO_TELEMETRY_MINI: +		cur_state = telem->mini.state; +		break;  	}  	return cur_state;  } diff --git a/ao-tools/ao-test-baro/.gitignore b/ao-tools/ao-test-baro/.gitignore new file mode 100644 index 00000000..f5fb64d4 --- /dev/null +++ b/ao-tools/ao-test-baro/.gitignore @@ -0,0 +1 @@ +ao-test-baro diff --git a/ao-tools/ao-test-baro/Makefile.am b/ao-tools/ao-test-baro/Makefile.am new file mode 100644 index 00000000..69e47529 --- /dev/null +++ b/ao-tools/ao-test-baro/Makefile.am @@ -0,0 +1,11 @@ +bin_PROGRAMS=ao-test-baro + +AM_CFLAGS=-I$(top_srcdir)/ao-tools/lib $(LIBUSB_CFLAGS) + +ao_test_baro_DEPENDENCIES = $(top_builddir)/ao-tools/lib/libao-tools.a + +ao_test_baro_LDADD=$(top_builddir)/ao-tools/lib/libao-tools.a $(LIBUSB_LIBS) + +ao_test_baro_SOURCES=ao-test-baro.c + +man_MANS = ao-test-baro.1 diff --git a/ao-tools/ao-test-baro/ao-test-baro.1 b/ao-tools/ao-test-baro/ao-test-baro.1 new file mode 100644 index 00000000..0004dba8 --- /dev/null +++ b/ao-tools/ao-test-baro/ao-test-baro.1 @@ -0,0 +1,56 @@ +.\" +.\" Copyright © 2009 Keith Packard <keithp@keithp.com> +.\" +.\" This program is free software; you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation; either version 2 of the License, or +.\" (at your option) any later version. +.\" +.\" 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. +.\" +.\" +.TH AO-LOAD 1 "ao-test-baro" "" +.SH NAME +ao-test-baro \- test AltOS flight computer barometric sensor +.SH SYNOPSIS +.B "ao-test-baro" +[\-T \fItty-device\fP] +[\--tty \fItty-device\fP] +[\-D \fIaltos-device\fP] +[\--device \fIaltos-device\fP] +\fIbaro-name...\fP +.SH DESCRIPTION +.I ao-test-baro +makes sure the altitude is between -50m and 3000m and temperature is +between 20°C and 30°C. +.SH OPTIONS +.TP +\-T tty-device | --tty tty-device +This selects which tty device the debugger uses to communicate with +the target device. +.TP +\-D AltOS-device | --device AltOS-device +Search for a connected device. This requires an argument of one of the +following forms: +.IP +TeleMega:2 +.br +TeleMega +.br +2 +.IP +Leaving out the product name will cause the tool to select a suitable +product, leaving out the serial number will cause the tool to match +one of the available devices. +.SH USAGE +.I ao-test-baro +opens the target device and queries the current barometric data. +.SH AUTHOR +Keith Packard diff --git a/ao-tools/ao-test-baro/ao-test-baro.c b/ao-tools/ao-test-baro/ao-test-baro.c new file mode 100644 index 00000000..e883de4a --- /dev/null +++ b/ao-tools/ao-test-baro/ao-test-baro.c @@ -0,0 +1,238 @@ +/* + * Copyright © 2014 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <err.h> +#include <fcntl.h> +#include <gelf.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <sysexits.h> +#include <unistd.h> +#include <getopt.h> +#include <string.h> +#include <stdbool.h> +#include "ao-elf.h" +#include "ccdbg.h" +#include "cc-usb.h" +#include "cc.h" +#include "ao-verbose.h" + +static const struct option options[] = { +	{ .name = "tty", .has_arg = 1, .val = 'T' }, +	{ .name = "device", .has_arg = 1, .val = 'D' }, +	{ .name = "raw", .has_arg = 0, .val = 'r' }, +	{ .name = "verbose", .has_arg = 1, .val = 'v' }, +	{ 0, 0, 0, 0}, +}; + +static void usage(char *program) +{ +	fprintf(stderr, "usage: %s [--verbose=<verbose>] [--device=<device>] [-tty=<tty>] main|drogue\n", program); +	exit(1); +} + +void +done(struct cc_usb *cc, int code) +{ +/*	cc_usb_printf(cc, "a\n"); */ +	cc_usb_close(cc); +	exit (code); +} + +static int +ends_with(char *whole, char *suffix) +{ +	int whole_len = strlen(whole); +	int suffix_len = strlen(suffix); + +	if (suffix_len > whole_len) +		return 0; +	return strcmp(whole + whole_len - suffix_len, suffix) == 0; +} + +static int +starts_with(char *whole, char *prefix) +{ +	int whole_len = strlen(whole); +	int prefix_len = strlen(prefix); + +	if (prefix_len > whole_len) +		return 0; +	return strncmp(whole, prefix, prefix_len) == 0; +} + +static char ** +tok(char *line) { +	char	**strs = malloc (sizeof (char *)), *str; +	int	n = 0; + +	while ((str = strtok(line, " \t"))) { +		line = NULL; +		strs = realloc(strs, (n + 2) * sizeof (char *)); +		strs[n] = strdup(str); +		n++; +	} +	strs[n] = '\0'; +	return strs; +} + +static void +free_strs(char **strs) { +	char	*str; +	int	i; + +	for (i = 0; (str = strs[i]) != NULL; i++) +		free(str); +	free(strs); +} + +struct baro { +	struct baro	*next; +	char		**strs; +}; + +static struct baro * +baro(struct cc_usb *usb) +{ +	struct baro	*head = NULL, **tail = &head; +	cc_usb_printf(usb, "B\n"); +	for (;;) { +		char	line[512]; +		struct baro	*b; + +		cc_usb_getline(usb, line, sizeof (line)); +		b = malloc (sizeof (struct baro)); +		b->strs = tok(line); +		b->next = NULL; +		*tail = b; +		tail = &b->next; +		if (strstr(line, "Altitude:")) +			break; +	} +	return head; +} + +static void +free_baro(struct baro *b) { +	struct baro *n; + +	while (b) { +		n = b->next; +		free_strs(b->strs); +		free(b); +		b = n; +	} +} + +char ** +find_baro(struct baro *b, char *word0) { +	int i; +	for (;b; b = b->next) +		if (b->strs[0] && !strcmp(b->strs[0], word0)) +			return b->strs; +	return NULL; +} + +int +do_baro(struct cc_usb *usb) { +	struct baro *b = baro(usb); +	char **temp = find_baro(b, "Temperature:"); +	char **alt = find_baro(b, "Altitude:"); + +	if (!temp || !alt) { +		printf("no response\n"); +		free_baro(b); +		return 0; +	} + +	double temperature = strtod(temp[2], NULL) / 100.0; +	double altitude = strtod(alt[1], NULL); + +	if (altitude < -50 || 3000 < altitude) { +		printf ("weird altitude %f\n", altitude); +		free_baro(b); +		return 0; +	} + +	if (temperature < 20 || 35 < temperature) { +		printf ("weird temperature %f\n", temperature); +		free_baro(b); +		return 0; +	} + +	printf ("altitude %f temperature %f\n", altitude, temperature); + +	return 1; +} + +int +main (int argc, char **argv) +{ +	char			*device = NULL; +	char			*filename; +	Elf			*e; +	unsigned int		s; +	int			i; +	int			c; +	int			tries; +	struct cc_usb		*cc = NULL; +	char			*tty = NULL; +	int			success; +	int			verbose = 0; +	int			ret = 0; + +	while ((c = getopt_long(argc, argv, "rT:D:c:s:v:", options, NULL)) != -1) { +		switch (c) { +		case 'T': +			tty = optarg; +			break; +		case 'D': +			device = optarg; +			break; +		case 'v': +			verbose++; +			break; +		default: +			usage(argv[0]); +			break; +		} +	} + +	ao_verbose = verbose; + +	if (verbose > 1) +		ccdbg_add_debug(CC_DEBUG_BITBANG); + +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "AltosFlash"); +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "TeleMega"); +	if (!tty) +		tty = getenv("ALTOS_TTY"); +	if (!tty) +		tty="/dev/ttyACM0"; + +	cc = cc_usb_open(tty); + +	if (!cc) +		exit(1); + +	if (!do_baro(cc)) +		ret = 1; +	done(cc, ret); +} diff --git a/ao-tools/ao-test-flash/.gitignore b/ao-tools/ao-test-flash/.gitignore new file mode 100644 index 00000000..40ab1ef3 --- /dev/null +++ b/ao-tools/ao-test-flash/.gitignore @@ -0,0 +1 @@ +ao-test-flash diff --git a/ao-tools/ao-test-flash/Makefile.am b/ao-tools/ao-test-flash/Makefile.am new file mode 100644 index 00000000..0323c282 --- /dev/null +++ b/ao-tools/ao-test-flash/Makefile.am @@ -0,0 +1,11 @@ +bin_PROGRAMS=ao-test-flash + +AM_CFLAGS=-I$(top_srcdir)/ao-tools/lib $(LIBUSB_CFLAGS) + +ao_test_flash_DEPENDENCIES = $(top_builddir)/ao-tools/lib/libao-tools.a + +ao_test_flash_LDADD=$(top_builddir)/ao-tools/lib/libao-tools.a $(LIBUSB_LIBS) + +ao_test_flash_SOURCES=ao-test-flash.c + +man_MANS = ao-test-flash.1 diff --git a/ao-tools/ao-test-flash/ao-test-flash.1 b/ao-tools/ao-test-flash/ao-test-flash.1 new file mode 100644 index 00000000..155bd1bf --- /dev/null +++ b/ao-tools/ao-test-flash/ao-test-flash.1 @@ -0,0 +1,59 @@ +.\" +.\" Copyright © 2009 Keith Packard <keithp@keithp.com> +.\" +.\" This program is free software; you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation; either version 2 of the License, or +.\" (at your option) any later version. +.\" +.\" 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. +.\" +.\" +.TH AO-LOAD 1 "ao-test-igniter" "" +.SH NAME +ao-test-igniter \- test AltOS flight computer igniters +.SH SYNOPSIS +.B "ao-test-igniter" +[\-T \fItty-device\fP] +[\--tty \fItty-device\fP] +[\-D \fIaltos-device\fP] +[\--device \fIaltos-device\fP] +\fIigniter-name...\fP +.SH DESCRIPTION +.I ao-test-igniter +test the status and then fires the specified igniters on the target device +.SH OPTIONS +.TP +\-T tty-device | --tty tty-device +This selects which tty device the debugger uses to communicate with +the target device. The special name 'BITBANG' directs ao-dbg to use +the cp2103 connection, otherwise this should be a usb serial port +connected to a suitable cc1111 debug node. +.TP +\-D AltOS-device | --device AltOS-device +Search for a connected device. This requires an argument of one of the +following forms: +.IP +TeleMega:2 +.br +TeleMega +.br +2 +.IP +Leaving out the product name will cause the tool to select a suitable +product, leaving out the serial number will cause the tool to match +one of the available devices. +.SH USAGE +.I ao-test-igniter +opens the target device, lists the available igniter and then fires +the specified ones. And error occurrs if any of the specified igniters +is not present or not ready. +.SH AUTHOR +Keith Packard diff --git a/ao-tools/ao-test-flash/ao-test-flash.c b/ao-tools/ao-test-flash/ao-test-flash.c new file mode 100644 index 00000000..cf44ae69 --- /dev/null +++ b/ao-tools/ao-test-flash/ao-test-flash.c @@ -0,0 +1,245 @@ +/* + * Copyright © 2014 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <err.h> +#include <fcntl.h> +#include <gelf.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <sysexits.h> +#include <unistd.h> +#include <getopt.h> +#include <string.h> +#include <stdbool.h> +#include "ao-elf.h" +#include "ccdbg.h" +#include "cc-usb.h" +#include "cc.h" +#include "ao-verbose.h" + +static const struct option options[] = { +	{ .name = "tty", .has_arg = 1, .val = 'T' }, +	{ .name = "device", .has_arg = 1, .val = 'D' }, +	{ .name = "raw", .has_arg = 0, .val = 'r' }, +	{ .name = "verbose", .has_arg = 1, .val = 'v' }, +	{ 0, 0, 0, 0}, +}; + +static void usage(char *program) +{ +	fprintf(stderr, "usage: %s [--verbose=<verbose>] [--device=<device>] [-tty=<tty>] <expected-size>\n", program); +	exit(1); +} + +void +done(struct cc_usb *cc, int code) +{ +	cc_usb_close(cc); +	exit (code); +} + +static int +ends_with(char *whole, char *suffix) +{ +	int whole_len = strlen(whole); +	int suffix_len = strlen(suffix); + +	if (suffix_len > whole_len) +		return 0; +	return strcmp(whole + whole_len - suffix_len, suffix) == 0; +} + +static int +starts_with(char *whole, char *prefix) +{ +	int whole_len = strlen(whole); +	int prefix_len = strlen(prefix); + +	if (prefix_len > whole_len) +		return 0; +	return strncmp(whole, prefix, prefix_len) == 0; +} + +static char ** +tok(char *line) { +	char	**strs = malloc (sizeof (char *)), *str; +	int	n = 0; + +	while ((str = strtok(line, " \t"))) { +		line = NULL; +		strs = realloc(strs, (n + 2) * sizeof (char *)); +		strs[n] = strdup(str); +		n++; +	} +	strs[n] = '\0'; +	return strs; +} + +static void +free_strs(char **strs) { +	char	*str; +	int	i; + +	for (i = 0; (str = strs[i]) != NULL; i++) +		free(str); +	free(strs); +} + +struct flash { +	struct flash	*next; +	char		line[512]; +	char		**strs; +}; + +static struct flash * +flash(struct cc_usb *usb) +{ +	struct flash	*head = NULL, **tail = &head; +	cc_usb_printf(usb, "f\nv\n"); +	for (;;) { +		char	line[512]; +		struct flash	*b; + +		cc_usb_getline(usb, line, sizeof (line)); +		b = malloc (sizeof (struct flash)); +		strcpy(b->line, line); +		b->strs = tok(line); +		b->next = NULL; +		*tail = b; +		tail = &b->next; +		if (strstr(line, "software-version")) +			break; +	} +	return head; +} + +static void +free_flash(struct flash *b) { +	struct flash *n; + +	while (b) { +		n = b->next; +		free_strs(b->strs); +		free(b); +		b = n; +	} +} + +char ** +find_flash(struct flash *b, char *word0) { +	int i; +	for (;b; b = b->next) { +		if (strstr(b->line, word0)) +			return b->strs; +	} +	return NULL; +} + +int +do_flash(struct cc_usb *usb, int expected_size) { +	struct flash *b = flash(usb); +	char **size = find_flash(b, "Storage size:"); +	char **erase = find_flash(b, "Storage erase unit:"); + +	if (!size || !erase) { +		printf("no response\n"); +		free_flash(b); +		return 0; +	} + +	int actual_size = atoi(size[2]); + +	if (actual_size != expected_size) { +		printf ("weird flash size %d != %d\n", actual_size, expected_size); +		free_flash(b); +		return 0; +	} + +	int actual_erase = atoi(erase[3]); + +	if (actual_erase != 65536) { +		printf ("weird erase size %d\n", actual_erase); +		free_flash(b); +		return 0; +	} + +	printf ("flash size %d erase block %d\n", actual_size, actual_erase); + +	return 1; +} + +int +main (int argc, char **argv) +{ +	char			*device = NULL; +	char			*filename; +	Elf			*e; +	unsigned int		s; +	int			i; +	int			c; +	int			tries; +	struct cc_usb		*cc = NULL; +	char			*tty = NULL; +	int			success; +	int			verbose = 0; +	int			ret = 0; +	int			expected_size; + +	while ((c = getopt_long(argc, argv, "rT:D:c:s:v:", options, NULL)) != -1) { +		switch (c) { +		case 'T': +			tty = optarg; +			break; +		case 'D': +			device = optarg; +			break; +		case 'v': +			verbose++; +			break; +		default: +			usage(argv[0]); +			break; +		} +	} + +	if (!argv[optind]) +		usage(argv[0]); + +	ao_verbose = verbose; + +	if (verbose > 1) +		ccdbg_add_debug(CC_DEBUG_BITBANG); + +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "AltosFlash"); +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "TeleMega"); +	if (!tty) +		tty = getenv("ALTOS_TTY"); +	if (!tty) +		tty="/dev/ttyACM0"; + +	cc = cc_usb_open(tty); + +	if (!cc) +		exit(1); + +	if (!do_flash(cc, atoi(argv[optind]))) +		ret = 1; +	done(cc, ret); +} diff --git a/ao-tools/ao-test-igniter/.gitignore b/ao-tools/ao-test-igniter/.gitignore new file mode 100644 index 00000000..deee445f --- /dev/null +++ b/ao-tools/ao-test-igniter/.gitignore @@ -0,0 +1 @@ +ao-test-igniter diff --git a/ao-tools/ao-test-igniter/Makefile.am b/ao-tools/ao-test-igniter/Makefile.am new file mode 100644 index 00000000..e24ed469 --- /dev/null +++ b/ao-tools/ao-test-igniter/Makefile.am @@ -0,0 +1,11 @@ +bin_PROGRAMS=ao-test-igniter + +AM_CFLAGS=-I$(top_srcdir)/ao-tools/lib $(LIBUSB_CFLAGS) + +ao_test_igniter_DEPENDENCIES = $(top_builddir)/ao-tools/lib/libao-tools.a + +ao_test_igniter_LDADD=$(top_builddir)/ao-tools/lib/libao-tools.a $(LIBUSB_LIBS) + +ao_test_igniter_SOURCES=ao-test-igniter.c + +man_MANS = ao-test-igniter.1 diff --git a/ao-tools/ao-test-igniter/ao-test-igniter.1 b/ao-tools/ao-test-igniter/ao-test-igniter.1 new file mode 100644 index 00000000..155bd1bf --- /dev/null +++ b/ao-tools/ao-test-igniter/ao-test-igniter.1 @@ -0,0 +1,59 @@ +.\" +.\" Copyright © 2009 Keith Packard <keithp@keithp.com> +.\" +.\" This program is free software; you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation; either version 2 of the License, or +.\" (at your option) any later version. +.\" +.\" 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. +.\" +.\" +.TH AO-LOAD 1 "ao-test-igniter" "" +.SH NAME +ao-test-igniter \- test AltOS flight computer igniters +.SH SYNOPSIS +.B "ao-test-igniter" +[\-T \fItty-device\fP] +[\--tty \fItty-device\fP] +[\-D \fIaltos-device\fP] +[\--device \fIaltos-device\fP] +\fIigniter-name...\fP +.SH DESCRIPTION +.I ao-test-igniter +test the status and then fires the specified igniters on the target device +.SH OPTIONS +.TP +\-T tty-device | --tty tty-device +This selects which tty device the debugger uses to communicate with +the target device. The special name 'BITBANG' directs ao-dbg to use +the cp2103 connection, otherwise this should be a usb serial port +connected to a suitable cc1111 debug node. +.TP +\-D AltOS-device | --device AltOS-device +Search for a connected device. This requires an argument of one of the +following forms: +.IP +TeleMega:2 +.br +TeleMega +.br +2 +.IP +Leaving out the product name will cause the tool to select a suitable +product, leaving out the serial number will cause the tool to match +one of the available devices. +.SH USAGE +.I ao-test-igniter +opens the target device, lists the available igniter and then fires +the specified ones. And error occurrs if any of the specified igniters +is not present or not ready. +.SH AUTHOR +Keith Packard diff --git a/ao-tools/ao-test-igniter/ao-test-igniter.c b/ao-tools/ao-test-igniter/ao-test-igniter.c new file mode 100644 index 00000000..6a699fe8 --- /dev/null +++ b/ao-tools/ao-test-igniter/ao-test-igniter.c @@ -0,0 +1,223 @@ +/* + * Copyright © 2014 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <err.h> +#include <fcntl.h> +#include <gelf.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <sysexits.h> +#include <unistd.h> +#include <getopt.h> +#include <string.h> +#include <stdbool.h> +#include "ao-elf.h" +#include "ccdbg.h" +#include "cc-usb.h" +#include "cc.h" +#include "ao-verbose.h" + +static const struct option options[] = { +	{ .name = "tty", .has_arg = 1, .val = 'T' }, +	{ .name = "device", .has_arg = 1, .val = 'D' }, +	{ .name = "raw", .has_arg = 0, .val = 'r' }, +	{ .name = "verbose", .has_arg = 1, .val = 'v' }, +	{ 0, 0, 0, 0}, +}; + +static void usage(char *program) +{ +	fprintf(stderr, "usage: %s [--verbose=<verbose>] [--device=<device>] [-tty=<tty>] main|drogue\n", program); +	exit(1); +} + +void +done(struct cc_usb *cc, int code) +{ +/*	cc_usb_printf(cc, "a\n"); */ +	cc_usb_close(cc); +	exit (code); +} + +static int +ends_with(char *whole, char *suffix) +{ +	int whole_len = strlen(whole); +	int suffix_len = strlen(suffix); + +	if (suffix_len > whole_len) +		return 0; +	return strcmp(whole + whole_len - suffix_len, suffix) == 0; +} + +static int +starts_with(char *whole, char *prefix) +{ +	int whole_len = strlen(whole); +	int prefix_len = strlen(prefix); + +	if (prefix_len > whole_len) +		return 0; +	return strncmp(whole, prefix, prefix_len) == 0; +} + +struct igniter { +	struct igniter	*next; +	char		name[512]; +	char		status[512]; +}; + +static struct igniter * +igniters(struct cc_usb *usb) +{ +	struct igniter	*head = NULL, **tail = &head; +	cc_usb_printf(usb, "t\nv\n"); +	for (;;) { +		char	line[512]; +		char	name[512]; +		char	status[512]; + +		cc_usb_getline(usb, line, sizeof (line)); +		if (strstr(line, "software-version")) +			break; +		if (sscanf(line, "Igniter: %s Status: %s", &name, &status) == 2) { +			struct igniter	*i = malloc (sizeof (struct igniter)); +			strcpy(i->name, name); +			strcpy(i->status, status); +			i->next = NULL; +			*tail = i; +			tail = &i->next; +		} +	} +	return head; +} + +static void +free_igniters(struct igniter *i) { +	struct igniter *n; + +	while (i) { +		n = i->next; +		free(i); +		i = n; +	} +} + +static struct igniter * +find_igniter(struct igniter *i, char *name) +{ +	for (; i; i = i->next) +		if (strcmp(i->name, name) == 0) +			return i; +} + +static int +do_igniter(struct cc_usb *usb, char *name) +{ +	struct igniter	*all = igniters(usb); +	struct igniter	*this = find_igniter(all, name); +	if (!this) { +		struct igniter	*i; +		printf("no igniter %s found in"); +		for (i = all; i; i = i->next) +			printf(" %s", i->name); +		printf("\n"); +		free_igniters(all); +		return 0; +	} +	if (strcmp(this->status, "ready") != 0) { +		printf("igniter %s status is %s\n", this->name, this->status); +		free_igniters(all); +		return 0; +	} +	cc_usb_printf(usb, "i DoIt %s\n", this->name); +	cc_usb_sync(usb); +	free_igniters(all); +	usleep(200000); +	return 1; +} + +int +main (int argc, char **argv) +{ +	char			*device = NULL; +	char			*filename; +	Elf			*e; +	unsigned int		s; +	int			i; +	int			c; +	int			tries; +	struct cc_usb		*cc = NULL; +	char			*tty = NULL; +	int			success; +	int			verbose = 0; +	int			ret = 0; + +	while ((c = getopt_long(argc, argv, "rT:D:c:s:v:", options, NULL)) != -1) { +		switch (c) { +		case 'T': +			tty = optarg; +			break; +		case 'D': +			device = optarg; +			break; +		case 'v': +			verbose++; +			break; +		default: +			usage(argv[0]); +			break; +		} +	} + +	ao_verbose = verbose; + +	if (verbose > 1) +		ccdbg_add_debug(CC_DEBUG_BITBANG); + +	printf ("device %s\n", device); +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "TeleMega-v1.0"); +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "TeleMetrum-v2.0"); +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "TeleMini-v2.0"); +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "EasyMega-v1.0"); +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "EasyMetrum-v1.0"); +	if (!tty) +		tty = cc_usbdevs_find_by_arg(device, "EasyMini-v1.0"); +	if (!tty) +		tty = getenv("ALTOS_TTY"); +	if (!tty) +		tty="/dev/ttyACM0"; + +	cc = cc_usb_open(tty); + +	if (!cc) +		exit(1); + +	for (i = optind; i < argc; i++) { +		char	*name = argv[i]; + +		if (!do_igniter(cc, name)) +			ret++; +	} +	done(cc, ret); +} diff --git a/ao-tools/lib/cc-convert.c b/ao-tools/lib/cc-convert.c index 8d6876a0..b82dd778 100644 --- a/ao-tools/lib/cc-convert.c +++ b/ao-tools/lib/cc-convert.c @@ -108,6 +108,29 @@ cc_altitude_to_pressure(double altitude)     return pressure;  } +double +cc_altitude_to_temperature(double altitude) +{ + +   double base_temperature = LAYER0_BASE_TEMPERATURE; +   double temperature; + +   int layer_number; /* identifies layer in the atmosphere */ +   double delta_z; /* difference between two altitudes */ + +   /* calculate the base temperature for the atmospheric layer +      associated with the inputted altitude */ +   for(layer_number = 0; layer_number < NUMBER_OF_LAYERS - 1 && altitude > base_altitude[layer_number + 1]; layer_number++) { +      delta_z = base_altitude[layer_number + 1] - base_altitude[layer_number]; +      base_temperature += delta_z * lapse_rate[layer_number]; +   } + +   /* calculate the pressure at the inputted altitude */ +   delta_z = altitude - base_altitude[layer_number]; +   temperature = base_temperature + lapse_rate[layer_number] * delta_z; + +   return temperature - 273.15; +}  /* outputs the altitude associated with the given pressure. the altitude     returned is measured with respect to the mean sea level */ diff --git a/ao-tools/lib/cc-telemetry.c b/ao-tools/lib/cc-telemetry.c index 88da7f03..45c10dcb 100644 --- a/ao-tools/lib/cc-telemetry.c +++ b/ao-tools/lib/cc-telemetry.c @@ -89,4 +89,3 @@ cc_telemetry_unparse(const union ao_telemetry_all *telemetry, char output_line[C  		p += 2;  	}  } -		 diff --git a/ao-tools/lib/cc.h b/ao-tools/lib/cc.h index c07f8cd0..bff4b2c9 100644 --- a/ao-tools/lib/cc.h +++ b/ao-tools/lib/cc.h @@ -346,6 +346,143 @@ struct ao_log_mega {  	} u;  }; +struct ao_log_metrum { +	char			type;			/* 0 */ +	uint8_t			csum;			/* 1 */ +	uint16_t		tick;			/* 2 */ +	union {						/* 4 */ +		/* AO_LOG_FLIGHT */ +		struct { +			uint16_t	flight;		/* 4 */ +			int16_t		ground_accel;	/* 6 */ +			uint32_t	ground_pres;	/* 8 */ +			uint32_t	ground_temp;	/* 12 */ +		} flight;	/* 16 */ +		/* AO_LOG_STATE */ +		struct { +			uint16_t	state;		/* 4 */ +			uint16_t	reason;		/* 6 */ +		} state;	/* 8 */ +		/* AO_LOG_SENSOR */ +		struct { +			uint32_t	pres;		/* 4 */ +			uint32_t	temp;		/* 8 */ +			int16_t		accel;		/* 12 */ +		} sensor;	/* 14 */ +		/* AO_LOG_TEMP_VOLT */ +		struct { +			int16_t		v_batt;		/* 4 */ +			int16_t		sense_a;	/* 6 */ +			int16_t		sense_m;	/* 8 */ +		} volt;		/* 10 */ +		/* AO_LOG_GPS_POS */ +		struct { +			int32_t		latitude;	/* 4 */ +			int32_t		longitude;	/* 8 */ +			uint16_t	altitude_low;	/* 12 */ +			int16_t		altitude_high;	/* 14 */ +		} gps;		/* 16 */ +		/* AO_LOG_GPS_TIME */ +		struct { +			uint8_t		hour;		/* 4 */ +			uint8_t		minute;		/* 5 */ +			uint8_t		second;		/* 6 */ +			uint8_t		flags;		/* 7 */ +			uint8_t		year;		/* 8 */ +			uint8_t		month;		/* 9 */ +			uint8_t		day;		/* 10 */ +			uint8_t		pdop;		/* 11 */ +		} gps_time;	/* 12 */ +		/* AO_LOG_GPS_SAT (up to three packets) */ +		struct { +			uint8_t	channels;		/* 4 */ +			uint8_t	more;			/* 5 */ +			struct { +				uint8_t	svid; +				uint8_t c_n; +			} sats[4];			/* 6 */ +		} gps_sat;				/* 14 */ +		uint8_t		raw[12];		/* 4 */ +	} u;	/* 16 */ +}; + +struct ao_log_mini { +	char		type;				/* 0 */ +	uint8_t		csum;				/* 1 */ +	uint16_t	tick;				/* 2 */ +	union {						/* 4 */ +		/* AO_LOG_FLIGHT */ +		struct { +			uint16_t	flight;		/* 4 */ +			uint16_t	r6; +			uint32_t	ground_pres;	/* 8 */ +		} flight; +		/* AO_LOG_STATE */ +		struct { +			uint16_t	state;		/* 4 */ +			uint16_t	reason;		/* 6 */ +		} state; +		/* AO_LOG_SENSOR */ +		struct { +			uint8_t		pres[3];	/* 4 */ +			uint8_t		temp[3];	/* 7 */ +			int16_t		sense_a;	/* 10 */ +			int16_t		sense_m;	/* 12 */ +			int16_t		v_batt;		/* 14 */ +		} sensor;				/* 16 */ +	} u;						/* 16 */ +};							/* 16 */ + +#define ao_log_pack24(dst,value) do {		\ +		(dst)[0] = (value);		\ +		(dst)[1] = (value) >> 8;	\ +		(dst)[2] = (value) >> 16;	\ +	} while (0) + +struct ao_log_gps { +	char			type;			/* 0 */ +	uint8_t			csum;			/* 1 */ +	uint16_t		tick;			/* 2 */ +	union {						/* 4 */ +		/* AO_LOG_FLIGHT */ +		struct { +			uint16_t	flight;			/* 4 */ +			int16_t		start_altitude;		/* 6 */ +			int32_t		start_latitude;		/* 8 */ +			int32_t		start_longitude;	/* 12 */ +		} flight;					/* 16 */ +		/* AO_LOG_GPS_TIME */ +		struct { +			int32_t		latitude;	/* 4 */ +			int32_t		longitude;	/* 8 */ +			uint16_t	altitude_low;	/* 12 */ +			uint8_t		hour;		/* 14 */ +			uint8_t		minute;		/* 15 */ +			uint8_t		second;		/* 16 */ +			uint8_t		flags;		/* 17 */ +			uint8_t		year;		/* 18 */ +			uint8_t		month;		/* 19 */ +			uint8_t		day;		/* 20 */ +			uint8_t		course;		/* 21 */ +			uint16_t	ground_speed;	/* 22 */ +			int16_t		climb_rate;	/* 24 */ +			uint8_t		pdop;		/* 26 */ +			uint8_t		hdop;		/* 27 */ +			uint8_t		vdop;		/* 28 */ +			uint8_t		mode;		/* 29 */ +			int16_t		altitude_high;	/* 30 */ +		} gps;	/* 31 */ +		/* AO_LOG_GPS_SAT */ +		struct { +			uint16_t	channels;	/* 4 */ +			struct { +				uint8_t	svid; +				uint8_t c_n; +			} sats[12];			/* 6 */ +		} gps_sat;				/* 30 */ +	} u; +}; +  #define AO_CONFIG_CONFIG		1  #define AO_CONFIG_MAIN			2  #define AO_CONFIG_APOGEE		3 @@ -380,9 +517,30 @@ struct ao_log_mega {  #define AO_LOG_GPS_ALT		'H'  #define AO_LOG_GPS_SAT		'V'  #define AO_LOG_GPS_DATE		'Y' +#define AO_LOG_GPS_POS		'P'  #define AO_LOG_CONFIG		'c' +#define AO_GPS_NUM_SAT_MASK	(0xf << 0) +#define AO_GPS_NUM_SAT_SHIFT	(0) + +#define AO_GPS_VALID		(1 << 4) +#define AO_GPS_RUNNING		(1 << 5) +#define AO_GPS_DATE_VALID	(1 << 6) +#define AO_GPS_COURSE_VALID	(1 << 7) + +#define AO_LOG_FORMAT_UNKNOWN		0	/* unknown; altosui will have to guess */ +#define AO_LOG_FORMAT_FULL		1	/* 8 byte typed log records */ +#define AO_LOG_FORMAT_TINY		2	/* two byte state/baro records */ +#define AO_LOG_FORMAT_TELEMETRY		3	/* 32 byte ao_telemetry records */ +#define AO_LOG_FORMAT_TELESCIENCE	4	/* 32 byte typed telescience records */ +#define AO_LOG_FORMAT_TELEMEGA		5	/* 32 byte typed telemega records */ +#define AO_LOG_FORMAT_EASYMINI		6	/* 16-byte MS5607 baro only, 3.0V supply */ +#define AO_LOG_FORMAT_TELEMETRUM	7	/* 16-byte typed telemetrum records */ +#define AO_LOG_FORMAT_TELEMINI		8	/* 16-byte MS5607 baro only, 3.3V supply */ +#define AO_LOG_FORMAT_TELEGPS		9	/* 32 byte telegps records */ +#define AO_LOG_FORMAT_NONE		127	/* No log at all */ +  int  cc_mega_parse(const char *input_line, struct ao_log_mega *l); @@ -399,6 +557,9 @@ double  cc_altitude_to_pressure(double altitude);  double +cc_altitude_to_temperature(double altitude); + +double  cc_barometer_to_pressure(double baro);  double | 
