From d8bda6b8bb1f8f071a1dfbb3aba711ba5d27a7a1 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 24 Oct 2021 00:22:17 +0200 Subject: [PATCH] Reworked flight mode gvar output & size checks --- .../yaml/yaml_datastructs_funcs.cpp | 32 +++++++++++-------- .../storage/yaml/yaml_datastructs_funcs.cpp | 10 ++++-- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index ef1c22b4f..5c2e8dd95 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -469,27 +469,31 @@ bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs) bool gvar_is_active(void* user, uint8_t* data, uint32_t bitoffs) { - gvar_t* gvar = (gvar_t*)(data + (bitoffs>>3UL)); - return *gvar != GVAR_MAX+1; + // TODO: no need to output 0 values for FM0 + gvar_t* gvar = (gvar_t*)(data + (bitoffs>>3UL)); + return *gvar != GVAR_MAX+1; } bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) { - uint32_t data_ofs = bitoffs >> 3UL; - if (data_ofs == offsetof(ModelData, flightModeData)) { - return !yaml_is_zero(data, bitoffs, sizeof(FlightModeData)*8); - } + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); - bool is_active = !yaml_is_zero(data, bitoffs, - (sizeof(FlightModeData) - - sizeof(FlightModeData::gvars))*8); + // FM0 defaults to all 0 + if (idx == 0) { + return !yaml_is_zero(data, bitoffs, sizeof(FlightModeData)); + } - FlightModeData* fmd = (FlightModeData*)(data + data_ofs); - for (uint8_t i=0; igvars[i] != GVAR_MAX+1; - } + // assumes gvars array is last + bool is_active = !yaml_is_zero(data, bitoffs, offsetof(FlightModeData, gvars)); - return is_active; + data += bitoffs >> 3UL; + FlightModeData* fmd = (FlightModeData*)(data); + for (uint8_t i=0; igvars[i] != GVAR_MAX+1; // FM0 -> default + } + + return is_active; } #define r_swtchWarn nullptr diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 0e7964460..0c896f93a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -69,20 +69,24 @@ namespace yaml_conv_220 { // static inline void check_yaml_funcs() { - check_size(); // offsetof(ModuleData, ppm) == 4 + static_assert(offsetof(ModuleData, ppm) == 4,""); + check_size(); + static_assert(MAX_GVARS == 9,""); #if defined(PCBHORUS) - // offsetof(ModelData, flightModeData) - // sizeof(FlightModeData::gvars) + static_assert(offsetof(FlightModeData, gvars) == 26,""); check_size(); check_size(); #elif defined(PCBNV14) + static_assert(offsetof(FlightModeData, gvars) == 22,""); check_size(); check_size(); #elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) + static_assert(offsetof(FlightModeData, gvars) == 18,""); check_size(); check_size(); check_size(); #else + static_assert(offsetof(FlightModeData, gvars) == 22,""); check_size(); check_size(); check_size();