Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
authorBdale Garbee <bdale@gag.com>
Wed, 22 Jul 2020 21:23:02 +0000 (15:23 -0600)
committerBdale Garbee <bdale@gag.com>
Wed, 22 Jul 2020 21:23:02 +0000 (15:23 -0600)
15 files changed:
Releasing
altosui/AltosConfigFCUI.java
altosui/altos-windows.nsi.in
doc/config-device.inc
src/avr/ao_arch.h
src/kernel/ao.h
src/kernel/ao_config.c
src/kernel/ao_config.h
src/kernel/ao_flight.c
src/kernel/ao_ignite.c
src/kernel/ao_task.c
src/lpc/ao_arch_funcs.h
src/stm/ao_arch_funcs.h
src/stm32f4/ao_arch_funcs.h
src/stmf0/ao_arch_funcs.h

index 223a14d3c902407478c3f6627deb3865e09a18ae..e9ceb4084162203a1213a9b443b34074b1e2c2c3 100644 (file)
--- a/Releasing
+++ b/Releasing
@@ -101,40 +101,40 @@ These are Bdale's notes on how to do a release.
 
        - store a stable copy of ARM binaries for production use
 
-       cp src/chaoskey-v1.0/{*.elf,*.ihx,*.bin} \
-          src/easymega-v1.0/{*.elf,*.ihx} \
-          src/easymega-v2.0/{*.elf,*.ihx} \
-          src/easymini-v1.0/{*.elf,*.ihx} \
-          src/easymini-v2.0/{*.elf,*.ihx} \
-          src/easytimer-v1/{*.elf,*.ihx} \
-          src/telebt-v3.0/{*.elf,*.ihx} \
-          src/telebt-v4.0/{*.elf,*.ihx} \
-          src/teledongle-v3.0/{*.elf,*.ihx} \
-          src/telegps-v1.0/{*.elf,*.ihx} \
-          src/telegps-v2.0/{*.elf,*.ihx} \
-          src/telemega-v[1-4].0/{*.elf,*.ihx} \
-          src/telemetrum-v2.0/{*.elf,*.ihx} \
-          src/telemetrum-v3.0/{*.elf,*.ihx} \
-          src/telemini-v3.0/{*.elf,*.ihx} \
-          src/telelco-v2.0/{*.elf,*.ihx} \
-          src/telefireeight-v1.0/{*.elf,*.ihx} \
-          src/telefireeight-v2.0/{*.elf,*.ihx} \
+       cp src/chaoskey-v1.0/{*.elf,*.ihx,*.bin,*.map} \
+          src/easymega-v1.0/{*.elf,*.ihx,*.map} \
+          src/easymega-v2.0/{*.elf,*.ihx,*.map} \
+          src/easymini-v1.0/{*.elf,*.ihx,*.map} \
+          src/easymini-v2.0/{*.elf,*.ihx,*.map} \
+          src/easytimer-v1/{*.elf,*.ihx,*.map} \
+          src/telebt-v3.0/{*.elf,*.ihx,*.map} \
+          src/telebt-v4.0/{*.elf,*.ihx,*.map} \
+          src/teledongle-v3.0/{*.elf,*.ihx,*.map} \
+          src/telegps-v1.0/{*.elf,*.ihx,*.map} \
+          src/telegps-v2.0/{*.elf,*.ihx,*.map} \
+          src/telemega-v[1-4].0/{*.elf,*.ihx,*.map} \
+          src/telemetrum-v2.0/{*.elf,*.ihx,*.map} \
+          src/telemetrum-v3.0/{*.elf,*.ihx,*.map} \
+          src/telemini-v3.0/{*.elf,*.ihx,*.map} \
+          src/telelco-v2.0/{*.elf,*.ihx,*.map} \
+          src/telefireeight-v1.0/{*.elf,*.ihx,*.map} \
+          src/telefireeight-v2.0/{*.elf,*.ihx,*.map} \
           ~/altusmetrumllc/Binaries/
