first cut at turnon scripts for EasyTimer v2
[fw/altos] / src / kernel / ao_microflight.c
index f680e4005c98a5cf9be432ed61509f79d1239863..bf994b8f80b647f1f56825053e1e0edb1e77e288 100644 (file)
@@ -3,7 +3,8 @@
  *
  * 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.
+ * 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
@@ -23,6 +24,7 @@
 
 uint32_t       pa;
 uint32_t       pa_ground;
+uint32_t       pa_ground_next;
 uint32_t       pa_min;
 
 static void
@@ -43,10 +45,12 @@ void
 ao_microflight(void)
 {
        int16_t         sample_count;
-       uint16_t        time;
+       int16_t         log_count;
+       AO_TICK_TYPE    time;
        uint32_t        pa_interval_min, pa_interval_max;
        int32_t         pa_diff;
-       uint8_t         h, i;
+       uint8_t         h;
+       uint8_t         i;
        uint8_t         accel_lock = 0;
        uint32_t        pa_sum = 0;
 
@@ -55,33 +59,43 @@ ao_microflight(void)
        time = ao_time();
        ao_pa_get();
        ao_microkalman_init();
-       pa_ground = pa;
+       pa_ground_next = pa_ground = pa;
        sample_count = 0;
        h = 0;
        for (;;) {
                time += SAMPLE_SLEEP;
+#if BOOST_DETECT
                if ((sample_count & 0x1f) == 0)
                        ao_led_on(AO_LED_REPORT);
+#endif
                ao_delay_until(time);
                ao_microsample();
+#if BOOST_DETECT
                if ((sample_count & 0x1f) == 0)
                        ao_led_off(AO_LED_REPORT);
+#endif
                pa_hist[h] = pa;
                h = SKIP_PA_HIST(h,1);
-               pa_diff = pa_ground - ao_pa;
+               pa_diff = (int32_t) (pa_ground - ao_pa);
 
+#if BOOST_DETECT
                /* Check for a significant pressure change */
                if (pa_diff > BOOST_DETECT)
                        break;
+#endif
 
                if (sample_count < GROUND_AVG * 2) {
                        if (sample_count < GROUND_AVG)
                                pa_sum += pa;
                        ++sample_count;
                } else {
-                       pa_ground = pa_sum >> GROUND_AVG_SHIFT;
+                       pa_ground = pa_ground_next;
+                       pa_ground_next = pa_sum >> GROUND_AVG_SHIFT;
                        pa_sum = 0;
                        sample_count = 0;
+#if !BOOST_DETECT
+                       break;
+#endif
                }
        }
 
@@ -93,7 +107,10 @@ ao_microflight(void)
        }
 
        /* Log the remaining samples so we get a complete history since leaving the ground */
-       for (; i != h; i = SKIP_PA_HIST(i,2)) {
+#if LOG_INTERVAL < NUM_PA_HIST
+       for (; i != h; i = SKIP_PA_HIST(i,2))
+#endif
+       {
                pa = pa_hist[i];
                ao_log_micro_data();
        }
@@ -101,6 +118,7 @@ ao_microflight(void)
        /* Now sit around until the pressure is stable again and record the max */
 
        sample_count = 0;
+       log_count = 0;
        pa_min = ao_pa;
        pa_interval_min = ao_pa;
        pa_interval_max = ao_pa;
@@ -112,8 +130,11 @@ ao_microflight(void)
                ao_microsample();
                if ((sample_count & 3) == 0)
                        ao_led_off(AO_LED_REPORT);
-               if (sample_count & 1)
+               if (log_count == LOG_INTERVAL - 1) {
                        ao_log_micro_data();
+                       log_count = 0;
+               } else
+                       log_count++;
 
                /* If accelerating upwards, don't look for min pressure */
                if (ao_pa_accel < ACCEL_LOCK_PA)
@@ -124,7 +145,7 @@ ao_microflight(void)
                        pa_min = ao_pa;
 
                if (sample_count == (GROUND_AVG - 1)) {
-                       pa_diff = pa_interval_max - pa_interval_min;
+                       pa_diff = (int32_t) (pa_interval_max - pa_interval_min);
 
                        /* Check to see if the pressure is now stable */
                        if (pa_diff < LAND_DETECT)