altos: Make sure pa to altitude conversion is done with 32 bits
[fw/altos] / src / core / ao_config.c
index 55fb8590eb74669eb2bf9fee6b2f62f7351cc91b..e85ddcb4d74d9a53dbb0b2ed9630d4be0f667cfe 100644 (file)
  */
 
 #include "ao.h"
+#include "ao_log.h"
+#include <ao_storage.h>
+#if HAS_FLIGHT
+#include <ao_sample.h>
+#include <ao_data.h>
+#endif
 
 __xdata struct ao_config ao_config;
 __pdata uint8_t ao_config_loaded;
@@ -64,18 +70,26 @@ ao_config_put(void)
 }
 #endif
 
+#if HAS_RADIO
 void
 ao_config_set_radio(void)
 {
        ao_config.radio_setting = ao_freq_to_set(ao_config.frequency, ao_config.radio_cal);
 }
+#endif /* HAS_RADIO */
 
 static void
 _ao_config_get(void)
 {
+       uint8_t minor;
+
        if (ao_config_loaded)
                return;
 #if HAS_EEPROM
+       /* Yes, I know ao_storage_read calls ao_storage_setup,
+        * but ao_storage_setup *also* sets ao_storage_config, which we
+        * need before calling ao_storage_read here
+        */
        ao_storage_setup();
        ao_storage_read(ao_storage_config, &ao_config, sizeof (ao_config));
 #endif
@@ -88,51 +102,68 @@ _ao_config_get(void)
                ao_xmemset(&ao_config.callsign, '\0', sizeof (ao_config.callsign));
                ao_xmemcpy(&ao_config.callsign, CODE_TO_XDATA(AO_CONFIG_DEFAULT_CALLSIGN),
                       sizeof(AO_CONFIG_DEFAULT_CALLSIGN) - 1);
-               ao_config_dirty = 1;
+               ao_config._legacy_radio_channel = 0;
        }
