From c749fd868178726f1f869ca0813fb0f0c37a91f1 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 26 Oct 2021 22:13:37 +0200 Subject: [PATCH] X9D+ conversion unit test + fixes --- .../yaml/yaml_datastructs_funcs.cpp | 4 +-- radio/src/storage/yaml/yaml_bits.cpp | 27 +++++++++++++++- radio/src/storage/yaml/yaml_tree_walker.cpp | 15 ++++++--- radio/src/storage/yaml/yaml_tree_walker.h | 3 +- radio/src/tests/conversions.cpp | 31 ++++++++++++++++--- 5 files changed, 67 insertions(+), 13 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index bf7b84068..021acc826 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -465,11 +465,11 @@ bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) // FM0 defaults to all 0 if (idx == 0) { - return !yaml_is_zero(data, bitoffs, sizeof(FlightModeData)); + return !yaml_is_zero(data, bitoffs, sizeof(FlightModeData) << 3UL); } // assumes gvars array is last - bool is_active = !yaml_is_zero(data, bitoffs, offsetof(FlightModeData, gvars)); + bool is_active = !yaml_is_zero(data, bitoffs, offsetof(FlightModeData, gvars) << 3UL); data += bitoffs >> 3UL; FlightModeData* fmd = (FlightModeData*)(data); diff --git a/radio/src/storage/yaml/yaml_bits.cpp b/radio/src/storage/yaml/yaml_bits.cpp index 8031c6fdf..28a1d350d 100644 --- a/radio/src/storage/yaml/yaml_bits.cpp +++ b/radio/src/storage/yaml/yaml_bits.cpp @@ -88,9 +88,34 @@ uint32_t yaml_get_bits(uint8_t* src, uint32_t bit_ofs, uint32_t bits) return i; } +// if the start address is not aligned on a byte, +// checking max 32 bits is supported. bool yaml_is_zero(uint8_t* data, uint32_t bitoffs, uint32_t bits) { - return !yaml_get_bits(data + (bitoffs>>3UL), bitoffs & 0x7, bits); + data += bitoffs >> 3; + bitoffs &= 0x7; + + if (bitoffs) { + return !yaml_get_bits(data, bitoffs, bits); + } + + while (bits >= 32) { + if (*(uint32_t*)data) return false; + data += 4; + bits -= 32; + } + + while (bits >= 8) { + if (*data) return false; + data++; + bits -= 8; + } + + if (bits) { + return !yaml_get_bits(data, 0, bits); + } + + return true; } int32_t yaml_str2int_ref(const char*& val, uint8_t& val_len) diff --git a/radio/src/storage/yaml/yaml_tree_walker.cpp b/radio/src/storage/yaml/yaml_tree_walker.cpp index 5fb2b0e7d..d91e8b489 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.cpp +++ b/radio/src/storage/yaml/yaml_tree_walker.cpp @@ -29,10 +29,15 @@ #define MIN(a,b) (a < b ? a : b) -static void copy_string(char* dst, const char* src, uint8_t len) +static void copy_string(char* dst, uint8_t dst_len, const char* src, + uint8_t src_len) { - memcpy(dst,src,len); - dst[len] = '\0'; + if (src_len < dst_len) { + memcpy(dst, src, src_len); + dst[src_len] = '\0'; + } else { + memcpy(dst, src, dst_len); + } } uint32_t yaml_parse_enum(const struct YamlIdStr* choices, const char* val, uint8_t val_len) @@ -63,7 +68,7 @@ static void yaml_set_attr(void* user, uint8_t* ptr, uint32_t bit_ofs, if (node->type == YDT_STRING) { // assert(!bit_ofs); - copy_string((char*)ptr, val, MIN(val_len, node->size - 1)); + copy_string((char*)ptr, node->size >> 3, val, val_len); return; } @@ -112,7 +117,7 @@ static bool yaml_output_string(const char* str, uint32_t max_len, if (!wf(opaque, "\"", 1)) return false; - while(*str && max_len > 0) { + while(max_len > 0 && *str) { if (*str >= 0x20 && *str <= 0x7E) { if (!wf(opaque, str++, 1)) return false; max_len--; diff --git a/radio/src/storage/yaml/yaml_tree_walker.h b/radio/src/storage/yaml/yaml_tree_walker.h index 913f77350..b502c8dcc 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.h +++ b/radio/src/storage/yaml/yaml_tree_walker.h @@ -89,7 +89,8 @@ class YamlTreeWalker } inline bool isParentArrayElmt() { - return !empty() && stack[stack_level + 1].flags & FLAG_STATE_ARRAY_ELMT; + return (stack_level + 1 < NODE_STACK_DEPTH) + && stack[stack_level + 1].flags & FLAG_STATE_ARRAY_ELMT; } inline void setArrayElmt(bool set) { diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 4453d3b32..4c1cea56a 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -23,6 +23,14 @@ #include "storage/conversions/conversions.h" #include "location.h" +#if defined(EEPROM) || defined(EEPROM_RLC) +#include +#endif + +#if defined(SDCARD_YAML) +const char * loadRadioSettingsYaml(); +#endif + #if defined(EEPROM_SIZE) void loadEEPROMFile(const char * filename) { @@ -31,16 +39,25 @@ void loadEEPROMFile(const char * filename) } #endif -#if defined(PCBX9DP) && defined(EEPROM) +#if defined(PCBX9DP) && (defined(EEPROM) || defined(EEPROM_RLC)) TEST(Conversions, ConversionX9DPFrom23) { - loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+.bin"); +#if defined(SDCARD_YAML) + simuFatfsSetPaths(TESTS_BUILD_PATH "/model_x9dp/", TESTS_BUILD_PATH "/model_x9dp/"); +#endif + loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+.bin"); eepromOpen(); +#if defined(EEPROM) eeLoadGeneralSettingsData(); convertRadioData_219_to_220(g_eeGeneral); +#else + convertRadioData_219_to_220(); + convertRadioData_220_to_221(); + EXPECT_EQ(nullptr, loadRadioSettingsYaml()); +#endif eeConvertModel(0, 219); - eeLoadModel(0); + loadModel((uint8_t)0); EXPECT_EQ(-30, g_eeGeneral.vBatMin); EXPECT_EQ(8, g_eeGeneral.speakerVolume); @@ -88,10 +105,16 @@ TEST(Conversions, ConversionX9DPFrom23_2) loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+2.bin"); eepromOpen(); +#if defined(EEPROM) eeLoadGeneralSettingsData(); convertRadioData_219_to_220(g_eeGeneral); +#else + convertRadioData_219_to_220(); + convertRadioData_220_to_221(); + EXPECT_EQ(nullptr, loadRadioSettingsYaml()); +#endif eeConvertModel(6, 219); - eeLoadModel(6); + loadModel((uint8_t)6); EXPECT_EQ(710, g_eeGeneral.calib[0].spanNeg); EXPECT_EQ(944, g_eeGeneral.calib[0].mid);