-       cp src/chaoskey-v1.0/flash-loader/{*.elf,*.bin} \
+       cp src/chaoskey-v1.0/flash-loader/{*.elf,*.bin,*.map} \
           src/easymega-v1.0/flash-loader/*.elf \
           src/easymega-v2.0/flash-loader/*.elf \
           src/easymini-v1.0/flash-loader/*.elf \
-          src/easymini-v2.0/flash-loader/{*.elf,*.bin} \
-          src/easytimer-v1/flash-loader/{*.elf,*.bin} \
+          src/easymini-v2.0/flash-loader/{*.elf,*.bin,*.map} \
+          src/easytimer-v1/flash-loader/{*.elf,*.bin,*.map} \
           src/telebt-v3.0/flash-loader/*.elf \
-          src/telebt-v4.0/flash-loader/{*.elf,*.bin} \
+          src/telebt-v4.0/flash-loader/{*.elf,*.bin,*.map} \
           src/teledongle-v3.0/flash-loader/*.elf \
           src/telegps-v1.0/flash-loader/*.elf \
-          src/telegps-v2.0/flash-loader/{*.elf,*.bin} \
+          src/telegps-v2.0/flash-loader/{*.elf,*.bin,*.map} \
           src/telemega-v[1-4].0/flash-loader/*.elf \
           src/telemetrum-v2.0/flash-loader/*.elf \
           src/telemetrum-v3.0/flash-loader/*.elf \
-          src/telemini-v3.0/flash-loader/{*.elf,*.bin} \
+          src/telemini-v3.0/flash-loader/{*.elf,*.bin,*.map} \
           src/telelco-v2.0/flash-loader/*.elf \
           src/telefireeight-v1.0/flash-loader/*.elf \
           src/telefireeight-v2.0/flash-loader/*.elf \
index 8df3c022a398c3067a7222768befb981ad5ff0d0..3b11fb68d716a2838a8560cf510e275c41eccaf5 100644 (file)
@@ -119,6 +119,7 @@ public class AltosConfigFCUI
                "Dual Deploy",
                "Redundant Apogee",
                "Redundant Main",
+               "Separation & Apogee",
        };
 
        static String[]         aprs_interval_values = {
index fa803c5fc566a5851f262aff271a5a2dd785d74d..6d4876720980e523d624910fb163dec83a09ebd8 100644 (file)
@@ -121,7 +121,7 @@ Section "Firmware"
        SetOutPath $INSTDIR
 
        File "../src/telemetrum-v2.0/telemetrum-v2.0-${VERSION}.ihx"
-;      File "../src/telemetrum-v3.0/telemetrum-v3.0-${VERSION}.ihx"
+       File "../src/telemetrum-v3.0/telemetrum-v3.0-${VERSION}.ihx"
        File "../src/telemini-v3.0/telemini-v3.0-${VERSION}.ihx"
        File "../src/telegps-v1.0/telegps-v1.0-${VERSION}.ihx"
        File "../src/telegps-v2.0/telegps-v2.0-${VERSION}.ihx"
index 15f9129e4d0dd55cbc5a459909aae2030de38e4a..a533ca82213debb5455671d278192640ac3d4bed 100644 (file)
@@ -171,6 +171,10 @@ ifdef::altusmetrum[]
                is fired first, followed after a two second
                delay by the 'main' channel.
 
+               Separation & Apogee::
+               This fires the 'main' channel when the first motor
+               burns out and fires the 'apogee' charge at apogee.
+
        ifdef::telemetrum,telemega,easymega,easytimer[]
        ==== Pad Orientation
 
index d3454f917fc6f75aa32d5879d2d3d9a4cf821198..a8fa85836489513a00625fc3f194341644012c37 100644 (file)
@@ -78,9 +78,8 @@ extern uint8_t        ao_cpu_sleep_disable;
 
 #define ao_arch_task_globals   uint8_t ao_cpu_sleep_disable;
 
-#define ao_arch_init_stack(task, start) \
+#define ao_arch_init_stack(task, sp, start)                            \
        do {                                                            \
-               uint8_t         *sp = task->stack8 + AO_STACK_SIZE - 1; \
                uint16_t        a = (uint16_t) start;                   \
                int             i;                                      \
                                                                        \
index fb7af24dac350c717c8620e425ce81bd1a6644f8..f44b0e9e380c260941580465f86c9c336cc97903 100644 (file)
@@ -749,9 +749,6 @@ enum ao_igniter {
        ao_igniter_main = 1
 };
 
-void
-ao_ignite(enum ao_igniter igniter);
-
 enum ao_igniter_status {
        ao_igniter_unknown,     /* unknown status (ambiguous voltage) */
        ao_igniter_ready,       /* continuity detected */
