X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fao_config.c;h=a5796b03fdf7a6bea3fef5ebe933946984d1cdf5;hp=2673e472b066a23d556eb333582e88f3431e1401;hb=ba5dc35388d28c5769eaabc970c4d4b8c2c2ff9c;hpb=e4ba9bf4291bf17c777c8c3ef7c71e4a30b9947a diff --git a/src/ao_config.c b/src/ao_config.c index 2673e472..a5796b03 100644 --- a/src/ao_config.c +++ b/src/ao_config.c @@ -18,8 +18,8 @@ #include "ao.h" __xdata struct ao_config ao_config; -__xdata uint8_t ao_config_loaded; -__xdata uint8_t ao_config_dirty; +__pdata uint8_t ao_config_loaded; +__pdata uint8_t ao_config_dirty; __xdata uint8_t ao_config_mutex; #define AO_CONFIG_DEFAULT_MAIN_DEPLOY 250 @@ -27,13 +27,27 @@ __xdata uint8_t ao_config_mutex; #define AO_CONFIG_DEFAULT_CALLSIGN "N0CALL" #define AO_CONFIG_DEFAULT_ACCEL_ZERO_G 16000 #define AO_CONFIG_DEFAULT_APOGEE_DELAY 0 +#define AO_CONFIG_DEFAULT_IGNITE_MODE AO_IGNITE_MODE_DUAL +#define AO_CONFIG_DEFAULT_PAD_ORIENTATION AO_PAD_ORIENTATION_ANTENNA_UP +#if HAS_EEPROM +#ifndef USE_INTERNAL_FLASH +#error Please define USE_INTERNAL_FLASH +#endif +#endif +#if USE_INTERNAL_FLASH +#define AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX ao_storage_config +#else +#define AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX ((uint32_t) 192 * (uint32_t) 1024) +#endif #if HAS_EEPROM static void _ao_config_put(void) { ao_storage_setup(); + ao_storage_erase(ao_storage_config); ao_storage_write(ao_storage_config, &ao_config, sizeof (ao_config)); + ao_log_write_erase(0); ao_storage_flush(); } @@ -67,6 +81,10 @@ _ao_config_get(void) sizeof(AO_CONFIG_DEFAULT_CALLSIGN) - 1); ao_config.apogee_delay = AO_CONFIG_DEFAULT_APOGEE_DELAY; ao_config.radio_cal = ao_radio_cal; + ao_config.flight_log_max = AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX; + ao_config.ignite_mode = AO_CONFIG_DEFAULT_IGNITE_MODE; + ao_config.pad_orientation = AO_CONFIG_DEFAULT_PAD_ORIENTATION; + ao_config.radio_setting = ao_radio_cal; ao_config_dirty = 1; } if (ao_config.minor < AO_CONFIG_MINOR) { @@ -81,6 +99,16 @@ _ao_config_get(void) /* Fixups for minor version 3 */ if (ao_config.minor < 3) ao_config.radio_cal = ao_radio_cal; + /* Fixups for minor version 4 */ + if (ao_config.minor < 4) + ao_config.flight_log_max = AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX; + /* Fixupes for minor version 5 */ + if (ao_config.minor < 5) + ao_config.ignite_mode = AO_CONFIG_DEFAULT_IGNITE_MODE; + if (ao_config.minor < 6) + ao_config.pad_orientation = AO_CONFIG_DEFAULT_PAD_ORIENTATION; + if (ao_config.minor < 7) + ao_config.radio_setting = ao_config.radio_cal; ao_config.minor = AO_CONFIG_MINOR; ao_config_dirty = 1; } @@ -105,8 +133,9 @@ void ao_config_callsign_set(void) __reentrant { uint8_t c; - char callsign[AO_MAX_CALLSIGN + 1]; + static __xdata char callsign[AO_MAX_CALLSIGN + 1]; + memset(callsign, '\0', sizeof callsign); ao_cmd_white(); c = 0; while (ao_cmd_lex_c != '\n') { @@ -120,8 +149,6 @@ ao_config_callsign_set(void) __reentrant return; ao_mutex_get(&ao_config_mutex); _ao_config_get(); - while (c < AO_MAX_CALLSIGN + 1) - callsign[c++] = '\0'; memcpy(&ao_config.callsign, &callsign, AO_MAX_CALLSIGN + 1); ao_config_dirty = 1; @@ -179,6 +206,7 @@ ao_config_main_deploy_set(void) __reentrant ao_config_main_deploy_show(); } +#if HAS_ACCEL void ao_config_accel_calibrate_show(void) __reentrant { @@ -196,17 +224,17 @@ ao_config_accel_calibrate_auto(char *orientation) __reentrant int32_t accel_total; uint8_t cal_adc_ring; - printf("Orient %s and press a key...", orientation); + printf("Orient antenna %s and press a key...", orientation); flush(); (void) getchar(); puts("\r\n"); flush(); puts("Calibrating..."); flush(); i = ACCEL_CALIBRATE_SAMPLES; accel_total = 0; - cal_adc_ring = ao_adc_head; + cal_adc_ring = ao_sample_adc; while (i) { - ao_sleep(&ao_adc_ring); - while (i && cal_adc_ring != ao_adc_head) { + 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); i--; @@ -223,8 +251,8 @@ ao_config_accel_calibrate_set(void) __reentrant if (ao_cmd_status != ao_cmd_success) return; if (ao_cmd_lex_i == 0) { - up = ao_config_accel_calibrate_auto("antenna up"); - down = ao_config_accel_calibrate_auto("antenna down"); + up = ao_config_accel_calibrate_auto("up"); + down = ao_config_accel_calibrate_auto("down"); } else { up = ao_cmd_lex_i; ao_cmd_decimal(); @@ -233,7 +261,7 @@ ao_config_accel_calibrate_set(void) __reentrant down = ao_cmd_lex_i; } if (up >= down) { - printf("Invalid accel calibration: antenna up (%d) should be less than antenna down (%d)\n", + printf("Invalid accel: up (%d) down (%d)\n", up, down); return; } @@ -245,6 +273,7 @@ ao_config_accel_calibrate_set(void) __reentrant ao_mutex_put(&ao_config_mutex); ao_config_accel_calibrate_show(); } +#endif /* HAS_ACCEL */ void ao_config_apogee_delay_show(void) __reentrant @@ -283,17 +312,121 @@ ao_config_radio_cal_set(void) __reentrant return; ao_mutex_get(&ao_config_mutex); _ao_config_get(); - ao_config.radio_cal = ao_cmd_lex_u32; + ao_config.radio_setting = ao_config.radio_cal = ao_cmd_lex_u32; ao_config_dirty = 1; ao_mutex_put(&ao_config_mutex); ao_config_radio_cal_show(); } +#if HAS_EEPROM +void +ao_config_log_show(void) __reentrant +{ + printf("Max flight log: %d kB\n", (int16_t) (ao_config.flight_log_max >> 10)); +} + +void +ao_config_log_set(void) __reentrant +{ + uint16_t block = (uint16_t) (ao_storage_block >> 10); + uint16_t config = (uint16_t) (ao_storage_config >> 10); + + ao_cmd_decimal(); + if (ao_cmd_status != ao_cmd_success) + return; + if (ao_log_present()) + printf("Storage must be empty before changing log size\n"); + else if (block > 1024 && (ao_cmd_lex_i & (block - 1))) + printf("Flight log size must be multiple of %d kB\n", block); + else if (ao_cmd_lex_i > config) + printf("Flight log max %d kB\n", config); + else { + ao_mutex_get(&ao_config_mutex); + _ao_config_get(); + ao_config.flight_log_max = (uint32_t) ao_cmd_lex_i << 10; + ao_config_dirty = 1; + ao_mutex_put(&ao_config_mutex); + ao_config_log_show(); + } +} +#endif /* HAS_EEPROM */ + +#if HAS_IGNITE +void +ao_config_ignite_mode_show(void) __reentrant +{ + printf("Ignite mode: %d\n", ao_config.ignite_mode); +} + +void +ao_config_ignite_mode_set(void) __reentrant +{ + ao_cmd_decimal(); + if (ao_cmd_status != ao_cmd_success) + return; + ao_mutex_get(&ao_config_mutex); + _ao_config_get(); + ao_config.ignite_mode = ao_cmd_lex_i; + ao_config_dirty = 1; + ao_mutex_put(&ao_config_mutex); + ao_config_ignite_mode_show(); +} +#endif + +#if HAS_ACCEL +void +ao_config_pad_orientation_show(void) __reentrant +{ + printf("Pad orientation: %d\n", ao_config.pad_orientation); +} + +void +ao_config_pad_orientation_set(void) __reentrant +{ + ao_cmd_decimal(); + if (ao_cmd_status != ao_cmd_success) + return; + ao_mutex_get(&ao_config_mutex); + _ao_config_get(); + ao_cmd_lex_i &= 1; + if (ao_config.pad_orientation != ao_cmd_lex_i) { + uint16_t t; + t = ao_config.accel_plus_g; + ao_config.accel_plus_g = 0x7fff - ao_config.accel_minus_g; + ao_config.accel_minus_g = 0x7fff - t; + } + ao_config.pad_orientation = ao_cmd_lex_i; + ao_config_dirty = 1; + ao_mutex_put(&ao_config_mutex); + ao_config_pad_orientation_show(); +} +#endif + +void +ao_config_radio_setting_show(void) __reentrant +{ + printf("Radio setting: %ld\n", ao_config.radio_setting); +} + +void +ao_config_radio_setting_set(void) __reentrant +{ + ao_cmd_decimal(); + if (ao_cmd_status != ao_cmd_success) + return; + ao_mutex_get(&ao_config_mutex); + _ao_config_get(); + ao_config.radio_setting = ao_cmd_lex_u32; + ao_config_dirty = 1; + ao_mutex_put(&ao_config_mutex); + ao_config_radio_setting_show(); + ao_radio_recv_abort(); +} + struct ao_config_var { - char cmd; + __code char *str; void (*set)(void) __reentrant; void (*show)(void) __reentrant; - const char *help; }; static void @@ -307,31 +440,44 @@ ao_config_write(void) __reentrant; __code struct ao_config_var ao_config_vars[] = { #if HAS_ADC - { 'm', ao_config_main_deploy_set, ao_config_main_deploy_show, - "m Set height above launch for main deploy (in meters)" }, - { 'd', ao_config_apogee_delay_set, ao_config_apogee_delay_show, - "d Set apogee igniter delay (in seconds)" }, -#endif /* HAS_ADC */ - { 'r', ao_config_radio_channel_set, ao_config_radio_channel_show, - "r Set radio channel (freq = 434.550 + channel * .1)" }, - { 'c', ao_config_callsign_set, ao_config_callsign_show, - "c Set callsign broadcast in each packet (8 char max)" }, -#if HAS_ADC - { 'a', ao_config_accel_calibrate_set, ao_config_accel_calibrate_show, - "a <+g> <-g> Set accelerometer calibration (0 for auto)" }, + { "m \0Main deploy (in meters)", + ao_config_main_deploy_set, ao_config_main_deploy_show, }, + { "d \0Apogee delay (in seconds)", + ao_config_apogee_delay_set, ao_config_apogee_delay_show }, #endif /* HAS_ADC */ - { 'f', ao_config_radio_cal_set, ao_config_radio_cal_show, - "f Set radio calibration value (cal = rf/(xtal/2^16))" }, - { 's', ao_config_show, ao_config_show, - "s Show current config values" }, + { "r \0Radio channel (freq = 434.550 + chan * .1)", + ao_config_radio_channel_set, ao_config_radio_channel_show }, + { "c \0Callsign (8 char max)", + ao_config_callsign_set, ao_config_callsign_show }, +#if HAS_ACCEL + { "a <+g> <-g>\0Accel calib (0 for auto)", + ao_config_accel_calibrate_set,ao_config_accel_calibrate_show }, +#endif /* HAS_ACCEL */ + { "f \0Radio calib (cal = rf/(xtal/2^16))", + ao_config_radio_cal_set, ao_config_radio_cal_show }, +#if HAS_EEPROM + { "l \0Flight log size in kB", + ao_config_log_set, ao_config_log_show }, +#endif +#if HAS_IGNITE + { "i <0 dual, 1 apogee, 2 main>\0Set igniter mode", + ao_config_ignite_mode_set, ao_config_ignite_mode_show }, +#endif +#if HAS_ACCEL + { "o <0 antenna up, 1 antenna down>\0Set pad orientation", + ao_config_pad_orientation_set,ao_config_pad_orientation_show }, +#endif + { "R \0Radio freq control (freq = 434.550 * setting/cal)", + ao_config_radio_setting_set, ao_config_radio_setting_show }, + { "s\0Show", + ao_config_show, ao_config_show }, #if HAS_EEPROM - { 'w', ao_config_write, ao_config_write, - "w Write current values to eeprom" }, + { "w\0Write to eeprom", + ao_config_write, ao_config_write }, #endif - { '?', ao_config_help, ao_config_help, - "? Show available config variables" }, - { 0, ao_config_help, ao_config_help, - NULL }, + { "?\0Help", + ao_config_help, ao_config_help }, + { 0, 0, 0 } }; void @@ -345,8 +491,8 @@ ao_config_set(void) c = ao_cmd_lex_c; ao_cmd_lex(); func = 0; - for (cmd = 0; ao_config_vars[cmd].cmd != '\0'; cmd++) - if (ao_config_vars[cmd].cmd == c) { + for (cmd = 0; ao_config_vars[cmd].str != NULL; cmd++) + if (ao_config_vars[cmd].str[0] == c) { func = ao_config_vars[cmd].set; break; } @@ -360,8 +506,10 @@ static void ao_config_help(void) __reentrant { uint8_t cmd; - for (cmd = 0; ao_config_vars[cmd].cmd != '\0'; cmd++) - puts (ao_config_vars[cmd].help); + for (cmd = 0; ao_config_vars[cmd].str != NULL; cmd++) + printf("%-20s %s\n", + ao_config_vars[cmd].str, + ao_config_vars[cmd].str+1+strlen(ao_config_vars[cmd].str)); } static void @@ -370,7 +518,7 @@ ao_config_show(void) __reentrant uint8_t cmd; printf("Config version: %d.%d\n", ao_config.major, ao_config.minor); - for (cmd = 0; ao_config_vars[cmd].cmd != '\0'; cmd++) + for (cmd = 0; ao_config_vars[cmd].str != NULL; cmd++) if (ao_config_vars[cmd].show != ao_config_vars[cmd].set) (*ao_config_vars[cmd].show)(); } @@ -395,8 +543,8 @@ ao_config_write(void) __reentrant #endif __code struct ao_cmds ao_config_cmds[] = { - { 'c', ao_config_set, "c Set config variable (? for help, s to show)" }, - { '\0', ao_config_set, NULL }, + { ao_config_set, "c \0Set config variable (? for help, s to show)" }, + { 0, NULL }, }; void