altos: Log baro readings for MicroPeak
authorKeith Packard <keithp@keithp.com>
Fri, 14 Dec 2012 19:11:39 +0000 (11:11 -0800)
committerKeith Packard <keithp@keithp.com>
Fri, 14 Dec 2012 19:11:39 +0000 (11:11 -0800)
This logs barometric data every 192ms (more or less) to the 504
remaining bytes of internal EEPROM storage in the ATtiny85. This
provides 48.192 seconds of logging.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/micropeak/Makefile
src/micropeak/ao_log_micro.c
src/micropeak/ao_log_micro.h
src/micropeak/ao_micropeak.c
src/micropeak/ao_micropeak.h [new file with mode: 0644]

index 0c48ed66477a3db5b652c05d5da1ceaa8060dcfb..82944cb1b4632e57c50b51a5a8d7dd5c2c1a699b 100644 (file)
@@ -20,13 +20,6 @@ ifndef VERSION
 include ../Version
 endif
 
-# Support for a logging EEPROM
-#
-#EEPROM_SRC=ao_async.c \
-#      ao_i2c_attiny.c \
-#      ao_at24c.c
-#
-
 ALTOS_SRC = \
        ao_micropeak.c \
        ao_spi_attiny.c \
@@ -39,7 +32,8 @@ ALTOS_SRC = \
        ao_notask.c \
        ao_eeprom_tiny.c \
        ao_panic.c \
-       $(EEPROM_SRC)
+       ao_log_micro.c \
+       ao_async.c
 
 INC=\
        ao.h \
@@ -48,6 +42,8 @@ INC=\
        ao_arch_funcs.h \
        ao_exti.h \
        ao_ms5607.h \
+       ao_log_micro.h \
+       ao_micropeak.h \
        altitude-pa.h
 
 IDPRODUCT=0
index eda0d1d277facd497e09f35078e4280f840a790d..40a7a35dbe32561a620a6ffcde0407c7433d0ae4 100644 (file)
  */
 
 #include <ao.h>
+#include <ao_micropeak.h>
 #include <ao_log_micro.h>
 #include <ao_async.h>
 
-#if HAS_EEPROM
-
-ao_pos_t       ao_log_micro_pos;
+static uint16_t ao_log_offset = STARTING_LOG_OFFSET;
 
 void
-ao_log_micro_data(uint32_t data)
+ao_log_micro_save(void)
 {
-       ao_storage_write(ao_log_micro_pos, &data, sizeof (data));
-       ao_log_micro_pos += sizeof (data);
+       uint16_t        n_samples = (ao_log_offset - STARTING_LOG_OFFSET) / sizeof (uint16_t);
+       ao_eeprom_write(PA_GROUND_OFFSET, &pa_ground, sizeof (pa_ground));
+       ao_eeprom_write(PA_MIN_OFFSET, &pa_min, sizeof (pa_min));
+       ao_eeprom_write(N_SAMPLES_OFFSET, &n_samples, sizeof (n_samples));
 }
 
-uint32_t       ao_log_last_ground;
-uint32_t       ao_log_last_done;
-
-uint8_t
-ao_log_micro_scan(void)
+void
+ao_log_micro_restore(void)
 {
-       uint32_t        data;
-       ao_pos_t        pos;
+       ao_eeprom_read(PA_GROUND_OFFSET, &pa_ground, sizeof (pa_ground));
+       ao_eeprom_read(PA_MIN_OFFSET, &pa_min, sizeof (pa_min));
+}
 