index 217b0ab1a8cd5145dbc6470f2c95bede280144f1..24eb79d9aaeba53b2fe2db62d93929569e5633d3 100644 (file)
@@ -1039,7 +1039,7 @@ const struct ao_config_var ao_config_vars[] = {
          ao_config_log_set,            ao_config_log_show },
 #endif
 #if HAS_IGNITE
-       { "i <0 dual, 1 apogee, 2 main>\0Igniter mode",
+       { "i <0 dual, 1 apogee, 2 main, 3 booster>\0Igniter mode",
          ao_config_ignite_mode_set,    ao_config_ignite_mode_show },
 #endif
 #if HAS_AES
index 87509dff8df1e94d8b8b15866a5845d021c264c0..3cfd0d0731574c71599c5946e012a6f0d6c642bc 100644 (file)
@@ -139,6 +139,7 @@ extern uint32_t     ao_send_radio_setting;
 #define AO_IGNITE_MODE_DUAL            0
 #define AO_IGNITE_MODE_APOGEE          1
 #define AO_IGNITE_MODE_MAIN            2
+#define AO_IGNITE_MODE_BOOSTER         3
 
 #define AO_RADIO_ENABLE_CORE           1
 #define AO_RADIO_DISABLE_TELEMETRY     2
index c5069158a61cc603914566a4917608a54a300be3..2142546c9b0737b186cca6f6dce65fa51c8e30ec 100644 (file)
@@ -222,6 +222,8 @@ ao_flight(void)
                                )
                        {
                                ao_flight_state = ao_flight_boost;
+                               ao_wakeup(&ao_flight_state);
+
                                ao_launch_tick = ao_boost_tick = ao_sample_tick;
 
                                /* start logging data */
@@ -242,8 +244,6 @@ ao_flight(void)
                                ao_gps_new = AO_GPS_NEW_DATA | AO_GPS_NEW_TRACKING;
                                ao_wakeup(&ao_gps_new);
 #endif
-
-                               ao_wakeup(&ao_flight_state);
                        }
                        break;
                case ao_flight_boost:
@@ -278,8 +278,8 @@ ao_flight(void)
 #else
                                ao_flight_state = ao_flight_coast;
 #endif
-                               ++ao_motor_number;
                                ao_wakeup(&ao_flight_state);
+                               ++ao_motor_number;
                        }
                        break;
 #if HAS_ACCEL && HAS_BARO
@@ -327,11 +327,9 @@ ao_flight(void)
 #endif
                                )
                        {
-#if HAS_IGNITE
-                               /* ignite the drogue charge */
-                               ao_ignite(ao_igniter_drogue);
-#endif
-
+                               /* enter drogue state */
+                               ao_flight_state = ao_flight_drogue;
+                               ao_wakeup(&ao_flight_state);
 #if HAS_TELEMETRY
                                /* slow down the telemetry system */
                                ao_telemetry_set_interval(AO_TELEMETRY_INTERVAL_RECOVER);
@@ -339,10 +337,6 @@ ao_flight(void)
                                /* Turn the RDF beacon back on */
                                ao_rdf_set(1);
 #endif
-
-                               /* and enter drogue state */
-                               ao_flight_state = ao_flight_drogue;
-                               ao_wakeup(&ao_flight_state);
                        }
                        else
 #else /* not HAS_BARO */
