diff --git a/flash.c b/flash.c index aa69d5f..581d1db 100644 --- a/flash.c +++ b/flash.c @@ -64,7 +64,7 @@ void flash_unlock(void) FLASH->KEYR = 0xCDEF89AB; } -static uint32_t +uint32_t checksum(const void *start, size_t len) { uint32_t *p = (uint32_t*)start; diff --git a/nanovna.h b/nanovna.h index dc1d6d1..b141def 100644 --- a/nanovna.h +++ b/nanovna.h @@ -1419,6 +1419,7 @@ int caldata_save(uint16_t id); int config_save(void); int config_recall(void); setting_t * caldata_pointer(uint16_t id); +uint32_t checksum(const void *start, size_t len); void clear_all_config_prop_data(void); diff --git a/ui.c b/ui.c index b227658..dc133c3 100644 --- a/ui.c +++ b/ui.c @@ -3582,6 +3582,8 @@ enum { //#ifdef __SD_CARD_LOAD__ // FMT_CMD_FILE, //#endif + FMT_CFG_FILE, + FMT_PRS_FILE, }; // Save file extension @@ -3594,6 +3596,8 @@ static const char *file_ext[] = { //#ifdef __SD_CARD_LOAD__ // [FMT_CMD_FILE] = "cmd", //#endif + [FMT_CFG_FILE] = "cfg", + [FMT_PRS_FILE] = "prs", }; static void sa_save_file(char *name, uint8_t format); @@ -3619,6 +3623,9 @@ static const menuitem_t menu_store_preset[] = { { MT_ADV_CALLBACK, 0, "STORE AS\nSTARTUP",menu_store_preset_acb}, { MT_ADV_CALLBACK |MT_REPEATS, DATA_STARTS_REPEATS(1,4), "STORE %d", menu_store_preset_acb}, +#ifdef TINYSA4 + { MT_CALLBACK, FMT_PRS_FILE, "STORE\n"S_RARROW"SD", menu_sdcard_cb}, +#endif { MT_ADV_CALLBACK, 100,"FACTORY\nDEFAULTS",menu_store_preset_acb}, { MT_NONE, 0, NULL,menu_back} // next-> menu_back }; @@ -3627,6 +3634,10 @@ static const menuitem_t menu_load_preset[] = { { MT_ADV_CALLBACK, 0, "LOAD\nSTARTUP", menu_load_preset_acb}, { MT_ADV_CALLBACK|MT_REPEATS, DATA_STARTS_REPEATS(1,4), MT_CUSTOM_LABEL, menu_load_preset_acb}, +#ifdef __SD_FILE_BROWSER__ + { MT_CALLBACK, FMT_PRS_FILE, "LOAD FROM\n SD", menu_sdcard_browse_cb }, +#endif + { MT_SUBMENU, 0, "STORE" , menu_store_preset}, { MT_NONE, 0, NULL, menu_back} // next-> menu_back }; @@ -6724,6 +6735,23 @@ static void sa_save_file(char *name, uint8_t format) { } break; #endif + /* + * Dump preset to SD card as prs file + */ + case FMT_PRS_FILE: + { + uint16_t *src = (uint16_t*)&setting; + int total = sizeof(setting_t); + setting.magic = CONFIG_MAGIC; + setting.checksum = 0x12345678; + setting.checksum = checksum( + &setting, + // (sizeof (setting)) - sizeof setting.checksum + (void *)&setting.checksum - (void *) &setting + ); + res = f_write(fs_file, src, total, &size); + } + break; } f_close(fs_file); // shell_printf("Close = %d\r\n", res); diff --git a/vna_browser.c b/vna_browser.c index c3cb50f..15f192c 100644 --- a/vna_browser.c +++ b/vna_browser.c @@ -168,6 +168,29 @@ repeat: // else error = "Format err"; // } // break; + /* + * Load preset + */ + case FMT_PRS_FILE: + { + uint32_t magic; + char *src = (char*)&setting + sizeof(magic); + uint32_t total = sizeof(setting_t) - sizeof(magic); + // Compare file size and try read magic header, if all OK load it + if (fno.fsize == sizeof(setting) && f_read(fs_file, &magic, sizeof(magic), &size) == FR_OK && + magic == CONFIG_MAGIC && f_read(fs_file, src, total, &size) == FR_OK) { + + // TODO remove code duplication with flash.c + update_min_max_freq(); + update_frequencies(); + set_scale(setting.scale); + set_reflevel(setting.reflevel); + set_waterfall(); + set_level_meter(); + } + else error = "Format err"; + } + break; default: break; } f_close(fs_file);