summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/ao.h73
-rw-r--r--src/core/ao_config.c3
-rw-r--r--src/core/ao_convert_pa.c18
-rw-r--r--src/core/ao_convert_pa_test.c10
-rw-r--r--src/core/ao_data.h22
-rw-r--r--src/core/ao_log.h17
-rw-r--r--src/core/ao_panic.c16
-rw-r--r--src/core/ao_task.h80
8 files changed, 152 insertions, 87 deletions
diff --git a/src/core/ao.h b/src/core/ao.h
index 31ec4686..e559e876 100644
--- a/src/core/ao.h
+++ b/src/core/ao.h
@@ -39,64 +39,13 @@
#define CODE_TO_XDATA(a) (a)
#endif
-/* An AltOS task */
-struct ao_task {
- __xdata void *wchan; /* current wait channel (NULL if running) */
- uint16_t alarm; /* abort ao_sleep time */
- ao_arch_task_members /* any architecture-specific fields */
- uint8_t task_id; /* unique id */
- __code char *name; /* task name */
- uint8_t stack[AO_STACK_SIZE]; /* saved stack */
-};
-
-extern __xdata struct ao_task *__data ao_cur_task;
-
-#define AO_NUM_TASKS 16 /* maximum number of tasks */
-#define AO_NO_TASK 0 /* no task id */
-
-/*
- ao_task.c
- */
-
-/* Suspend the current task until wchan is awoken.
- * returns:
- * 0 on normal wake
- * 1 on alarm
- */
-uint8_t
-ao_sleep(__xdata void *wchan);
-
-/* Wake all tasks sleeping on wchan */
-void
-ao_wakeup(__xdata void *wchan);
-
-/* set an alarm to go off in 'delay' ticks */
-void
-ao_alarm(uint16_t delay);
-
-/* Clear any pending alarm */
-void
-ao_clear_alarm(void);
-
-/* Yield the processor to another task */
-void
-ao_yield(void) ao_arch_naked_declare;
-
-/* Add a task to the run queue */
-void
-ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant;
-
-/* Terminate the current task */
-void
-ao_exit(void);
-
-/* Dump task info to console */
-void
-ao_task_info(void);
+#ifndef HAS_TASK
+#define HAS_TASK 1
+#endif
-/* Start the scheduler. This will not return */
-void
-ao_start_scheduler(void);
+#if HAS_TASK
+#include <ao_task.h>
+#endif
/*
* ao_panic.c
@@ -136,7 +85,9 @@ ao_panic(uint8_t reason);
extern volatile __data AO_TICK_TYPE ao_tick_count;
/* Our timer runs at 100Hz */
+#ifndef AO_HERTZ
#define AO_HERTZ 100
+#endif
#define AO_MS_TO_TICKS(ms) ((ms) / (1000 / AO_HERTZ))
#define AO_SEC_TO_TICKS(s) ((s) * AO_HERTZ)
@@ -168,11 +119,13 @@ ao_clock_init(void);
* ao_mutex.c
*/
+#ifndef ao_mutex_get
void
ao_mutex_get(__xdata uint8_t *ao_mutex) __reentrant;
void
ao_mutex_put(__xdata uint8_t *ao_mutex) __reentrant;
+#endif
/*
* ao_cmd.c
@@ -319,11 +272,13 @@ ao_temp_to_dC(int16_t temp) __reentrant;
* Convert between pressure in Pa and altitude in meters
*/
-int32_t
+#include <ao_data.h>
+
+alt_t
ao_pa_to_altitude(int32_t pa);
int32_t
-ao_altitude_to_pa(int32_t alt);
+ao_altitude_to_pa(alt_t alt);
#if HAS_DBG
#include <ao_dbg.h>
diff --git a/src/core/ao_config.c b/src/core/ao_config.c
index ce855ad1..e8ff95b7 100644
--- a/src/core/ao_config.c
+++ b/src/core/ao_config.c
@@ -102,6 +102,7 @@ _ao_config_get(void)
ao_xmemset(&ao_config.callsign, '\0', sizeof (ao_config.callsign));
ao_xmemcpy(&ao_config.callsign, CODE_TO_XDATA(AO_CONFIG_DEFAULT_CALLSIGN),
sizeof(AO_CONFIG_DEFAULT_CALLSIGN) - 1);
+ ao_config._legacy_radio_channel = 0;
}
minor = ao_config.minor;
if (minor != AO_CONFIG_MINOR) {
@@ -131,7 +132,7 @@ _ao_config_get(void)
if (minor < 9)
ao_xmemset(&ao_config.aes_key, '\0', AO_AES_LEN);
if (minor < 10)
- ao_config.frequency = 434550;
+ ao_config.frequency = 434550 + ao_config._legacy_radio_channel * 100;
if (minor < 11)
ao_config.apogee_lockout = 0;
#if AO_PYRO_NUM
diff --git a/src/core/ao_convert_pa.c b/src/core/ao_convert_pa.c
index 0c93caea..55fe6e7d 100644
--- a/src/core/ao_convert_pa.c
+++ b/src/core/ao_convert_pa.c
@@ -19,14 +19,22 @@
#include "ao.h"
#endif
-static const int32_t altitude_table[] = {
+#ifndef AO_CONST_ATTRIB
+#define AO_CONST_ATTRIB
+#endif
+
+static const alt_t altitude_table[] AO_CONST_ATTRIB = {
#include "altitude-pa.h"
};
+#ifndef FETCH_ALT
+#define FETCH_ALT(o) altitude_table[o]
+#endif
+
#define ALT_SCALE (1 << ALT_SHIFT)
#define ALT_MASK (ALT_SCALE - 1)
-int32_t
+alt_t
ao_pa_to_altitude(int32_t pa)
{
int16_t o;
@@ -40,11 +48,12 @@ ao_pa_to_altitude(int32_t pa)
o = pa >> ALT_SHIFT;
part = pa & ALT_MASK;
- low = (int32_t) altitude_table[o] * (ALT_SCALE - part);
- high = (int32_t) altitude_table[o+1] * part + (ALT_SCALE >> 1);
+ low = (alt_t) FETCH_ALT(o) * (ALT_SCALE - part);
+ high = (alt_t) FETCH_ALT(o+1) * part + (ALT_SCALE >> 1);
return (low + high) >> ALT_SHIFT;
}
+#ifdef AO_CONVERT_TEST
int32_t
ao_altitude_to_pa(int32_t alt)
{
@@ -70,3 +79,4 @@ ao_altitude_to_pa(int32_t alt)
pa = 0;
return pa;
}
+#endif
diff --git a/src/core/ao_convert_pa_test.c b/src/core/ao_convert_pa_test.c
index 972a4d4c..7d5b1922 100644
--- a/src/core/ao_convert_pa_test.c
+++ b/src/core/ao_convert_pa_test.c
@@ -17,15 +17,17 @@
#include <stdint.h>
#define AO_CONVERT_TEST
+typedef int32_t alt_t;
#include "ao_host.h"
#include "ao_convert_pa.c"
#define STEP_P 1
#define STEP_A 1
-static inline i_abs(int i) { return i < 0 ? -i : i; }
+static inline int i_abs(int i) { return i < 0 ? -i : i; }
-main ()
+int
+main (int argc, char **argv)
{
int i;
int32_t p_to_a, p_to_a_to_p;
@@ -49,9 +51,7 @@ main ()
// printf ("pa %d alt %d pa %d\n",
// i, p_to_a, p_to_a_to_p);
}
- for (i = -1450; i < 74250 + STEP_A; i += STEP_A) {
- if (i > 74250)
- i = 74250;
+ for (i = -1450; i < 40000 + STEP_A; i += STEP_A) {
a_to_p = ao_altitude_to_pa(i);
a_to_p_to_a = ao_pa_to_altitude(a_to_p);
a_error = i_abs(a_to_p_to_a - i);
diff --git a/src/core/ao_data.h b/src/core/ao_data.h
index 30208dfb..6fdd19cb 100644
--- a/src/core/ao_data.h
+++ b/src/core/ao_data.h
@@ -52,6 +52,8 @@
#define AO_DATA_MMA655X 0
#endif
+#ifdef AO_DATA_RING
+
#define AO_DATA_ALL (AO_DATA_ADC|AO_DATA_MS5607|AO_DATA_MPU6000|AO_DATA_HMC5883|AO_DATA_MMA655X)
struct ao_data {
@@ -65,6 +67,9 @@ struct ao_data {
#endif
#if HAS_MPU6000
struct ao_mpu6000_sample mpu6000;
+#if !HAS_MMA655X
+ int16_t z_accel;
+#endif
#endif
#if HAS_HMC5883
struct ao_hmc5883_sample hmc5883;
@@ -95,6 +100,8 @@ extern volatile __data uint8_t ao_data_count;
ao_sleep((void *) &ao_data_count); \
} while (0)
+#endif /* AO_DATA_RING */
+
#if !HAS_BARO && HAS_MS5607
/* Either an MS5607 or an MS5611 hooked to a SPI port
@@ -103,7 +110,12 @@ extern volatile __data uint8_t ao_data_count;
#define HAS_BARO 1
typedef int32_t pres_t;
-typedef int32_t alt_t;
+
+#ifndef AO_ALT_TYPE
+#define AO_ALT_TYPE int32_t
+#endif
+
+typedef AO_ALT_TYPE alt_t;
#define ao_data_pres_cook(packet) ao_ms5607_convert(&packet->ms5607_raw, &packet->ms5607_cooked)
@@ -128,6 +140,10 @@ typedef int16_t alt_t;
#endif
+#if !HAS_BARO
+typedef int16_t alt_t;
+#endif
+
/*
* Need a few macros to pull data from the sensors:
*
@@ -265,9 +281,9 @@ typedef int16_t accel_t;
typedef int16_t accel_t;
/* MPU6000 is hooked up so that positive y is positive acceleration */
-#define ao_data_accel(packet) ((packet)->mpu6000.accel_y)
+#define ao_data_accel(packet) ((packet)->z_accel)
#define ao_data_accel_cook(packet) (-(packet)->mpu6000.accel_y)
-#define ao_data_set_accel(packet, accel) ((packet)->mpu6000.accel_y = (accel))
+#define ao_data_set_accel(packet, accel) ((packet)->z_accel = (accel))
#define ao_data_accel_invert(a) (-(a))
#endif
diff --git a/src/core/ao_log.h b/src/core/ao_log.h
index 04abeb7e..eaaca444 100644
--- a/src/core/ao_log.h
+++ b/src/core/ao_log.h
@@ -138,17 +138,17 @@ ao_log_full(void);
#define AO_LOG_POS_NONE (~0UL)
struct ao_log_record {
- char type;
- uint8_t csum;
- uint16_t tick;
+ char type; /* 0 */
+ uint8_t csum; /* 1 */
+ uint16_t tick; /* 2 */
union {
struct {
- int16_t ground_accel;
- uint16_t flight;
+ int16_t ground_accel; /* 4 */
+ uint16_t flight; /* 6 */
} flight;
struct {
- int16_t accel;
- int16_t pres;
+ int16_t accel; /* 4 */
+ int16_t pres; /* 6 */
} sensor;
struct {
int16_t temp;
@@ -201,8 +201,7 @@ struct ao_log_mega {
uint16_t flight; /* 4 */
int16_t ground_accel; /* 6 */
uint32_t ground_pres; /* 8 */
- uint32_t ground_temp; /* 12 */
- } flight; /* 16 */
+ } flight; /* 12 */
struct {
uint16_t state;
uint16_t reason;
diff --git a/src/core/ao_panic.c b/src/core/ao_panic.c
index 52433044..3c0b471e 100644
--- a/src/core/ao_panic.c
+++ b/src/core/ao_panic.c
@@ -29,6 +29,10 @@
#define ao_led_off(x)
#endif
+#ifndef AO_LED_PANIC
+#define AO_LED_PANIC AO_LED_RED
+#endif
+
static void
ao_panic_delay(uint8_t n)
{
@@ -52,10 +56,10 @@ ao_panic(uint8_t reason)
__critical for (;;) {
ao_panic_delay(20);
for (n = 0; n < 5; n++) {
- ao_led_on(AO_LED_RED);
+ ao_led_on(AO_LED_PANIC);
ao_beep(AO_BEEP_HIGH);
ao_panic_delay(1);
- ao_led_off(AO_LED_RED);
+ ao_led_off(AO_LED_PANIC);
ao_beep(AO_BEEP_LOW);
ao_panic_delay(1);
}
@@ -66,18 +70,18 @@ ao_panic(uint8_t reason)
#pragma disable_warning 126
#endif
if (reason & 0x40) {
- ao_led_on(AO_LED_RED);
+ ao_led_on(AO_LED_PANIC);
ao_beep(AO_BEEP_HIGH);
ao_panic_delay(40);
- ao_led_off(AO_LED_RED);
+ ao_led_off(AO_LED_PANIC);
ao_beep(AO_BEEP_OFF);
ao_panic_delay(10);
}
for (n = 0; n < (reason & 0x3f); n++) {
- ao_led_on(AO_LED_RED);
+ ao_led_on(AO_LED_PANIC);
ao_beep(AO_BEEP_MID);
ao_panic_delay(10);
- ao_led_off(AO_LED_RED);
+ ao_led_off(AO_LED_PANIC);
ao_beep(AO_BEEP_OFF);
ao_panic_delay(10);
}
diff --git a/src/core/ao_task.h b/src/core/ao_task.h
new file mode 100644
index 00000000..18edd866
--- /dev/null
+++ b/src/core/ao_task.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_TASK_H_
+#define _AO_TASK_H_
+
+/* An AltOS task */
+struct ao_task {
+ __xdata void *wchan; /* current wait channel (NULL if running) */
+ uint16_t alarm; /* abort ao_sleep time */
+ ao_arch_task_members /* any architecture-specific fields */
+ uint8_t task_id; /* unique id */
+ __code char *name; /* task name */
+ uint8_t stack[AO_STACK_SIZE]; /* saved stack */
+};
+
+extern __xdata struct ao_task *__data ao_cur_task;
+
+#define AO_NUM_TASKS 16 /* maximum number of tasks */
+#define AO_NO_TASK 0 /* no task id */
+
+/*
+ ao_task.c
+ */
+
+/* Suspend the current task until wchan is awoken.
+ * returns:
+ * 0 on normal wake
+ * 1 on alarm
+ */
+uint8_t
+ao_sleep(__xdata void *wchan);
+
+/* Wake all tasks sleeping on wchan */
+void
+ao_wakeup(__xdata void *wchan);
+
+/* set an alarm to go off in 'delay' ticks */
+void
+ao_alarm(uint16_t delay);
+
+/* Clear any pending alarm */
+void
+ao_clear_alarm(void);
+
+/* Yield the processor to another task */
+void
+ao_yield(void) ao_arch_naked_declare;
+
+/* Add a task to the run queue */
+void
+ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant;
+
+/* Terminate the current task */
+void
+ao_exit(void);
+
+/* Dump task info to console */
+void
+ao_task_info(void);
+
+/* Start the scheduler. This will not return */
+void
+ao_start_scheduler(void);
+
+#endif