X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fkernel%2Fao_config.c;h=be3e8c7222d1bc48746700a8f1ac32d0d7ac6daf;hb=d80c1317f596f73d192e6fbb33c3579d54802182;hp=bfc0325e00d9406c59c51cc2d7fd9a23c8682310;hpb=f7c8f0b14cf19804106860a5689cf1f37df20669;p=fw%2Faltos diff --git a/src/kernel/ao_config.c b/src/kernel/ao_config.c index bfc0325e..be3e8c72 100644 --- a/src/kernel/ao_config.c +++ b/src/kernel/ao_config.c @@ -54,6 +54,8 @@ uint8_t ao_force_freq; #define AO_CONFIG_DEFAULT_IGNITE_MODE AO_IGNITE_MODE_DUAL #define AO_CONFIG_DEFAULT_PAD_ORIENTATION AO_PAD_ORIENTATION_ANTENNA_UP #define AO_CONFIG_DEFAULT_PYRO_TIME AO_MS_TO_TICKS(50) +#define AO_CONFIG_DEFAULT_RADIO_10MW 0 +#define AO_CONFIG_DEFAULT_REPORT_FEET 0 #if HAS_CONFIG_SAVE #ifndef USE_INTERNAL_FLASH #error Please define USE_INTERNAL_FLASH @@ -76,7 +78,7 @@ uint8_t ao_force_freq; #define AO_CONFIG_DEFAULT_RADIO_POWER 0x60 #endif #define AO_CONFIG_DEFAULT_RADIO_AMP 0 -#define AO_CONFIG_DEFAULT_APRS_SSID (ao_serial_number % 10) +#define AO_CONFIG_DEFAULT_APRS_SSID ((uint8_t) (ao_serial_number % 10)) #define AO_CONFIG_DEFAULT_RADIO_RATE AO_RADIO_RATE_38400 #if HAS_CONFIG_SAVE @@ -145,6 +147,9 @@ _ao_config_get(void) } minor = ao_config.minor; if (minor != AO_CONFIG_MINOR) { +#if AO_PYRO_NUM + ao_pyro_update_version(); +#endif /* Fixups for minor version 1 */ if (minor < 1) ao_config.apogee_delay = AO_CONFIG_DEFAULT_APOGEE_DELAY; @@ -173,7 +178,7 @@ _ao_config_get(void) if (minor < 9) memset(&ao_config.aes_key, '\0', AO_AES_LEN); if (minor < 10) - ao_config.frequency = 434550 + ao_config._legacy_radio_channel * 100; + ao_config.frequency = 434550U + ao_config._legacy_radio_channel * 100U; if (minor < 11) ao_config.apogee_lockout = 0; #if AO_PYRO_NUM @@ -185,7 +190,7 @@ _ao_config_get(void) #if HAS_RADIO_POWER if (minor < 14) ao_config.radio_power = AO_CONFIG_DEFAULT_RADIO_POWER; - #endif +#endif #if HAS_RADIO_AMP if (minor < 14) ao_config.radio_amp = AO_CONFIG_DEFAULT_RADIO_AMP; @@ -203,7 +208,7 @@ _ao_config_get(void) ao_config.accel_minus_g = 0; } #endif -#if HAS_BEEP_CONFIG +#if HAS_BEEP if (minor < 16) ao_config.mid_beep = AO_BEEP_MID_DEFAULT; #endif @@ -243,6 +248,12 @@ _ao_config_get(void) if (minor < 24) ao_config.aprs_offset = 0; #endif +#if HAS_RADIO_10MW + if (minor < 25) + ao_config.radio_10mw = AO_CONFIG_DEFAULT_RADIO_10MW; +#endif + if (minor < 26) + ao_config.report_feet = AO_CONFIG_DEFAULT_REPORT_FEET; ao_config.minor = AO_CONFIG_MINOR; ao_config_dirty = 1; } @@ -383,7 +394,7 @@ ao_config_main_deploy_set(void) if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); - ao_config.main_deploy = r; + ao_config.main_deploy = (uint16_t) r; _ao_config_edit_finish(); } @@ -446,11 +457,11 @@ ao_config_accel_calibrate_auto(char *orientation) } } #if HAS_IMU - accel_cal_along = accel_along_total >> ACCEL_CALIBRATE_SHIFT; - accel_cal_across = accel_across_total >> ACCEL_CALIBRATE_SHIFT; - accel_cal_through = accel_through_total >> ACCEL_CALIBRATE_SHIFT; + accel_cal_along = (int16_t) (accel_along_total >> ACCEL_CALIBRATE_SHIFT); + accel_cal_across = (int16_t) (accel_across_total >> ACCEL_CALIBRATE_SHIFT); + accel_cal_through = (int16_t) (accel_through_total >> ACCEL_CALIBRATE_SHIFT); #endif - return accel_total >> ACCEL_CALIBRATE_SHIFT; + return (int16_t) (accel_total >> ACCEL_CALIBRATE_SHIFT); } static void @@ -464,11 +475,12 @@ ao_config_accel_calibrate_set(void) int16_t accel_through_up = 0, accel_through_down = 0; #endif - up = ao_cmd_decimal(); + up = (int16_t) ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; - down = ao_cmd_decimal(); + down = (int16_t) ao_cmd_decimal(); auto_cal = (up == 0 && ao_cmd_status != ao_cmd_success); + ao_cmd_status = ao_cmd_success; if (auto_cal) { up = ao_config_accel_calibrate_auto("up"); #if HAS_IMU @@ -493,19 +505,19 @@ ao_config_accel_calibrate_set(void) ao_config.accel_minus_g = down; #if HAS_IMU if (auto_cal) { - ao_config.accel_zero_along = (accel_along_up + accel_along_down) / 2; - ao_config.accel_zero_across = (accel_across_up + accel_across_down) / 2; - ao_config.accel_zero_through = (accel_through_up + accel_through_down) / 2; + ao_config.accel_zero_along = (int16_t) ((accel_along_up + accel_along_down) / 2); + ao_config.accel_zero_across = (int16_t) ((accel_across_up + accel_across_down) / 2); + ao_config.accel_zero_through = (int16_t) ((accel_through_up + accel_through_down) / 2); } else { int16_t v; - v = ao_cmd_decimal(); + v = (int16_t) ao_cmd_decimal(); if (ao_cmd_status == ao_cmd_success) { ao_config.accel_zero_along = v; - v = ao_cmd_decimal(); + v = (int16_t) ao_cmd_decimal(); if (ao_cmd_status == ao_cmd_success) { ao_config.accel_zero_across = v; - v = ao_cmd_decimal(); + v = (int16_t) ao_cmd_decimal(); if (ao_cmd_status == ao_cmd_success) ao_config.accel_zero_through = v; } @@ -530,8 +542,12 @@ ao_config_apogee_delay_set(void) uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; + if (r > 255) { + ao_cmd_status = ao_cmd_lex_error; + return; + } _ao_config_edit_start(); - ao_config.apogee_delay = r; + ao_config.apogee_delay = (uint8_t) r; _ao_config_edit_finish(); } @@ -545,11 +561,15 @@ ao_config_apogee_lockout_show(void) static void ao_config_apogee_lockout_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; + if (r > 65535) { + ao_cmd_status = ao_cmd_lex_error; + return; + } _ao_config_edit_start(); - ao_config.apogee_lockout = r; + ao_config.apogee_lockout = (uint16_t) r; _ao_config_edit_finish(); } #endif @@ -591,7 +611,7 @@ ao_config_radio_rate_show(void) static void ao_config_radio_rate_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; if (AO_RADIO_RATE_MAX < r) { @@ -599,7 +619,7 @@ ao_config_radio_rate_set(void) return; } _ao_config_edit_start(); - ao_config.radio_rate = r; + ao_config.radio_rate = (uint8_t) r; _ao_config_edit_finish(); #if HAS_TELEMETRY ao_telemetry_reset_interval(); @@ -673,11 +693,11 @@ ao_config_ignite_mode_show(void) static void ao_config_ignite_mode_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); - ao_config.ignite_mode = r; + ao_config.ignite_mode = (uint8_t) r; _ao_config_edit_finish(); } #endif @@ -692,7 +712,7 @@ ao_config_pad_orientation_show(void) static void ao_config_pad_orientation_set(void) { - uint16_t r = ao_cmd_decimal() & 1; + uint8_t r = ao_cmd_decimal() & 1; if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); @@ -717,11 +737,11 @@ ao_config_radio_enable_show(void) static void ao_config_radio_enable_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); - ao_config.radio_enable = r; + ao_config.radio_enable = r != 0; _ao_config_edit_finish(); #if HAS_TELEMETRY && HAS_RADIO_RATE ao_telemetry_reset_interval(); @@ -771,11 +791,11 @@ ao_config_aprs_show(void) static void ao_config_aprs_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); - ao_config.aprs_interval = r; + ao_config.aprs_interval = (uint16_t) r; _ao_config_edit_finish(); ao_telemetry_reset_interval(); } @@ -789,11 +809,11 @@ ao_config_aprs_offset_show(void) static void ao_config_aprs_offset_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); - ao_config.aprs_offset = r; + ao_config.aprs_offset = (uint8_t) r; _ao_config_edit_finish(); ao_telemetry_reset_interval(); } @@ -842,7 +862,46 @@ ao_config_radio_power_set(void) #endif -#if HAS_BEEP_CONFIG +#if HAS_RADIO_10MW + +static void +ao_config_radio_10mw_show(void) +{ + printf ("Radio 10mw limit: %d\n", ao_config.radio_10mw); +} + +static void +ao_config_radio_10mw_set(void) +{ + uint32_t r = ao_cmd_decimal(); + if (ao_cmd_status != ao_cmd_success) + return; + _ao_config_edit_start(); + ao_config.radio_10mw = !!r; + _ao_config_edit_finish(); +} + +#endif + +static void +ao_config_report_feet_show(void) +{ + printf ("Report in feet: %d\n", ao_config.report_feet); +} + +static void +ao_config_report_feet_set(void) +{ + uint32_t r = ao_cmd_decimal(); + if (ao_cmd_status != ao_cmd_success) + return; + _ao_config_edit_start(); + ao_config.report_feet = !!r; + _ao_config_edit_finish(); +} + + +#if HAS_BEEP static void ao_config_beep_show(void) { @@ -852,11 +911,11 @@ ao_config_beep_show(void) static void ao_config_beep_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); - ao_config.mid_beep = r; + ao_config.mid_beep = (uint8_t) r; _ao_config_edit_finish(); } #endif @@ -873,11 +932,12 @@ ao_config_tracker_show(void) static void ao_config_tracker_set(void) { - uint16_t m, i; - m = ao_cmd_decimal(); + uint16_t m; + uint8_t i; + m = (uint16_t) ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; - i = ao_cmd_decimal(); + i = (uint8_t) ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); @@ -900,11 +960,11 @@ ao_config_pyro_time_show(void) static void ao_config_pyro_time_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); - ao_config.pyro_time = r; + ao_config.pyro_time = (uint16_t) r; _ao_config_edit_finish(); } #endif @@ -920,7 +980,7 @@ ao_config_aprs_ssid_show(void) static void ao_config_aprs_ssid_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; if (15 < r) { @@ -928,14 +988,14 @@ ao_config_aprs_ssid_set(void) return; } _ao_config_edit_start(); - ao_config.aprs_ssid = r; + ao_config.aprs_ssid = (uint8_t) r; _ao_config_edit_finish(); } static void ao_config_aprs_format_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); @@ -960,11 +1020,11 @@ ao_config_pad_box_show(void) static void ao_config_pad_box_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); - ao_config.pad_box = r; + ao_config.pad_box = (uint8_t) r; _ao_config_edit_finish(); } @@ -977,11 +1037,11 @@ ao_config_pad_idle_show(void) static void ao_config_pad_idle_set(void) { - uint16_t r = ao_cmd_decimal(); + uint32_t r = ao_cmd_decimal(); if (ao_cmd_status != ao_cmd_success) return; _ao_config_edit_start(); - ao_config.pad_idle = r; + ao_config.pad_idle = (uint8_t) r; _ao_config_edit_finish(); } #endif @@ -1066,7 +1126,7 @@ const struct ao_config_var ao_config_vars[] = { { "A \0APRS packet interval (0 disable)", ao_config_aprs_set, ao_config_aprs_show }, #endif -#if HAS_BEEP_CONFIG +#if HAS_BEEP { "b \0Beeper tone (freq = 1/2 (24e6/32) / beep", ao_config_beep_set, ao_config_beep_show }, #endif @@ -1088,6 +1148,12 @@ const struct ao_config_var ao_config_vars[] = { { "i \0Set idle timeout (0 disable)", ao_config_pad_idle_set, ao_config_pad_idle_show }, #endif +#if HAS_RADIO_10MW + { "p <0 no limit, 1 limit>\0Limit radio power to 10mW", + ao_config_radio_10mw_set, ao_config_radio_10mw_show }, +#endif + { "u <0 meters, 1 feet>\0Units to report height after landing", + ao_config_report_feet_set, ao_config_report_feet_show }, { "s\0Show", ao_config_show, 0 }, #if HAS_CONFIG_SAVE