-       ao_storage_read(0, &data, sizeof (data));
-       if ((data & AO_LOG_MICRO_MASK) != AO_LOG_MICRO_GROUND)
-               return 0;
+void
+ao_log_micro_data(void)
+{
+       uint16_t        low_bits = pa;
 
-       ao_log_last_ground = data & ~(AO_LOG_MICRO_MASK);
-       for (pos = 4; pos < ao_storage_total; pos += 4) {
-               ao_storage_read(pos, &data, sizeof (data));
-               if ((data & AO_LOG_MICRO_MASK) == AO_LOG_MICRO_GROUND) {
-                       ao_log_last_done = data & ~(AO_LOG_MICRO_MASK);
-                       return 1;
-               }
+       if (ao_log_offset < MAX_LOG_OFFSET) {
+               ao_eeprom_write(ao_log_offset, &low_bits, sizeof (low_bits));
+               ao_log_offset += sizeof (low_bits);
        }
-       return 0;
 }
 
 void
 ao_log_micro_dump(void)
 {
-       ao_pos_t        pos;
-       uint8_t         data[4];
-       uint8_t         i;
+       uint16_t        n_samples;
+       uint16_t        nbytes;
+       uint8_t         byte;
+       uint16_t        b;
 
-       for (pos = 0; pos < ao_storage_total; pos += 4) {
-               ao_storage_read(pos, data, 4);
-               for (i = 0; i < 4; i++)
-                       ao_async_byte(data[i]);
-               if (data[3] == (uint8_t) (AO_LOG_MICRO_GROUND >> 24))
-                       break;
+       ao_eeprom_read(N_SAMPLES_OFFSET, &n_samples, sizeof (n_samples));
+       nbytes = STARTING_LOG_OFFSET + sizeof (uint16_t) * n_samples;
+       ao_async_byte('M');
+       ao_async_byte('P');
+       for (b = 0; b < nbytes; b++) {
+               ao_eeprom_read(b, &byte, 1);
+               ao_async_byte(byte);
        }
 }
-
-#endif
index 15b2d178c726c9170cd84f77a64dc70c81dfee9e..976852ee2acd13c2e5cc561aae8525668b06d641 100644 (file)
 #ifndef _AO_LOG_MICRO_H_
 #define _AO_LOG_MICRO_H_
 
-#define AO_LOG_MICRO_GROUND    (0l << 24)
-#define AO_LOG_MICRO_DATA      (1l << 24)
-#define AO_LOG_MICRO_DONE      (0xaal << 24)
-#define AO_LOG_MICRO_MASK      (0xffl << 24)
+#define PA_GROUND_OFFSET       0
+#define PA_MIN_OFFSET          4
+#define N_SAMPLES_OFFSET       8
+#define STARTING_LOG_OFFSET    10
+#define MAX_LOG_OFFSET         512
 
 void
-ao_log_micro_data(uint32_t data);
+ao_log_micro_save(void);
 
-extern uint32_t        ao_log_last_ground;
-extern uint32_t        ao_log_last_done;
+void
+ao_log_micro_restore(void);
 
-uint8_t
-ao_log_micro_scan(void);
+void
+ao_log_micro_data(void);
 
 void
 ao_log_micro_dump(void);
index 525cfa42bfe529f14fd7c49647048ca65ba2d58b..3bbc7eea59a09c348d4c4debf4e1e019db45ea4c 100644 (file)
  */
 
 #include <ao.h>
+#include <ao_micropeak.h>
 #include <ao_ms5607.h>
 #include <ao_log_micro.h>
 
 static struct ao_ms5607_sample sample;
 static struct ao_ms5607_value  value;
 
-static uint32_t        pa;
-static uint32_t        pa_sum;
-static uint32_t        pa_avg;
-static int32_t pa_diff;
-static uint32_t        pa_ground;
-static uint32_t        pa_min;
-static uint32_t        pa_interval_min, pa_interval_max;
-static alt_t   ground_alt, max_alt;
+uint32_t       pa;
+uint32_t       pa_avg;
+uint32_t       pa_ground;
+uint32_t       pa_min;
+alt_t          ground_alt, max_alt;
 alt_t          ao_max_height;
 
+static uint32_t        pa_sum;
+
 static void
 ao_pa_get(void)
 {
@@ -40,22 +40,6 @@ ao_pa_get(void)
        pa = value.pres;
 }
 
-#define FILTER_SHIFT           3
-#define SAMPLE_SLEEP           AO_MS_TO_TICKS(96)
-
-/* 16 sample, or about two seconds worth */
-#define GROUND_AVG_SHIFT       4
-#define GROUND_AVG             (1 << GROUND_AVG_SHIFT)
-
-/* Pressure change (in Pa) to detect boost */
-#define BOOST_DETECT           120     /* 10m at sea level, 12m at 2000m */
-
-/* Wait after power on before doing anything to give the user time to assemble the rocket */
-#define BOOST_DELAY            AO_SEC_TO_TICKS(30)
-
-/* Pressure change (in Pa) to detect landing */
-#define LAND_DETECT            12      /* 1m at sea level, 1.2m at 2000m */
-
 static void
 ao_compute_height(void)
 {
@@ -64,90 +48,30 @@ ao_compute_height(void)
        ao_max_height = max_alt - ground_alt;
 }
 
-#if !HAS_EEPROM
-
-#define PA_GROUND_OFFSET       0
-#define PA_MIN_OFFSET          4
-#define N_SAMPLES_OFFSET       8
-#define STARTING_LOG_OFFSET    10
-#define MAX_LOG_OFFSET         512
-
-static uint16_t ao_log_offset = STARTING_LOG_OFFSET;
-
-void
-ao_save_flight(void)
-{
-       uint16_t        n_samples = (ao_log_offset - STARTING_LOG_OFFSET) / sizeof (uint16_t);
-       ao_eeprom_write(PA_GROUND_OFFSET, &pa_ground, sizeof (pa_ground));
-       ao_eeprom_write(PA_MIN_OFFSET, &pa_min, sizeof (pa_min));
-       ao_eeprom_write(N_SAMPLES_OFFSET, &n_samples, sizeof (n_samples));
-}
-
-void
-ao_restore_flight(void)
-{
-       ao_eeprom_read(PA_GROUND_OFFSET, &pa_ground, sizeof (pa_ground));
-       ao_eeprom_read(PA_MIN_OFFSET, &pa_min, sizeof (pa_min));
-}
-
-void
-ao_log_micro(void)
-{
-       uint16_t        low_bits = pa;
-
-       if (ao_log_offset < MAX_LOG_OFFSET) {
-               ao_eeprom_write(ao_log_offset, &low_bits, sizeof (low_bits));
-               ao_log_offset += sizeof (low_bits);
-       }
-}
-#endif
-
 int
 main(void)
 {
        int16_t         sample_count;
        uint16_t        time;
-#if HAS_EEPROM
-       uint8_t dump_eeprom = 0;
-#endif
+       uint32_t        pa_interval_min, pa_interval_max;
+       int32_t         pa_diff;
+
        ao_led_init(LEDS_AVAILABLE);
        ao_timer_init();
 
-#if HAS_EEPROM
-
-       /* Set MOSI and CLK as inputs with pull-ups */
-       DDRB &= ~(1 << 0) | (1 << 2);
-       PORTB |= (1 << 0) | (1 << 2);
-
-       /* Check to see if either MOSI or CLK are pulled low by the
-        * user shorting them to ground. If so, dump the eeprom out
-        * via the LED. Wait for the shorting wire to go away before
-        * continuing.
-        */
-       while ((PINB & ((1 << 0) | (1 << 2))) != ((1 << 0) | (1 << 2)))
-               dump_eeprom = 1;
-       PORTB &= ~(1 << 0) | (1 << 2);
-
-       ao_i2c_init();
-#endif
-       ao_restore_flight();
-       ao_compute_height();
-       /* Give the person a second to get their finger out of the way */
-       ao_delay(AO_MS_TO_TICKS(1000));
-       ao_report_altitude();
-       
+       /* Init external hardware */
        ao_spi_init();
        ao_ms5607_init();
        ao_ms5607_setup();
 
-#if HAS_EEPROM
-       ao_storage_init();
-
-       /* Check to see if there's a flight recorded in memory */
-       if (dump_eeprom && ao_log_micro_scan())
-               ao_log_micro_dump();
-#endif 
+       /* Give the person a second to get their finger out of the way */
+       ao_delay(AO_MS_TO_TICKS(1000));
 
+       ao_log_micro_restore();
+       ao_compute_height();
+       ao_report_altitude();
+       ao_log_micro_dump();
+       
        ao_delay(BOOST_DELAY);
        /* Wait for motion, averaging values to get ground pressure */
        time = ao_time();
@@ -182,10 +106,6 @@ main(void)
 
        pa_ground >>= FILTER_SHIFT;
 
-#if HAS_EEPROM
-       ao_log_micro_data(AO_LOG_MICRO_GROUND | pa_ground);
-#endif
-
        /* Now sit around until the pressure is stable again and record the max */
 
        sample_count = 0;
@@ -200,12 +120,8 @@ main(void)
                ao_pa_get();
                if ((sample_count & 3) == 0)
                        ao_led_off(AO_LED_REPORT);
-#if HAS_EEPROM
-               ao_log_micro_data(AO_LOG_MICRO_DATA | pa);
-#else
                if (sample_count & 1)
-                       ao_log_micro();
-#endif
+                       ao_log_micro_data();
                pa_avg = pa_avg - (pa_avg >> FILTER_SHIFT) + pa;
                if (pa_avg < pa_min)
                        pa_min = pa_avg;
@@ -228,10 +144,7 @@ main(void)
                }
        }
        pa_min >>= FILTER_SHIFT;
-#if HAS_EEPROM
-       ao_log_micro_data(AO_LOG_MICRO_DONE | pa_min);
-#endif
-       ao_save_flight();
+       ao_log_micro_save();
        ao_compute_height();
        ao_report_altitude();
        for (;;) {
diff --git a/src/micropeak/ao_micropeak.h b/src/micropeak/ao_micropeak.h
new file mode 100644 (file)
index 0000000..e408d7c
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * 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_MICROPEAK_H_
+#define _AO_MICROPEAK_H_
+
+#define FILTER_SHIFT           3
+#define SAMPLE_SLEEP           AO_MS_TO_TICKS(96)
+
+/* 16 sample, or about two seconds worth */
+#define GROUND_AVG_SHIFT       4
+#define GROUND_AVG             (1 << GROUND_AVG_SHIFT)
+
+/* Pressure change (in Pa) to detect boost */
+#define BOOST_DETECT           120     /* 10m at sea level, 12m at 2000m */
+
+/* Wait after power on before doing anything to give the user time to assemble the rocket */
+#define BOOST_DELAY            AO_SEC_TO_TICKS(30)
+
+/* Pressure change (in Pa) to detect landing */
+#define LAND_DETECT            12      /* 1m at sea level, 1.2m at 2000m */
+
+/* Current sensor pressure value */
+extern uint32_t        pa;
+
+/* IIR filtered pressure value */
+extern uint32_t        pa_avg;
+
+/* Average pressure value on ground */
+extern uint32_t        pa_ground;
+
+/* Minimum recorded filtered pressure value */
+extern uint32_t        pa_min;
+
+/* Pressure values converted to altitudes */
+extern alt_t   ground_alt, max_alt;
+
+/* max_alt - ground_alt */
+extern alt_t   ao_max_height;
+
+#endif
+