-       if (ao_config.minor != AO_CONFIG_MINOR) {
+       minor = ao_config.minor;
+       if (minor != AO_CONFIG_MINOR) {
                /* Fixups for minor version 1 */
-               if (ao_config.minor < 1)
+               if (minor < 1)
                        ao_config.apogee_delay = AO_CONFIG_DEFAULT_APOGEE_DELAY;
                /* Fixups for minor version 2 */
-               if (ao_config.minor < 2) {
+               if (minor < 2) {
                        ao_config.accel_plus_g = 0;
                        ao_config.accel_minus_g = 0;
                }
                /* Fixups for minor version 3 */
-               if (ao_config.minor < 3)
+#if HAS_RADIO
+               if (minor < 3)
                        ao_config.radio_cal = ao_radio_cal;
+#endif
                /* Fixups for minor version 4 */
-               if (ao_config.minor < 4)
+               if (minor < 4)
                        ao_config.flight_log_max = AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX;
                /* Fixupes for minor version 5 */
-               if (ao_config.minor < 5)
+               if (minor < 5)
                        ao_config.ignite_mode = AO_CONFIG_DEFAULT_IGNITE_MODE;
-               if (ao_config.minor < 6)
+               if (minor < 6)
                        ao_config.pad_orientation = AO_CONFIG_DEFAULT_PAD_ORIENTATION;
-               if (ao_config.minor < 8)
+               if (minor < 8)
                        ao_config.radio_enable = TRUE;
-               if (ao_config.minor < 9)
+               if (minor < 9)
                        ao_xmemset(&ao_config.aes_key, '\0', AO_AES_LEN);
-               if (ao_config.minor < 10)
-                       ao_config.frequency = 434550;
-               if (ao_config.minor < 11)
+               if (minor < 10)
+                       ao_config.frequency = 434550 + ao_config._legacy_radio_channel * 100;
+               if (minor < 11)
                        ao_config.apogee_lockout = 0;
+#if AO_PYRO_NUM
+               if (minor < 12)
+                       memset(&ao_config.pyro, '\0', sizeof (ao_config.pyro));
+#endif
                ao_config.minor = AO_CONFIG_MINOR;
                ao_config_dirty = 1;
        }
+#if HAS_RADIO
+#if HAS_FORCE_FREQ
+       if (ao_force_freq) {
+               ao_config.frequency = 434550;
+               ao_config.radio_cal = ao_radio_cal;
+               ao_xmemcpy(&ao_config.callsign, CODE_TO_XDATA(AO_CONFIG_DEFAULT_CALLSIGN),
+                      sizeof(AO_CONFIG_DEFAULT_CALLSIGN) - 1);
+       }
+#endif
        ao_config_set_radio();
+#endif
        ao_config_loaded = 1;
 }
 
-static void
+void
 _ao_config_edit_start(void)
 {
        ao_mutex_get(&ao_config_mutex);
        _ao_config_get();
 }
 
-static void
+void
 _ao_config_edit_finish(void)
 {
        ao_config_dirty = 1;
@@ -176,6 +207,7 @@ ao_config_callsign_set(void) __reentrant
        _ao_config_edit_finish();
 }
 
+#if HAS_RADIO
 void
 ao_config_frequency_show(void) __reentrant
 {
@@ -195,6 +227,7 @@ ao_config_frequency_set(void) __reentrant
        _ao_config_edit_finish();
        ao_radio_recv_abort();
 }
+#endif
 
 #if HAS_FLIGHT
 
@@ -232,7 +265,7 @@ ao_config_accel_calibrate_auto(char *orientation) __reentrant
 {
        uint16_t        i;
        int32_t         accel_total;
-       uint8_t         cal_adc_ring;
+       uint8_t         cal_data_ring;
 
        printf("Orient antenna %s and press a key...", orientation);
        flush();
@@ -241,12 +274,12 @@ ao_config_accel_calibrate_auto(char *orientation) __reentrant
        puts("Calibrating..."); flush();
        i = ACCEL_CALIBRATE_SAMPLES;
        accel_total = 0;
-       cal_adc_ring = ao_sample_adc;
+       cal_data_ring = ao_sample_data;
        while (i) {
-               ao_sleep(DATA_TO_XDATA(&ao_sample_adc));
-               while (i && cal_adc_ring != ao_sample_adc) {
-                       accel_total += (int32_t) ao_adc_ring[cal_adc_ring].accel;
-                       cal_adc_ring = ao_adc_ring_next(cal_adc_ring);
+               ao_sleep(DATA_TO_XDATA(&ao_sample_data));
+               while (i && cal_data_ring != ao_sample_data) {
+                       accel_total += (int32_t) ao_data_accel(&ao_data_ring[cal_data_ring]);
+                       cal_data_ring = ao_data_ring_next(cal_data_ring);
                        i--;
                }
        }
@@ -320,6 +353,7 @@ ao_config_apogee_lockout_set(void) __reentrant
 
 #endif /* HAS_FLIGHT */
 
+#if HAS_RADIO
 void
 ao_config_radio_cal_show(void) __reentrant
 {
@@ -337,6 +371,7 @@ ao_config_radio_cal_set(void) __reentrant
        ao_config_set_radio();
        _ao_config_edit_finish();
 }
+#endif
 
 #if HAS_LOG
 void
@@ -413,6 +448,7 @@ ao_config_pad_orientation_set(void) __reentrant
 }
 #endif
 
+#if HAS_RADIO
 void
 ao_config_radio_enable_show(void) __reentrant
 {
@@ -429,8 +465,12 @@ ao_config_radio_enable_set(void) __reentrant
        ao_config.radio_enable = ao_cmd_lex_i;
        _ao_config_edit_finish();
 }
+#endif /* HAS_RADIO */
        
 #if HAS_AES
+
+__xdata uint8_t        ao_config_aes_seq = 1;
+
 void
 ao_config_key_show(void) __reentrant
 {
@@ -453,6 +493,7 @@ ao_config_key_set(void) __reentrant
                        break;
                ao_config.aes_key[i] = ao_cmd_lex_i;
        }
+       ++ao_config_aes_seq;
        _ao_config_edit_finish();
 }
 #endif
@@ -481,18 +522,22 @@ __code struct ao_config_var ao_config_vars[] = {
        { "L <seconds>\0Apogee detect lockout (s)",
          ao_config_apogee_lockout_set, ao_config_apogee_lockout_show, },
 #endif /* HAS_FLIGHT */
+#if HAS_RADIO
        { "F <freq>\0Frequency (kHz)",
          ao_config_frequency_set, ao_config_frequency_show },
        { "c <call>\0Callsign (8 char max)",
          ao_config_callsign_set,       ao_config_callsign_show },
        { "e <0 disable, 1 enable>\0Enable telemetry and RDF",
          ao_config_radio_enable_set, ao_config_radio_enable_show },
+#endif /* HAS_RADIO */
 #if HAS_ACCEL
        { "a <+g> <-g>\0Accel calib (0 for auto)",
          ao_config_accel_calibrate_set,ao_config_accel_calibrate_show },
 #endif /* HAS_ACCEL */
+#if HAS_RADIO
        { "f <cal>\0Radio calib (cal = rf/(xtal/2^16))",
          ao_config_radio_cal_set,      ao_config_radio_cal_show },
+#endif /* HAS_RADIO */
 #if HAS_LOG
        { "l <size>\0Flight log size (kB)",
          ao_config_log_set,            ao_config_log_show },
@@ -508,6 +553,10 @@ __code struct ao_config_var ao_config_vars[] = {
 #if HAS_AES
        { "k <32 hex digits>\0Set AES encryption key",
          ao_config_key_set, ao_config_key_show },
+#endif
+#if AO_PYRO_NUM
+       { "P <n,?>\0Configure pyro channels",
+         ao_pyro_set, ao_pyro_show },
 #endif
        { "s\0Show",
          ao_config_show,               0 },
@@ -525,12 +574,10 @@ ao_config_set(void)
 {
        char    c;
        uint8_t cmd;
-       void (*__xdata func)(void) __reentrant;
 
        ao_cmd_white();
        c = ao_cmd_lex_c;
        ao_cmd_lex();
-       func = 0;
        for (cmd = 0; ao_config_vars[cmd].str != NULL; cmd++)
                if (ao_config_vars[cmd].str[0] == c) {
                        (*ao_config_vars[cmd].set)();