diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index 299d11d7a..fa97a4edf 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -21,8 +21,36 @@ #include "opentx.h" #include "conversions.h" +void convertRadioData(int version) +{ + TRACE("convertRadioData(%d)", version); + +#if EEPROM_CONVERSIONS < 217 + if (version == 216) { + version = 217; + convertRadioData_216_to_217(g_eeGeneral); + } +#endif + +#if EEPROM_CONVERSIONS < 218 + if (version == 217) { + version = 218; + convertRadioData_217_to_218(g_eeGeneral); + } +#endif + +#if EEPROM_CONVERSIONS < 219 + if (version == 218) { + version = 219; + convertRadioData_218_to_219(g_eeGeneral); + } +#endif +} + void convertModelData(int version) { + TRACE("convertModelData(%d)", version); + #if EEPROM_CONVERSIONS < 217 if (version == 216) { version = 217; diff --git a/radio/src/storage/conversions/conversions.h b/radio/src/storage/conversions/conversions.h index 7605edfe9..25960af4c 100644 --- a/radio/src/storage/conversions/conversions.h +++ b/radio/src/storage/conversions/conversions.h @@ -18,6 +18,7 @@ * GNU General Public License for more details. */ +void convertRadioData(int version); void convertModelData(int version); bool eeConvert(); diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index 618d52887..2786bfb05 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -309,6 +309,8 @@ void convertModelData_218_to_219(ModelData &model) void convertRadioData_218_to_219(RadioData & settings) { + TRACE("Radio conversion from v218 to v219"); + settings.version = 219; settings.variant = EEPROM_VARIANT; diff --git a/radio/src/storage/conversions/datastructs_218.h b/radio/src/storage/conversions/datastructs_218.h index 2a34b3255..40249ec08 100644 --- a/radio/src/storage/conversions/datastructs_218.h +++ b/radio/src/storage/conversions/datastructs_218.h @@ -554,9 +554,9 @@ PACK(struct RadioData_v218 { int8_t timezone:5; uint8_t adjustRTC:1; uint8_t inactivityTimer; + uint8_t telemetryBaudrate:3; int8_t splashMode:3; int8_t hapticMode:2; - int8_t spare2:3; int8_t switchesDelay; uint8_t lightAutoOff; uint8_t templateSetup; // RETA order for receiver channels diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index bc5ce99e3..1186ada8b 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -72,6 +72,8 @@ const BitmapBuffer * ModelCell::getBuffer() void ModelCell::loadBitmap() { + uint8_t version; + PACK(struct { ModelHeader header; TimerData timers[MAX_TIMERS]; @@ -87,7 +89,7 @@ void ModelCell::loadBitmap() memcpy(&partialmodel.header, &g_model.header, sizeof(partialmodel)); } else { - error = readModel(modelFilename, (uint8_t *)&partialmodel.header, sizeof(partialmodel)); + error = readModel(modelFilename, (uint8_t *)&partialmodel.header, sizeof(partialmodel), &version); } buffer->clear(TEXT_BGCOLOR); diff --git a/radio/src/storage/sdcard_raw.cpp b/radio/src/storage/sdcard_raw.cpp index c0b129fc8..1128eee5c 100644 --- a/radio/src/storage/sdcard_raw.cpp +++ b/radio/src/storage/sdcard_raw.cpp @@ -101,16 +101,15 @@ const char * openFile(const char * fullpath, FIL * file, uint16_t * size, uint8_ return nullptr; } -const char * loadFile(const char * fullpath, uint8_t * data, uint16_t maxsize) +const char * loadFile(const char * fullpath, uint8_t * data, uint16_t maxsize, uint8_t * version) { FIL file; UINT read; uint16_t size; - uint8_t version; TRACE("loadFile(%s)", fullpath); - const char * err = openFile(fullpath, &file, &size, &version); + const char * err = openFile(fullpath, &file, &size, version); if (err) return err; @@ -121,26 +120,24 @@ const char * loadFile(const char * fullpath, uint8_t * data, uint16_t maxsize) return SDCARD_ERROR(result); } - if (version < EEPROM_VER) { - convertModelData(version); - } - f_close(&file); return nullptr; } -const char * readModel(const char * filename, uint8_t * buffer, uint32_t size) +const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version) { char path[256]; getModelPath(path, filename); - return loadFile(path, buffer, size); + return loadFile(path, buffer, size, version); } const char * loadModel(const char * filename, bool alarms) { + uint8_t version; + preModelLoad(); - const char * error = readModel(filename, (uint8_t *)&g_model, sizeof(g_model)); + const char * error = readModel(filename, (uint8_t *)&g_model, sizeof(g_model), &version); if (error) { TRACE("loadModel error=%s", error); } @@ -150,20 +147,34 @@ const char * loadModel(const char * filename, bool alarms) storageCheck(true); alarms = false; } + else if (version < EEPROM_VER) { + convertModelData(version); + } postModelLoad(alarms); return error; } -const char * loadRadioSettings() +const char * loadRadioSettings(const char * path) { - const char * error = loadFile(RADIO_SETTINGS_PATH, (uint8_t *)&g_eeGeneral, sizeof(g_eeGeneral)); + uint8_t version; + const char * error = loadFile(path, (uint8_t *)&g_eeGeneral, sizeof(g_eeGeneral), &version); if (error) { TRACE("loadRadioSettings error=%s", error); + return error; } - return error; + if (version < EEPROM_VER) { + convertRadioData(version); + } + + return nullptr; +} + +const char * loadRadioSettings() +{ + return loadRadioSettings(RADIO_SETTINGS_PATH); } const char * writeGeneralSettings() @@ -174,7 +185,7 @@ const char * writeGeneralSettings() void storageCheck(bool immediately) { if (storageDirtyMsk & EE_GENERAL) { - TRACE("eeprom write general"); + TRACE("Storage write general"); storageDirtyMsk -= EE_GENERAL; const char * error = writeGeneralSettings(); if (error) { @@ -183,7 +194,7 @@ void storageCheck(bool immediately) } if (storageDirtyMsk & EE_MODEL) { - TRACE("eeprom write model"); + TRACE("Storage write current model"); storageDirtyMsk -= EE_MODEL; const char * error = writeModel(); if (error) { diff --git a/radio/src/storage/sdcard_raw.h b/radio/src/storage/sdcard_raw.h index d5e71cdd9..15e3346a5 100644 --- a/radio/src/storage/sdcard_raw.h +++ b/radio/src/storage/sdcard_raw.h @@ -31,10 +31,13 @@ const char * openFile(const char * fullpath, FIL * file, uint16_t * size, uint8_ void getModelPath(char * path, const char * filename); -const char * readModel(const char * filename, uint8_t * buffer, uint32_t size); +const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version); const char * loadModel(const char * filename, bool alarms=true); const char * createModel(); +const char * loadRadioSettings(const char * path); +const char * loadRadioSettings(); + PACK(struct RamBackup { uint16_t size; uint8_t data[4094]; diff --git a/radio/src/tests/MODELS/model_22_horus.bin b/radio/src/tests/MODELS/model_22_horus.bin deleted file mode 100644 index 2ecad1c2f..000000000 Binary files a/radio/src/tests/MODELS/model_22_horus.bin and /dev/null differ diff --git a/radio/src/tests/MODELS/model_22_x10.bin b/radio/src/tests/MODELS/model_22_x10.bin new file mode 100644 index 000000000..6dc2ab39d Binary files /dev/null and b/radio/src/tests/MODELS/model_22_x10.bin differ diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index e49df0a43..9d2fab4d2 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -97,10 +97,20 @@ TEST(Conversions, ConversionX7From22) #endif #if defined(PCBX10) -TEST(Conversions, ConversionHorusFrom22) +TEST(X10Conversions, ConversionRadioFrom22) { simuFatfsSetPaths(TESTS_PATH "/tests/", TESTS_PATH "/tests/"); - loadModel("model_22_horus.bin"); + loadRadioSettings("/radio_22_x10.bin"); + + EXPECT_EQ(218, g_eeGeneral.version); + EXPECT_STRNEQ("en", g_eeGeneral.ttsLanguage); + EXPECT_STRNEQ("model1.bin", g_eeGeneral.currModelFilename); +} + +TEST(X10Conversions, ConversionModelFrom22) +{ + simuFatfsSetPaths(TESTS_PATH "/tests/", TESTS_PATH "/tests/"); + loadModel("model_22_x10.bin"); EXPECT_ZSTREQ("Test", g_model.header.name); EXPECT_EQ(80, g_model.mixData[0].weight); diff --git a/radio/src/tests/gtests.cpp b/radio/src/tests/gtests.cpp index d7b5a0a7c..77fa35317 100644 --- a/radio/src/tests/gtests.cpp +++ b/radio/src/tests/gtests.cpp @@ -134,16 +134,27 @@ uint16_t getAnalogValue(uint8_t index) return anaIn(index); } -static char _zchar2stringResult[200]; +static char _stringResult[200]; const char * zchar2string(const char * zstring, int size) { - if (size > (int)sizeof(_zchar2stringResult) ) { - return 0; + if (size > (int)sizeof(_stringResult) ) { + return nullptr; } - zchar2str(_zchar2stringResult, zstring, size); - return _zchar2stringResult; + zchar2str(_stringResult, zstring, size); + return _stringResult; } +const char * nchar2string(const char * string, int size) +{ + if (size > (int)sizeof(_stringResult) ) { + return nullptr; + } + strncpy(_stringResult, string, size); + _stringResult[size] = '\0'; + return _stringResult; +} + + int main(int argc, char **argv) { QCoreApplication app(argc, argv); diff --git a/radio/src/tests/gtests.h b/radio/src/tests/gtests.h index 596b71283..ab5c35abd 100644 --- a/radio/src/tests/gtests.h +++ b/radio/src/tests/gtests.h @@ -36,7 +36,9 @@ extern uint16_t anaInValues[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; void doMixerCalculations(); extern const char * zchar2string(const char * zstring, int size); +extern const char * nchar2string(const char * string, int size); #define EXPECT_ZSTREQ(c_string, z_string) EXPECT_STREQ(c_string, zchar2string(z_string, sizeof(z_string))) +#define EXPECT_STRNEQ(c_string, n_string) EXPECT_STREQ(c_string, nchar2string(n_string, sizeof(n_string))) #if defined(PCBTARANIS) || defined(PCBHORUS) #define RADIO_RESET() \