summaryrefslogtreecommitdiff
path: root/src/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/ao.h12
-rw-r--r--src/kernel/ao_config.c9
-rw-r--r--src/kernel/ao_gps_print.c6
-rw-r--r--src/kernel/ao_log.h17
-rw-r--r--src/kernel/ao_monitor.c11
-rw-r--r--src/kernel/ao_serial.h12
-rw-r--r--src/kernel/ao_stdio.c2
-rw-r--r--src/kernel/ao_telemetry.c173
-rw-r--r--src/kernel/ao_telemetry.h10
-rw-r--r--src/kernel/ao_tracker.c10
10 files changed, 151 insertions, 111 deletions
diff --git a/src/kernel/ao.h b/src/kernel/ao.h
index ad5bbf8e..59a469ae 100644
--- a/src/kernel/ao.h
+++ b/src/kernel/ao.h
@@ -43,10 +43,6 @@
#define HAS_TASK 1
#endif
-#ifndef AO_PORT_TYPE
-#define AO_PORT_TYPE uint8_t
-#endif
-
typedef AO_PORT_TYPE ao_port_t;
#if HAS_TASK
@@ -76,6 +72,7 @@ typedef AO_PORT_TYPE ao_port_t;
#define AO_PANIC_BUFIO 15 /* Mis-using bufio API */
#define AO_PANIC_EXTI 16 /* Mis-using exti API */
#define AO_PANIC_FAST_TIMER 17 /* Mis-using fast timer API */
+#define AO_PANIC_ADC 18 /* Mis-using ADC interface */
#define AO_PANIC_SELF_TEST_CC1120 0x40 | 1 /* Self test failure */
#define AO_PANIC_SELF_TEST_HMC5883 0x40 | 2 /* Self test failure */
#define AO_PANIC_SELF_TEST_MPU6000 0x40 | 3 /* Self test failure */
@@ -518,15 +515,9 @@ struct ao_telemetry_raw_recv {
/* Set delay between telemetry reports (0 to disable) */
-#ifdef AO_SEND_ALL_BARO
-#define AO_TELEMETRY_INTERVAL_PAD AO_MS_TO_TICKS(100)
-#define AO_TELEMETRY_INTERVAL_FLIGHT AO_MS_TO_TICKS(100)
-#define AO_TELEMETRY_INTERVAL_RECOVER AO_MS_TO_TICKS(100)
-#else
#define AO_TELEMETRY_INTERVAL_PAD AO_MS_TO_TICKS(1000)
#define AO_TELEMETRY_INTERVAL_FLIGHT AO_MS_TO_TICKS(100)
#define AO_TELEMETRY_INTERVAL_RECOVER AO_MS_TO_TICKS(1000)
-#endif
void
ao_telemetry_reset_interval(void);
@@ -662,6 +653,7 @@ union ao_monitor {
extern __xdata union ao_monitor ao_monitor_ring[AO_MONITOR_RING];
#define ao_monitor_ring_next(n) (((n) + 1) & (AO_MONITOR_RING - 1))
+#define ao_monitor_ring_prev(n) (((n) - 1) & (AO_MONITOR_RING - 1))
extern __data uint8_t ao_monitoring;
extern __data uint8_t ao_monitor_head;
diff --git a/src/kernel/ao_config.c b/src/kernel/ao_config.c
index 6b8a1813..8dab7c42 100644
--- a/src/kernel/ao_config.c
+++ b/src/kernel/ao_config.c
@@ -557,10 +557,10 @@ ao_config_radio_rate_set(void) __reentrant
}
_ao_config_edit_start();
ao_config.radio_rate = ao_cmd_lex_i;
+ _ao_config_edit_finish();
#if HAS_TELEMETRY
ao_telemetry_reset_interval();
#endif
- _ao_config_edit_finish();
#if HAS_RADIO_RECV
ao_radio_recv_abort();
#endif
@@ -684,6 +684,9 @@ ao_config_radio_enable_set(void) __reentrant
_ao_config_edit_start();
ao_config.radio_enable = ao_cmd_lex_i;
_ao_config_edit_finish();
+#if HAS_TELEMETRY && HAS_RADIO_RATE
+ ao_telemetry_reset_interval();
+#endif
}
#endif /* HAS_RADIO */
@@ -735,6 +738,7 @@ ao_config_aprs_set(void)
_ao_config_edit_start();
ao_config.aprs_interval = ao_cmd_lex_i;
_ao_config_edit_finish();
+ ao_telemetry_reset_interval();
}
#endif /* HAS_APRS */
@@ -825,6 +829,9 @@ ao_config_tracker_set(void)
ao_config.tracker_motion = m;
ao_config.tracker_interval = i;
_ao_config_edit_finish();
+#if HAS_TELEMETRY
+ ao_telemetry_reset_interval();
+#endif
}
#endif /* HAS_TRACKER */
diff --git a/src/kernel/ao_gps_print.c b/src/kernel/ao_gps_print.c
index d26021da..6d9ee346 100644
--- a/src/kernel/ao_gps_print.c
+++ b/src/kernel/ao_gps_print.c
@@ -20,8 +20,8 @@
#endif
#include "ao_telem.h"
-#ifndef AO_TELEMETRY_LOCATION_ALTITUDE
-#define AO_TELEMETRY_LOCATION_ALTITUDE(l) ((l)->altitude)
+#ifndef AO_GPS_ORIG_ALTITUDE
+#define AO_GPS_ORIG_ALTITUDE(l) ((l)->altitude)
#endif
void
@@ -46,7 +46,7 @@ ao_gps_print(__xdata struct ao_gps_orig *gps_data) __reentrant
AO_TELEM_GPS_ALTITUDE " %d ",
(long) gps_data->latitude,
(long) gps_data->longitude,
- AO_TELEMETRY_LOCATION_ALTITUDE(gps_data));
+ AO_GPS_ORIG_ALTITUDE(gps_data));
if (gps_data->flags & AO_GPS_DATE_VALID)
printf(AO_TELEM_GPS_YEAR " %d "
diff --git a/src/kernel/ao_log.h b/src/kernel/ao_log.h
index c13a2580..f86fb359 100644
--- a/src/kernel/ao_log.h
+++ b/src/kernel/ao_log.h
@@ -43,11 +43,12 @@ extern __pdata enum ao_flight_state ao_log_state;
#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_TELEMEGA_OLD 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_TELEMEGA 10 /* 32 byte typed telemega records with 32 bit gyro cal */
#define AO_LOG_FORMAT_NONE 127 /* No log at all */
extern __code uint8_t ao_log_format;
@@ -215,10 +216,22 @@ struct ao_log_mega {
int16_t ground_accel_along; /* 12 */
int16_t ground_accel_across; /* 14 */
int16_t ground_accel_through; /* 16 */
+ int16_t pad_18; /* 18 */
+ int32_t ground_roll; /* 20 */
+ int32_t ground_pitch; /* 24 */
+ int32_t ground_yaw; /* 28 */
+ } flight; /* 32 */
+ struct {
+ uint16_t flight; /* 4 */
+ int16_t ground_accel; /* 6 */
+ uint32_t ground_pres; /* 8 */
+ int16_t ground_accel_along; /* 12 */
+ int16_t ground_accel_across; /* 14 */
+ int16_t ground_accel_through; /* 16 */
int16_t ground_roll; /* 18 */
int16_t ground_pitch; /* 20 */
int16_t ground_yaw; /* 22 */
- } flight; /* 24 */
+ } flight_old; /* 24 */
/* AO_LOG_STATE */
struct {
uint16_t state;
diff --git a/src/kernel/ao_monitor.c b/src/kernel/ao_monitor.c
index 2d75c41c..cba0d80a 100644
--- a/src/kernel/ao_monitor.c
+++ b/src/kernel/ao_monitor.c
@@ -94,9 +94,18 @@ __xdata struct ao_task ao_monitor_blink_task;
void
ao_monitor_blink(void)
{
+#ifdef AO_MONITOR_BAD
+ uint8_t *recv;
+#endif
for (;;) {
ao_sleep(DATA_TO_XDATA(&ao_monitor_head));
- ao_led_for(AO_MONITOR_LED, AO_MS_TO_TICKS(100));
+#ifdef AO_MONITOR_BAD
+ recv = (uint8_t *) &ao_monitor_ring[ao_monitor_ring_prev(ao_monitor_head)];
+ if (ao_monitoring && !(recv[ao_monitoring + 1] & AO_RADIO_STATUS_CRC_OK))
+ ao_led_for(AO_MONITOR_BAD, AO_MS_TO_TICKS(100));
+ else
+#endif
+ ao_led_for(AO_MONITOR_LED, AO_MS_TO_TICKS(100));
}
}
#endif
diff --git a/src/kernel/ao_serial.h b/src/kernel/ao_serial.h
index baf213c0..dbc9f8e4 100644
--- a/src/kernel/ao_serial.h
+++ b/src/kernel/ao_serial.h
@@ -34,6 +34,9 @@ ao_serial0_getchar(void);
int
_ao_serial0_pollchar(void);
+uint8_t
+_ao_serial0_sleep(void);
+
void
ao_serial0_putchar(char c);
@@ -54,6 +57,9 @@ ao_serial1_getchar(void);
int
_ao_serial1_pollchar(void);
+uint8_t
+_ao_serial1_sleep(void);
+
void
ao_serial1_putchar(char c);
@@ -74,6 +80,9 @@ ao_serial2_getchar(void);
int
_ao_serial2_pollchar(void);
+uint8_t
+_ao_serial2_sleep(void);
+
void
ao_serial2_putchar(char c);
@@ -94,6 +103,9 @@ ao_serial3_getchar(void);
int
_ao_serial3_pollchar(void);
+uint8_t
+_ao_serial3_sleep(void);
+
void
ao_serial3_putchar(char c);
diff --git a/src/kernel/ao_stdio.c b/src/kernel/ao_stdio.c
index 99118137..1d65fcf5 100644
--- a/src/kernel/ao_stdio.c
+++ b/src/kernel/ao_stdio.c
@@ -142,10 +142,8 @@ ao_add_stdio(int (*_pollchar)(void),
void (*putchar)(char),
void (*flush)(void)) __reentrant
{
-#if AO_NUM_STDIOS > 1
if (ao_num_stdios == AO_NUM_STDIOS)
ao_panic(AO_PANIC_STDIO);
-#endif
ao_stdios[ao_num_stdios]._pollchar = _pollchar;
ao_stdios[ao_num_stdios].putchar = putchar;
ao_stdios[ao_num_stdios].flush = flush;
diff --git a/src/kernel/ao_telemetry.c b/src/kernel/ao_telemetry.c
index 27306a34..e2197f7a 100644
--- a/src/kernel/ao_telemetry.c
+++ b/src/kernel/ao_telemetry.c
@@ -19,19 +19,32 @@
#include "ao_log.h"
#include "ao_product.h"
-#ifndef HAS_RDF
-#define HAS_RDF 1
-#endif
-
static __pdata uint16_t ao_telemetry_interval;
#if HAS_RADIO_RATE
static __xdata uint16_t ao_telemetry_desired_interval;
#endif
+/* TeleMetrum v1.0 just doesn't have enough space to
+ * manage the more complicated telemetry scheduling, so
+ * it loses the ability to disable telem/rdf separately
+ */
+
+#if defined(TELEMETRUM_V_1_0)
+#define SIMPLIFY
+#endif
+
+#ifdef SIMPLIFY
+#define ao_telemetry_time time
+#define RDF_SPACE __pdata
+#else
+#define RDF_SPACE __xdata
+static __pdata uint16_t ao_telemetry_time;
+#endif
+
#if HAS_RDF
-static __pdata uint8_t ao_rdf = 0;
-static __pdata uint16_t ao_rdf_time;
+static RDF_SPACE uint8_t ao_rdf = 0;
+static RDF_SPACE uint16_t ao_rdf_time;
#endif
#if HAS_APRS
@@ -120,7 +133,9 @@ ao_send_mega_sensor(void)
telemetry.generic.tick = packet->tick;
telemetry.generic.type = AO_TELEMETRY_MEGA_SENSOR;
+#if HAS_MPU6000
telemetry.mega_sensor.orient = ao_sample_orient;
+#endif
telemetry.mega_sensor.accel = ao_data_accel(packet);
telemetry.mega_sensor.pres = ao_data_pres(packet);
telemetry.mega_sensor.temp = ao_data_temp(packet);
@@ -269,30 +284,6 @@ ao_send_mini(void)
#endif /* AO_SEND_MINI */
-#ifdef AO_SEND_ALL_BARO
-static uint8_t ao_baro_sample;
-
-static void
-ao_send_baro(void)
-{
- uint8_t sample = ao_sample_data;
- uint8_t samples = (sample - ao_baro_sample) & (AO_DATA_RING - 1);
-
- if (samples > 12) {
- ao_baro_sample = (ao_baro_sample + (samples - 12)) & (AO_DATA_RING - 1);
- samples = 12;
- }
- telemetry.generic.tick = ao_data_ring[sample].tick;
- telemetry.generic.type = AO_TELEMETRY_BARO;
- telemetry.baro.samples = samples;
- for (sample = 0; sample < samples; sample++) {
- telemetry.baro.baro[sample] = ao_data_ring[ao_baro_sample].adc.pres;
- ao_baro_sample = ao_data_ring_next(ao_baro_sample);
- }
- ao_radio_send(&telemetry, sizeof (telemetry));
-}
-#endif
-
static __pdata int8_t ao_telemetry_config_max;
static __pdata int8_t ao_telemetry_config_cur;
@@ -332,6 +323,7 @@ ao_send_configuration(void)
#if HAS_GPS
+static __pdata int8_t ao_telemetry_gps_max;
static __pdata int8_t ao_telemetry_loc_cur;
static __pdata int8_t ao_telemetry_sat_cur;
@@ -348,7 +340,7 @@ ao_send_location(void)
telemetry.location.tick = ao_gps_tick;
ao_mutex_put(&ao_gps_mutex);
ao_radio_send(&telemetry, sizeof (telemetry));
- ao_telemetry_loc_cur = ao_telemetry_config_max;
+ ao_telemetry_loc_cur = ao_telemetry_gps_max;
}
}
@@ -365,7 +357,7 @@ ao_send_satellite(void)
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_config_max;
+ ao_telemetry_sat_cur = ao_telemetry_gps_max;
}
}
#endif
@@ -411,6 +403,7 @@ ao_telemetry(void)
while (ao_telemetry_interval == 0)
ao_sleep(&telemetry);
time = ao_time();
+ ao_telemetry_time = time;
#if HAS_RDF
ao_rdf_time = time;
#endif
@@ -418,79 +411,85 @@ ao_telemetry(void)
ao_aprs_time = time;
#endif
while (ao_telemetry_interval) {
-#if HAS_APRS
+ time = ao_time() + AO_SEC_TO_TICKS(100);
+#ifndef SIMPLIFY
if (!(ao_config.radio_enable & AO_RADIO_DISABLE_TELEMETRY))
#endif
{
-#ifdef AO_SEND_ALL_BARO
- ao_send_baro();
+#ifndef SIMPLIFY
+ if ( (int16_t) (ao_time() - ao_telemetry_time) >= 0)
#endif
-
-#if HAS_FLIGHT
+ {
+ ao_telemetry_time = ao_time() + ao_telemetry_interval;
# ifdef AO_SEND_MEGA
- ao_send_mega_sensor();
- ao_send_mega_data();
+ ao_send_mega_sensor();
+ ao_send_mega_data();
# endif
# ifdef AO_SEND_METRUM
- ao_send_metrum_sensor();
- ao_send_metrum_data();
+ ao_send_metrum_sensor();
+ ao_send_metrum_data();
# endif
# ifdef AO_SEND_MINI
- ao_send_mini();
+ ao_send_mini();
# endif
# ifdef AO_TELEMETRY_SENSOR
- ao_send_sensor();
+ ao_send_sensor();
# endif
-#endif /* HAS_FLIGHT */
-
#if HAS_COMPANION
- if (ao_companion_running)
- ao_send_companion();
+ if (ao_companion_running)
+ ao_send_companion();
#endif
- ao_send_configuration();
#if HAS_GPS
- ao_send_location();
- ao_send_satellite();
+ ao_send_location();
+ ao_send_satellite();
+#endif
+ ao_send_configuration();
+ }
+#ifndef SIMPLIFY
+ time = ao_telemetry_time;
#endif
}
-#ifndef AO_SEND_ALL_BARO
#if HAS_RDF
- if (ao_rdf &&
-#if HAS_APRS
- !(ao_config.radio_enable & AO_RADIO_DISABLE_RDF) &&
-#endif /* HAS_APRS */
- (int16_t) (ao_time() - ao_rdf_time) >= 0)
+ if (ao_rdf
+#ifndef SIMPLIFY
+ && !(ao_config.radio_enable & AO_RADIO_DISABLE_RDF)
+#endif
+ )
{
+ if ((int16_t) (ao_time() - ao_rdf_time) >= 0) {
#if HAS_IGNITE_REPORT
- uint8_t c;
-#endif /* HAS_IGNITE_REPORT */
- ao_rdf_time = ao_time() + AO_RDF_INTERVAL_TICKS;
+ uint8_t c;
+#endif
+ ao_rdf_time = ao_time() + AO_RDF_INTERVAL_TICKS;
#if HAS_IGNITE_REPORT
- if (ao_flight_state == ao_flight_pad && (c = ao_report_igniter()))
- ao_radio_continuity(c);
- else
-#endif /* HAS_IGNITE_REPORT*/
- ao_radio_rdf();
+ if (ao_flight_state == ao_flight_pad && (c = ao_report_igniter()))
+ ao_radio_continuity(c);
+ else
+#endif
+ ao_radio_rdf();
+ }
+#ifndef SIMPLIFY
+ if ((int16_t) (time - ao_rdf_time) > 0)
+ time = ao_rdf_time;
+#endif
}
#endif /* HAS_RDF */
#if HAS_APRS
- if (ao_config.aprs_interval != 0 &&
- (int16_t) (ao_time() - ao_aprs_time) >= 0)
- {
- ao_aprs_time = ao_time() + AO_SEC_TO_TICKS(ao_config.aprs_interval);
- ao_aprs_send();
+ if (ao_config.aprs_interval != 0) {
+ if ((int16_t) (ao_time() - ao_aprs_time) >= 0) {
+ ao_aprs_time = ao_time() + AO_SEC_TO_TICKS(ao_config.aprs_interval);
+ ao_aprs_send();
+ }
+ if ((int16_t) (time - ao_aprs_time) > 0)
+ time = ao_aprs_time;
}
#endif /* HAS_APRS */
-#endif /* !AO_SEND_ALL_BARO */
- time += ao_telemetry_interval;
delay = time - ao_time();
if (delay > 0) {
ao_alarm(delay);
ao_sleep(&telemetry);
ao_clear_alarm();
}
- else
- time = ao_time();
}
}
}
@@ -547,21 +546,31 @@ ao_telemetry_set_interval(uint16_t interval)
ao_telemetry_companion_cur = cur;
#endif
- ao_telemetry_config_max = AO_SEC_TO_TICKS(5) / interval;
-#if HAS_COMPANION
- if (ao_telemetry_config_max > cur)
- cur++;
- ao_telemetry_config_cur = cur;
-#endif
-
#if HAS_GPS
- if (ao_telemetry_config_max > cur)
+ ao_telemetry_gps_max = AO_SEC_TO_TICKS(1) / interval;
+ if (ao_telemetry_gps_max > cur)
cur++;
ao_telemetry_loc_cur = cur;
- if (ao_telemetry_config_max > cur)
+ if (ao_telemetry_gps_max > cur)
cur++;
ao_telemetry_sat_cur = cur;
#endif
+
+ ao_telemetry_config_max = AO_SEC_TO_TICKS(5) / interval;
+ if (ao_telemetry_config_max > cur)
+ cur++;
+ ao_telemetry_config_cur = cur;
+
+#ifndef SIMPLIFY
+ ao_telemetry_time =
+#if HAS_RDF
+ ao_rdf_time =
+#endif
+#if HAS_APRS
+ ao_aprs_time =
+#endif
+ ao_time();
+#endif
ao_wakeup(&telemetry);
}
diff --git a/src/kernel/ao_telemetry.h b/src/kernel/ao_telemetry.h
index 83d432cf..711e0d36 100644
--- a/src/kernel/ao_telemetry.h
+++ b/src/kernel/ao_telemetry.h
@@ -116,12 +116,16 @@ struct ao_telemetry_location {
/* 32 */
};
-#if HAS_GPS
-
#ifndef HAS_WIDE_GPS
#define HAS_WIDE_GPS 1
#endif
+#ifdef HAS_TELEMETRY
+#ifndef HAS_RDF
+#define HAS_RDF 1
+#endif
+#endif
+
#if HAS_WIDE_GPS
typedef int32_t gps_alt_t;
#define AO_TELEMETRY_LOCATION_ALTITUDE(l) (((gps_alt_t) (l)->altitude_high << 16) | ((l)->altitude_low))
@@ -135,8 +139,6 @@ typedef int16_t gps_alt_t;
(l)->altitude_low = (a)))
#endif /* HAS_WIDE_GPS */
-#endif /* HAS_GPS */
-
#define AO_TELEMETRY_SATELLITE 0x06
struct ao_telemetry_satellite_info {
diff --git a/src/kernel/ao_tracker.c b/src/kernel/ao_tracker.c
index 9b007af8..962f145d 100644
--- a/src/kernel/ao_tracker.c
+++ b/src/kernel/ao_tracker.c
@@ -132,7 +132,7 @@ ao_tracker(void)
if (height < 0)
height = -height;
- if (ao_tracker_force_telem)
+ if (ao_tracker_force_telem > 1)
printf("head %d ring %d ground_distance %d height %d\n", gps_head, ring, ground_distance, height);
if (ground_distance > ao_config.tracker_motion ||
height > (ao_config.tracker_motion << 1))
@@ -141,7 +141,7 @@ ao_tracker(void)
break;
}
}
- if (ao_tracker_force_telem) {
+ if (ao_tracker_force_telem > 1) {
printf ("moving %d started %d\n", moving, log_started);
flush();
}
@@ -191,11 +191,9 @@ static struct ao_task ao_tracker_task;
static void
ao_tracker_set_telem(void)
{
- uint8_t telem;
ao_cmd_hex();
- telem = ao_cmd_lex_i;
if (ao_cmd_status == ao_cmd_success)
- ao_tracker_force_telem = telem;
+ ao_tracker_force_telem = ao_cmd_lex_i;
ao_cmd_status = ao_cmd_success;
printf ("flight: %d\n", ao_flight_number);
printf ("force_telem: %d\n", ao_tracker_force_telem);
@@ -211,7 +209,7 @@ ao_tracker_set_telem(void)
}
static const struct ao_cmds ao_tracker_cmds[] = {
- { ao_tracker_set_telem, "t <d>\0Set telem on USB" },
+ { ao_tracker_set_telem, "t <d>\0Set telem on USB (0 off, 1 on, 2 dbg)" },
{ 0, NULL },
};