altos: Remove 8051 address space specifiers
[fw/altos] / src / kernel / ao_pyro.c
index 0aed50d5434f65b8b0c7c03190bf47cc5b89160c..e24ab46b41a8959f21161a9614d41051aaf0245d 100644 (file)
@@ -38,8 +38,8 @@
 enum ao_igniter_status
 ao_pyro_status(uint8_t p)
 {
-       __xdata struct ao_data packet;
-       __pdata int16_t value;
+       struct ao_data packet;
+       int16_t value;
 
        ao_arch_critical(
                ao_data_get(&packet);
@@ -76,11 +76,24 @@ uint16_t    ao_pyro_fired;
 
 #if PYRO_DBG
 int pyro_dbg;
-#define DBG(...)       do { if (pyro_dbg) printf("\t%d: ", (int) (pyro - ao_config.pyro)); printf(__VA_ARGS__); } while (0)
+#define DBG(...)       do { if (pyro_dbg) { printf("\t%d: ", (int) (pyro - ao_config.pyro)); printf(__VA_ARGS__); } } while (0)
 #else
 #define DBG(...)
 #endif
 
+static angle_t
+ao_sample_max_orient(void)
+{
+       uint8_t i;
+       angle_t max = ao_sample_orients[0];
+
+       for (i = 1; i < AO_NUM_ORIENT; i++) {
+               angle_t a = ao_sample_orients[i];
+               if (a > max)
+                       max = a;
+       }
+       return max;
+}
 /*
  * Given a pyro structure, figure out
  * if the current flight state satisfies all
@@ -90,6 +103,9 @@ static uint8_t
 ao_pyro_ready(struct ao_pyro *pyro)
 {
        enum ao_pyro_flag flag, flags;
+#if HAS_GYRO
+       angle_t max_orient;
+#endif
 
        flags = pyro->flags;
        while (flags != ao_pyro_none) {
@@ -130,26 +146,28 @@ ao_pyro_ready(struct ao_pyro *pyro)
 
 #if HAS_GYRO
                case ao_pyro_orient_less:
-                       if (ao_sample_orient <= pyro->orient_less)
+                       max_orient = ao_sample_max_orient();
+                       if (max_orient <= pyro->orient_less)
                                continue;
-                       DBG("orient %d > %d\n", ao_sample_orient, pyro->orient_less);
+                       DBG("orient %d > %d\n", max_orient, pyro->orient_less);
                        break;
                case ao_pyro_orient_greater:
-                       if (ao_sample_orient >= pyro->orient_greater)
+                       max_orient = ao_sample_max_orient();
+                       if (max_orient >= pyro->orient_greater)
                                continue;
-                       DBG("orient %d < %d\n", ao_sample_orient, pyro->orient_greater);
+                       DBG("orient %d < %d\n", max_orient, pyro->orient_greater);
                        break;
 #endif
 
                case ao_pyro_time_less:
-                       if ((int16_t) (ao_time() - ao_boost_tick) <= pyro->time_less)
+                       if ((int16_t) (ao_time() - ao_launch_tick) <= pyro->time_less)
                                continue;
-                       DBG("time %d > %d\n", (int16_t)(ao_time() - ao_boost_tick), pyro->time_less);
+                       DBG("time %d > %d\n", (int16_t)(ao_time() - ao_launch_tick), pyro->time_less);
                        break;
                case ao_pyro_time_greater:
-                       if ((int16_t) (ao_time() - ao_boost_tick) >= pyro->time_greater)
+                       if ((int16_t) (ao_time() - ao_launch_tick) >= pyro->time_greater)
                                continue;
-                       DBG("time %d < %d\n", (int16_t)(ao_time() - ao_boost_tick), pyro->time_greater);
+                       DBG("time %d < %d\n", (int16_t)(ao_time() - ao_launch_tick), pyro->time_greater);
                        break;
 
                case ao_pyro_ascending:
@@ -164,7 +182,7 @@ ao_pyro_ready(struct ao_pyro *pyro)
                        break;
 
                case ao_pyro_after_motor:
-                       if (ao_motor_number == pyro->motor)
+                       if (ao_motor_number >= pyro->motor)
                                continue;
                        DBG("motor %d != %d\n", ao_motor_number, pyro->motor);
                        break;
@@ -239,11 +257,8 @@ ao_pyro_pins_fire(uint16_t fire)
        }
        ao_delay(ao_config.pyro_time);
        for (p = 0; p < AO_PYRO_NUM; p++) {
-               if (fire & (1 << p)) {
+               if (fire & (1 << p))
                        ao_pyro_pin_set(p, 0);
-                       ao_config.pyro[p].fired = 1;
-                       ao_pyro_fired |= (1 << p);
-               }
        }
        ao_delay(AO_MS_TO_TICKS(50));
 }
@@ -261,7 +276,7 @@ ao_pyro_check(void)
 
                /* Ignore igniters which have already fired
                 */
-               if (pyro->fired)
+               if (ao_pyro_fired & (1 << p))
                        continue;
 
                /* Ignore disabled igniters
@@ -296,7 +311,7 @@ ao_pyro_check(void)
                         * by setting the fired bit
                         */
                        if (!ao_pyro_ready(pyro)) {
-                               pyro->fired = 1;
+                               ao_pyro_fired |= (1 << p);
                                continue;
                        }
 
@@ -307,8 +322,10 @@ ao_pyro_check(void)
                fire |= (1 << p);
        }
 
-       if (fire)
+       if (fire) {
+               ao_pyro_fired |= fire;
                ao_pyro_pins_fire(fire);
+       }
 
        return any_waiting;
 }
@@ -387,7 +404,7 @@ ao_pyro(void)
        ao_exit();
 }
 
-__xdata struct ao_task ao_pyro_task;
+struct ao_task ao_pyro_task;
 
 
 static void