diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index df03e4d3a..34d03f6c6 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -29,7 +29,7 @@ #include "storage/sdcard_yaml.h" #endif -#if !defined(EEPROM_RLC) +#if defined(STORAGE_MODELSLIST) static void drawProgressScreen(const char* filename, int progress, int total) { #if defined(COLORLCD) @@ -71,8 +71,7 @@ void convertBinRadioData(const char * path, int version) AU_NONE); // Load models list before converting - // TODO: force old .txt format - modelslist.load(); + modelslist.load(ModelsList::Format::txt); unsigned converted = 0; auto to_convert = modelslist.getModelsCount() + 1; @@ -82,16 +81,12 @@ void convertBinRadioData(const char * path, int version) #if STORAGE_CONVERSIONS < 220 if (version == 219) { - // TODO: alloc specific structure for destination convertRadioData_219_to_220(path); } #endif #if STORAGE_CONVERSIONS < 220 if (version == 220) { convertRadioData_220_to_221(path); - // g_eeGeneral.version = EEPROM_VER; - // storageDirty(EE_GENERAL); - // storageCheck(true); } #endif converted++; @@ -110,31 +105,16 @@ void convertBinRadioData(const char * path, int version) TRACE("converting '%s' (%d/%d)", filename, converted, to_convert); drawProgressScreen(filename, converted, to_convert); - error = readModelBin(filename, (uint8_t *)&g_model, sizeof(g_model), &model_version); + // read only the version number (size=0) + error = readModelBin(filename, nullptr, 0, &model_version); if (!error) { // TODO: error handling - convertBinModelData(filename, model_version); - -#if defined(SDCARD_YAML) - // patch model filename - const char* ext = strrchr(filename, '.'); - if ((ext != nullptr) && !strncmp(ext, MODELS_EXT, 4)) { - memcpy((void*)ext, (void*)YAML_EXT, sizeof(YAML_EXT) - 1); + error = convertBinModelData(filename, model_version); + if (error) { + // add error counter? + continue; } - // in case it's the current model, patch it as well - if (!strncmp(filename, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME)) { - strncpy(g_eeGeneral.currModelFilename, filename, LEN_MODEL_FILENAME+1); - } - // and write to YAML file - error = writeModelYaml(filename); -#else - char path[256]; - getModelPath(path, filename); - - error = writeFileBin(path, (uint8_t *)&g_model, sizeof(g_model)); -#endif - //TODO: what should be done with this error? } converted++; @@ -145,10 +125,8 @@ void convertBinRadioData(const char * path, int version) } } -#if defined(SDCARD_YAML) - modelslist.save(); - storageDirty(EE_GENERAL); - storageCheck(true); +#if defined(SDCARD_YAML) || defined(STORAGE_MODELSLIST) + modelslist.save(ModelsList::Format::yaml); #endif // reload models list @@ -156,23 +134,25 @@ void convertBinRadioData(const char * path, int version) modelslist.load(); } -void convertBinModelData(const char* filename, int version) +const char* convertBinModelData(const char* filename, int version) { TRACE("convertModelData(%s,%d)", filename); #if STORAGE_CONVERSIONS < 220 if (version == 219) { - convertModelData_219_to_220(filename); + const char* error = convertModelData_219_to_220(filename); + if (error) return error; version = 220; } #endif #if STORAGE_CONVERSIONS < 221 if (version == 220) { - convertModelData_220_to_221(filename); + const char* error = convertModelData_220_to_221(filename); + if (error) return error; version = 221; } #endif - // TODO: error handling + return nullptr; } #endif @@ -225,7 +205,6 @@ bool eeConvert() RAISE_ALERT(STR_STORAGE_WARNING, STR_EEPROM_CONVERTING, NULL, AU_NONE); // General Settings conversion - eeLoadGeneralSettingsData(); int version = conversionVersionStart; #if STORAGE_CONVERSIONS < 220 diff --git a/radio/src/storage/conversions/conversions.h b/radio/src/storage/conversions/conversions.h index 0b0692a38..e70560027 100644 --- a/radio/src/storage/conversions/conversions.h +++ b/radio/src/storage/conversions/conversions.h @@ -21,7 +21,7 @@ // Entry points for converting radio & model data void convertBinRadioData(const char * path, int version); -void convertBinModelData(const char * path, int version); +const char* convertBinModelData(const char * path, int version); bool eeConvert(); void eeConvertModel(int id, int version); diff --git a/radio/src/storage/conversions/conversions_219_220.cpp b/radio/src/storage/conversions/conversions_219_220.cpp index 836db8363..a045aafa6 100644 --- a/radio/src/storage/conversions/conversions_219_220.cpp +++ b/radio/src/storage/conversions/conversions_219_220.cpp @@ -344,7 +344,7 @@ const char* convertRadioData_219_to_220() auto rd_220 = reinterpret_cast(malloc(rd_size)); uint16_t read = eeLoadGeneralSettingsData(rd_220, rd_size); - if (read == rd_size) { + if (read >= rd_size - 1) { // 220 started with 1 byte less than 219 convertRadioData_219_to_220((void*)rd_220); eeWriteGeneralSettingData((uint8_t *)rd_220, rd_size, true); } else { diff --git a/radio/src/storage/conversions/conversions_220_221.cpp b/radio/src/storage/conversions/conversions_220_221.cpp index 988682de6..25abaed03 100644 --- a/radio/src/storage/conversions/conversions_220_221.cpp +++ b/radio/src/storage/conversions/conversions_220_221.cpp @@ -29,10 +29,24 @@ namespace yaml_conv_220 { const YamlNode* get_partialmodel_nodes(); }; -#if !defined(EEPROM_RLC) +#if defined(STORAGE_MODELSLIST) -static const char* convertData_220_to_221(const char* path, unsigned size, - const YamlNode* root_node) +void patchFilenameToYaml(char* str) +{ + constexpr unsigned bin_len = sizeof(MODELS_EXT) - 1; + constexpr unsigned yml_len = sizeof(YAML_EXT) - 1; + + // patch file extension + const char* ext = strrchr(path, '.'); + if (ext && (strlen(ext) == bin_len) && + !strncmp(ext, STR_MODELS_EXT, bin_len)) { + memcpy((void*)ext, (void*)STR_YAML_EXT, yml_len + 1); + } +} + +static const char* convertData_220_to_221( + const char* path, unsigned size, const YamlNode* root_node, + void (*patchBinary)(uint8_t*) = nullptr) { auto data = reinterpret_cast(malloc(size)); memset(data, 0, size); @@ -40,7 +54,9 @@ static const char* convertData_220_to_221(const char* path, unsigned size, uint8_t version; const char* error = loadFileBin(path, data, size, &version); if (!error) { - // TODO: patch file name into .yml + if (patchBinary) patchBinary(data); + + patchFilenameToYaml(path); error = writeFileYaml(path, root_node, data); } @@ -51,13 +67,22 @@ static const char* convertData_220_to_221(const char* path, unsigned size, const char* convertModelData_220_to_221(const char* path) { constexpr unsigned md_size = sizeof(bin_storage_220::ModelData); - return convertData_220_to_221(path, md_size, yaml_conv_220::get_modeldata_nodes()); + return convertData_220_to_221(path, md_size, + yaml_conv_220::get_modeldata_nodes()); +} + +static void patchCurrentModelFilename(uint8_t* data) +{ + auto rd = reinterpret_cast(data); + patchFilenameToYaml(rd->currModelFilename); } const char* convertRadioData_220_to_221(const char* path) { constexpr unsigned rd_size = sizeof(bin_storage_220::RadioData); - return convertData_220_to_221(path, rd_size, yaml_conv_220::get_radiodata_nodes()); + return convertData_220_to_221(path, rd_size, + yaml_conv_220::get_radiodata_nodes(), + patchCurrentModelFilename); } #else diff --git a/radio/src/storage/conversions/yaml/dataconstants_220.h b/radio/src/storage/conversions/yaml/dataconstants_220.h index aff0b1468..05c1dc337 100644 --- a/radio/src/storage/conversions/yaml/dataconstants_220.h +++ b/radio/src/storage/conversions/yaml/dataconstants_220.h @@ -74,7 +74,7 @@ #define STORAGE_NUM_SLIDERS 2 #endif -// #define NUM_XPOTS STORAGE_NUM_POTS +#define NUM_XPOTS STORAGE_NUM_POTS // #define NUM_TRIMS 4 // #define NUM_MOUSE_ANALOGS 0 #define STORAGE_NUM_MOUSE_ANALOGS 0 diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp index 384fa6755..1206b4a7d 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp @@ -25,6 +25,9 @@ #include +#include +#include + namespace yaml_conv_220 { #include "yaml_datastructs_funcs.cpp" diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 537a1a625..693b6d068 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -19,9 +19,6 @@ * GNU General Public License for more details. */ -#include -#include - #include "dataconstants_220.h" #include "datastructs_220.h" #include "myeeprom_220.h" diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index 1d9bef172..cf458b577 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -98,11 +98,24 @@ class ModelsList public: + enum class Format { + txt, +#if defined(SDCARD_YAML) + yaml, + yaml_txt, + load_default = yaml_txt, + save_default = yaml, +#else + load_default = txt, + save_default = txt, +#endif + }; + ModelsList(); ~ModelsList(); - bool load(); - void save(); + bool load(Format fmt = Format::load_default); + void save(Format fmt = Format::save_default); void clear(); const std::list & getCategories() const diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 41aae5c1f..8283bacb4 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -32,9 +32,12 @@ #include "yaml/yaml_datastructs.h" #if defined(EEPROM_RLC) + #include "storage/eeprom_common.h" #include "storage/eeprom_rlc.h" #endif +#include "storage/conversions/conversions.h" + const char * readYamlFile(const char* fullpath, const YamlParserCalls* calls, void* parser_ctx) { FIL file; @@ -68,7 +71,7 @@ const char * readYamlFile(const char* fullpath, const YamlParserCalls* calls, vo // Generic storage interface // -#if !defined(EEPROM_RLC) +#if defined(STORAGE_MODELSLIST) void storageCreateModelsList() { modelslist.clear(); @@ -97,14 +100,27 @@ const char * loadRadioSettings() { FILINFO fno; if (f_stat(RADIO_SETTINGS_YAML_PATH, &fno) != FR_OK) { -#if !defined(EEPROM_RLC) - return loadRadioSettingsBin(); -#else +#if defined(STORAGE_MODELSLIST) + uint8_t version; + const char* error = loadFileBin(RADIO_SETTINGS_PATH, nullptr, 0, &version); + if (error) { + TRACE("loadRadioSettings error=%s", error); + return error; + } + convertBinRadioData(RADIO_SETTINGS_PATH, version); +#elif defined(EEPROM_RLC) // Load from EEPROM - if (!eepromOpen() || !eeLoadGeneral(true)) { + uint8_t versions[3]; + uint16_t* variant = (uint16_t*)&versions[1]; + if (!eepromOpen() || (eeLoadGeneralSettingsData(versions, 3) != 3) + || (*variant != EEPROM_VARIANT)) { return "ERROR"; } - return nullptr; + g_eeGeneral.version = versions[0]; + g_eeGeneral.variant = *variant; + eeConvert(); +#else + #error "Unsupported conversion format" #endif }