@@ -362,12 +356,11 @@ ao_flight(void)
                                    ao_interval_max_accel_through - ao_interval_min_accel_through <= ao_data_accel_to_sample(MAX_QUIET_ACCEL))
                                {
                                        ao_flight_state = ao_flight_landed;
+                                       ao_wakeup(&ao_flight_state);
 #if HAS_ADC
                                        /* turn off the ADC capture */
                                        ao_timer_set_adc_interval(0);
 #endif
-
-                                       ao_wakeup(&ao_flight_state);
                                }
 
                                /* Reset interval values */
@@ -410,9 +403,8 @@ ao_flight(void)
                         */
                        if (ao_height <= ao_config.main_deploy)
                        {
-#if HAS_IGNITE
-                               ao_ignite(ao_igniter_main);
-#endif
+                               ao_flight_state = ao_flight_main;
+                               ao_wakeup(&ao_flight_state);
 
                                /*
                                 * Start recording min/max height
@@ -423,9 +415,6 @@ ao_flight(void)
                                ao_interval_end = ao_sample_tick + AO_INTERVAL_TICKS;
 
                                ao_interval_min_height = ao_interval_max_height = ao_avg_height;
-
-                               ao_flight_state = ao_flight_main;
-                               ao_wakeup(&ao_flight_state);
                        }
                        break;
 
@@ -445,13 +434,11 @@ ao_flight(void)
                                if (ao_interval_max_height - ao_interval_min_height <= AO_M_TO_HEIGHT(4))
                                {
                                        ao_flight_state = ao_flight_landed;
-
+                                       ao_wakeup(&ao_flight_state);
 #if HAS_ADC
                                        /* turn off the ADC capture */
                                        ao_timer_set_adc_interval(0);
 #endif
-
-                                       ao_wakeup(&ao_flight_state);
                                }
                                ao_interval_min_height = ao_interval_max_height = ao_avg_height;
                                ao_interval_end = ao_sample_tick + AO_INTERVAL_TICKS;
index 71c99a614352d928aaa34d5e4d9dd863c18e66b8..6c19a94cf3051a8a9d04e5a8bd6762af65259cf9 100644 (file)
 #if HAS_IGNITE
 struct ao_ignition ao_ignition[2];
 
-void
-ao_ignite(enum ao_igniter igniter)
-{
-       ao_arch_block_interrupts();
-       ao_ignition[igniter].request = 1;
-       ao_wakeup(&ao_ignition);
-       ao_arch_release_interrupts();
-}
-
 #ifndef AO_SENSE_DROGUE
 #define AO_SENSE_DROGUE(p)     ((p)->adc.sense_d)
 #define AO_SENSE_MAIN(p)       ((p)->adc.sense_m)
