diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index d64aad71e..d87f9998a 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -59,7 +59,9 @@ class ModelButton : public Button void load() { +#if defined(SDCARD_RAW) uint8_t version; +#endif PACK(struct { ModelHeader header; @@ -71,17 +73,25 @@ class ModelButton : public Button if (strncmp(modelCell->modelFilename, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME) == 0) { memcpy(&partialModel.header, &g_model.header, sizeof(partialModel)); +#if defined(SDCARD_RAW) version = EEPROM_VER; +#endif } else { +#if defined(SDCARD_RAW) error = - readModel(modelCell->modelFilename, (uint8_t *)&partialModel.header, - sizeof(partialModel), &version); + readModelBin(modelCell->modelFilename, (uint8_t *)&partialModel.header, + sizeof(partialModel), &version); +#else + error = readModel(modelCell->modelFilename, + (uint8_t *)&partialModel.header, sizeof(partialModel)); +#endif } if (!error) { if (modelCell->modelName[0] == '\0' && partialModel.header.name[0] != '\0') { - + +#if defined(SDCARD_RAW) if (version == 219) { int len = (int)sizeof(partialModel.header.name); char* str = partialModel.header.name; @@ -94,6 +104,7 @@ class ModelButton : public Button str[--len] = '\0'; } } +#endif modelCell->setModelName(partialModel.header.name); } } diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index 74455a71a..595c0812d 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -120,12 +120,11 @@ const char * createModel() } #endif -const char * loadModel(char * filename, bool alarms) +const char* loadModel(char* filename, bool alarms) { - uint8_t version; preModelLoad(); - const char * error = readModel(filename, (uint8_t *)&g_model, sizeof(g_model), &version); + const char* error = readModel(filename, (uint8_t*)&g_model, sizeof(g_model)); if (error) { TRACE("loadModel error=%s", error); @@ -139,15 +138,6 @@ const char * loadModel(char * filename, bool alarms) return error; } - // Conversions from EEPROM are done in batch when converting the radio file. - // It is not supported on a model by model base when loaded. -#if defined(STORAGE_CONVERSIONS) && !defined(EEPROM_RLC) - if (version < EEPROM_VER) { - convertBinModelData(filename, version); - } - // TODO: reload model afterwards -#endif - postModelLoad(alarms); return nullptr; } diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index 1a62a0e08..2606fab91 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -56,7 +56,7 @@ const char* writeFileYaml(const char* path, const YamlNode* root_node, uint8_t* void getModelPath(char * path, const char * filename); -const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version); +const char * readModel(const char * filename, uint8_t * buffer, uint32_t size); const char * loadModel(char * filename, bool alarms=true); const char * createModel(); const char * writeModel(); diff --git a/radio/src/storage/sdcard_raw.cpp b/radio/src/storage/sdcard_raw.cpp index 404bee8d5..34bc56be4 100644 --- a/radio/src/storage/sdcard_raw.cpp +++ b/radio/src/storage/sdcard_raw.cpp @@ -133,14 +133,34 @@ const char *loadFileBin(const char *fullpath, uint8_t *data, return nullptr; } -const char * readModelBin(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version) +#if defined(SDCARD_RAW) +const char* readModel(const char* filename, uint8_t* buffer, uint32_t size) +{ + uint8_t version = 0; + // Conversions from EEPROM are done in batch when converting the radio file. + // It is not supported on a model by model base when loaded. + const char *error = readModelBin(filename, buffer, size, &version); + if (error) return error; + +#if defined(STORAGE_CONVERSIONS) + if (version < EEPROM_VER) { + convertBinModelData(filename, version); + error = readModelBin(filename, buffer, size, &version); + } +#endif + + return error; +} +#endif + +const char *readModelBin(const char *filename, uint8_t *buffer, uint32_t size, + uint8_t *version) { char path[256]; getModelPath(path, filename); return loadFileBin(path, buffer, size, version); } - const char * loadRadioSettingsBin(const char * path) { uint8_t version; diff --git a/radio/src/storage/sdcard_raw.h b/radio/src/storage/sdcard_raw.h index 09d904a45..78a13ed2a 100644 --- a/radio/src/storage/sdcard_raw.h +++ b/radio/src/storage/sdcard_raw.h @@ -24,19 +24,25 @@ #include "FatFs/ff.h" -#if !defined(SDCARD_YAML) +#if defined(SDCARD_RAW) + #define writeModel writeModelBin #define loadRadioSettings loadRadioSettingsBin #define writeGeneralSettings writeGeneralSettingsBin -#define readModel readModelBin + +const char* readModel(const char* filename, uint8_t* buffer, uint32_t size); + #endif const char* loadRadioSettingsBin(); const char * writeGeneralSettingsBin(); -const char* openFileBin(const char * fullpath, FIL * file, uint16_t * size, uint8_t * version); +const char* openFileBin(const char* fullpath, FIL* file, uint16_t* size, + uint8_t* version); + const char* readModelBin(const char* filename, uint8_t* buffer, uint32_t size, uint8_t* version); -const char * writeModelBin(); + +const char* writeModelBin(); #endif diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 74ee5e1d2..47ab32671 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -189,7 +189,7 @@ const char * writeGeneralSettings() } -const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version) +const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t size) { // YAML reader TRACE("YAML model reader"); @@ -235,23 +235,19 @@ const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t siz // md->swashR.elevatorWeight = 100; } - *version = 255; // max version number return readYamlFile(path, YamlTreeWalker::get_parser_calls(), &tree); } -const char* readModel(const char* filename, uint8_t* buffer, uint32_t size, - uint8_t* version) +static const char _wrongExtentionError[] = "wrong file extension"; + +const char* readModel(const char* filename, uint8_t* buffer, uint32_t size) { const char* ext = strrchr(filename, '.'); - if (ext != nullptr) { - if (!strncmp(ext, YAML_EXT, 4)) { - return readModelYaml(filename, buffer, size, version); - } -#if !defined(EEPROM_RLC) - return readModelBin(filename, buffer, size, version); -#endif + if (!ext || strncmp(ext, YAML_EXT, 4) != 0) { + return _wrongExtentionError; } - return nullptr; + + return readModelYaml(filename, buffer, size); } const char * writeModelYaml(const char* filename)