@@ -86,9 +77,9 @@ ao_igniter_status(enum ao_igniter igniter)
 static void
 ao_igniter_fire(enum ao_igniter igniter)
 {
-       ao_ignition[igniter].firing = 1;
-       switch(ao_config.ignite_mode) {
-       case AO_IGNITE_MODE_DUAL:
+       if (!ao_ignition[igniter].fired) {
+               ao_ignition[igniter].firing = 1;
+               ao_ignition[igniter].fired = 1;
                switch (igniter) {
                case ao_igniter_drogue:
                        AO_IGNITER_SET_DROGUE(1);
@@ -101,58 +92,47 @@ ao_igniter_fire(enum ao_igniter igniter)
                        AO_IGNITER_SET_MAIN(0);
                        break;
                }
-               break;
-       case AO_IGNITE_MODE_APOGEE:
-               switch (igniter) {
-               case ao_igniter_drogue:
-                       AO_IGNITER_SET_DROGUE(1);
-                       ao_delay(AO_IGNITER_FIRE_TIME);
-                       AO_IGNITER_SET_DROGUE(0);
-                       ao_delay(AO_IGNITER_CHARGE_TIME);
-                       AO_IGNITER_SET_MAIN(1);
-                       ao_delay(AO_IGNITER_FIRE_TIME);
-                       AO_IGNITER_SET_MAIN(0);
-                       break;
-               default:
-                       break;
-               }
-               break;
-       case AO_IGNITE_MODE_MAIN:
-               switch (igniter) {
-               case ao_igniter_main:
-                       AO_IGNITER_SET_DROGUE(1);
-                       ao_delay(AO_IGNITER_FIRE_TIME);
-                       AO_IGNITER_SET_DROGUE(0);
-                       ao_delay(AO_IGNITER_CHARGE_TIME);
-                       AO_IGNITER_SET_MAIN(1);
-                       ao_delay(AO_IGNITER_FIRE_TIME);
-                       AO_IGNITER_SET_MAIN(0);
-                       break;
-               default:
-                       break;
-               }
-               break;
+               ao_ignition[igniter].firing = 0;
+               ao_delay(AO_IGNITER_CHARGE_TIME);
        }
-       ao_ignition[igniter].firing = 0;
 }
 
 static void
 ao_igniter(void)
 {
-       enum ao_igniter igniter;
-
        ao_config_get();
        for (;;) {
-               ao_sleep(&ao_ignition);
-               for (igniter = ao_igniter_drogue; igniter <= ao_igniter_main; igniter++) {
-                       if (ao_ignition[igniter].request && !ao_ignition[igniter].fired) {
-                               if (igniter == ao_igniter_drogue && ao_config.apogee_delay)
-                                       ao_delay(AO_SEC_TO_TICKS(ao_config.apogee_delay));
-
-                               ao_igniter_fire(igniter);
-                               ao_delay(AO_IGNITER_CHARGE_TIME);
-                               ao_ignition[igniter].fired = 1;
+               /* Wait for flight state change */
+               ao_sleep(&ao_flight_state);
+
+               /* Fire any igniters that are supposed to be triggered
+                * in this new state
+                */
+               switch(ao_config.ignite_mode) {
+               case AO_IGNITE_MODE_DUAL:
+                       if (ao_flight_drogue <= ao_flight_state && ao_flight_state < ao_flight_landed)
+                               ao_igniter_fire(ao_igniter_drogue);
+                       if (ao_flight_main <= ao_flight_state && ao_flight_state < ao_flight_landed)
+                               ao_igniter_fire(ao_igniter_main);
+                       break;
+               case AO_IGNITE_MODE_APOGEE:
+                       if (ao_flight_drogue <= ao_flight_state && ao_flight_state < ao_flight_landed) {
+                               ao_igniter_fire(ao_igniter_drogue);
+                               ao_igniter_fire(ao_igniter_main);
                        }
+                       break;
+               case AO_IGNITE_MODE_MAIN:
+                       if (ao_flight_main <= ao_flight_state && ao_flight_state < ao_flight_landed) {
+                               ao_igniter_fire(ao_igniter_drogue);
+                               ao_igniter_fire(ao_igniter_main);
+                       }
+                       break;
+               case AO_IGNITE_MODE_BOOSTER:
+                       if (ao_flight_fast <= ao_flight_state && ao_flight_state < ao_flight_landed)
+                               ao_igniter_fire(ao_igniter_main);
+                       if (ao_flight_drogue <= ao_flight_state && ao_flight_state < ao_flight_landed)
+                               ao_igniter_fire(ao_igniter_drogue);
+                       break;
                }
        }
 }
index 0bc85d40aad2dc86c2df71ee884fb313733fbcb7..15cd2a556b68a5176732eaf3329e9eacf2490c83 100644 (file)
@@ -24,6 +24,7 @@
 #if HAS_STACK_GUARD
 #include <ao_mpu.h>
 #endif
+#include <picotls.h>
 
 #define DEBUG  0
 
@@ -289,6 +290,21 @@ ao_task_validate(void)
 
 #endif /* HAS_TASK_QUEUE */
 
+static inline void *
+ao_stack_top(struct ao_task *task)
+{
+       uint8_t *top = &task->stack8[AO_STACK_SIZE];
+
+       /* Subtract off the TLS space, but keep the resulting
+        * stack 8-byte aligned
+        */
+#if USE_TLS
+       return top - ((_tls_size() + 7) & ~3);
+#else
+       return top;
+#endif
+}
+
 void
 ao_add_task(struct ao_task * task, void (*task_func)(void), const char *name) 
 {
@@ -310,7 +326,11 @@ ao_add_task(struct ao_task * task, void (*task_func)(void), const char *name)
         * Construct a stack frame so that it will 'return'
         * to the start of the task
         */
-       ao_arch_init_stack(task, task_func);
+       uint32_t *sp = ao_stack_top(task);
+#if USE_TLS
+       _init_tls(sp);
+#endif
+       ao_arch_init_stack(task, sp, task_func);
        ao_arch_critical(
 #if HAS_TASK_QUEUE
                ao_task_init_queue(task);
@@ -413,6 +433,9 @@ ao_yield(void) ao_arch_naked_define
 #endif
 #if AO_CHECK_STACK
        in_yield = 0;
+#endif
+#if USE_TLS
+       _set_tls(ao_stack_top(ao_cur_task));
 #endif
        ao_arch_restore_stack();
 }
index 1368f7e5e883ad4b8c94adf626d9d85db7657b67..e0280e76466a2f6e4a1752478b828c743de33e6d 100644 (file)
@@ -107,9 +107,8 @@ ao_arch_memory_barrier(void) {
 
 #if HAS_TASK
 static inline void
-ao_arch_init_stack(struct ao_task *task, void *start)
+ao_arch_init_stack(struct ao_task *task, uint32_t *sp, void *start)
 {
-       uint32_t        *sp = &task->stack32[AO_STACK_SIZE >> 2];
        uint32_t        a = (uint32_t) start;
        int             i;
 
index ad46ef32babf9fd52b0f9d58f08fd09e6f534275..5c8d990b22a5462395735aa9134cbcbfac13c3f2 100644 (file)
@@ -473,9 +473,8 @@ ao_arch_irq_check(void) {
 
 #if HAS_TASK
 static inline void
-ao_arch_init_stack(struct ao_task *task, void *start)
+ao_arch_init_stack(struct ao_task *task, uint32_t *sp, void *start)
 {
-       uint32_t        *sp = &task->stack32[AO_STACK_SIZE>>2];
        uint32_t        a = (uint32_t) start;
        int             i;
 
index 6fa654973842877a59325e94cd3a991e6d1750d0..74f4021b070854cf9dd0e0f10f55e03ba6b96823 100644 (file)
@@ -82,9 +82,8 @@ ao_arch_irq_check(void) {
 
 #if HAS_TASK
 static inline void
-ao_arch_init_stack(struct ao_task *task, void *start)
+ao_arch_init_stack(struct ao_task *task, uint32_t *sp, void *start)
 {
-       uint32_t        *sp = &task->stack32[AO_STACK_SIZE>>2];
        uint32_t        a = (uint32_t) start;
        int             i;
 
index 591ca8a07576fb01a2888754d5f372fc9ab0ac47..190f9d1766ea7dbd96f1b95c9a2b6ac52c7f3061 100644 (file)
@@ -387,9 +387,8 @@ ao_arch_memory_barrier(void) {
 
 #if HAS_TASK
 static inline void
-ao_arch_init_stack(struct ao_task *task, void *start)
+ao_arch_init_stack(struct ao_task *task, uint32_t *sp, void *start)
 {
-       uint32_t        *sp = &task->stack32[AO_STACK_SIZE >> 2];
        uint32_t        a = (uint32_t) start;
        int             i;