diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index b9a3902c5..e161b5c66 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -986,14 +986,15 @@ if(ARCH STREQUAL ARM) set(CMAKE_ASM_COMPILE_OBJECT " -o ") set(COMMON_FLAGS "-mcpu=${MCU} -mthumb -fomit-frame-pointer -fverbose-asm -Wa,-ahlms=firmware.lst -O${OPT} -gdwarf-2 -DHSE_VALUE=${HSE_VALUE} -fno-exceptions -fdata-sections -ffunction-sections ${WARNING_FLAGS}") + set(COMMON_CPP_FLAGS "${COMMON_FLAGS} -std=gnu++11") set(CMAKE_C_FLAGS "${COMMON_FLAGS} -Wimplicit") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${COMMON_FLAGS} -Wimplicit -g") set(CMAKE_C_FLAGS_RELEASE "${COMMON_FLAGS} -Wimplicit") set(CMAKE_C_FLAGS_DEBUG "${COMMON_FLAGS} -Wimplicit -g") - set(CMAKE_CXX_FLAGS "${COMMON_FLAGS}") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${COMMON_FLAGS} -g") - set(CMAKE_CXX_FLAGS_RELEASE "${COMMON_FLAGS}") - set(CMAKE_CXX_FLAGS_DEBUG "${COMMON_FLAGS} -g") + set(CMAKE_CXX_FLAGS "${COMMON_CPP_FLAGS}") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${COMMON_CPP_FLAGS} -g") + set(CMAKE_CXX_FLAGS_RELEASE "${COMMON_CPP_FLAGS}") + set(CMAKE_CXX_FLAGS_DEBUG "${COMMON_CPP_FLAGS} -g") set(CMAKE_EXE_LINKER_FLAGS "-mcpu=${MCU} -mthumb -lm -T${RADIO_SRC_DIRECTORY}/${LINKER_SCRIPT} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections") if(PCB STREQUAL TARANIS) diff --git a/radio/src/audio_arm.cpp b/radio/src/audio_arm.cpp index 3d6369dd1..c9ebe286c 100644 --- a/radio/src/audio_arm.cpp +++ b/radio/src/audio_arm.cpp @@ -20,7 +20,8 @@ #include "opentx.h" #include - +#include + extern OS_MutexID audioMutex; const int16_t sineValues[] = diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 0ce92b40a..ad57fc549 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -1031,3 +1031,157 @@ PACK(struct RadioData { #undef EXTRA_GENERAL_FIELDS #undef THEME_DATA #undef NOBACKUP + + +#if !defined(BACKUP) +/* Compile time check to test structure size has not changed * + Changing the size of one of the eeprom structs may cause wrong data to + be loaded. Error out if the struct size changes. + This function tries not avoid checking or using the defines + other than the CPU arch and board type so changes in other + defines also trigger the struct size changes */ + +template +void check_size() { + static_assert(expectedSize == realSize, "struct size changed"); +} + +static inline void check_struct() +{ +#define CHKSIZE(x, y) check_size() +#define CHKTYPE(x, y) check_size() + +#if defined(VIRTUALINPUTS) + CHKSIZE(CurveRef, 2); +#endif + + /* Difference between Taranis/Horus is LEN_EXPOMIX_NAME */ + /* Sky9x does not have virtualinputs */ + + /* LEN_CFN_NAME is the difference in CustomFunctionData */ + +#if defined(PCBTARANIS) + CHKSIZE(MixData, 22); + CHKSIZE(ExpoData, 19); + CHKSIZE(LimitData, 13); + CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(CustomFunctionData, 11); + CHKSIZE(FlightModeData, 40); + CHKSIZE(TimerData, 16); + CHKSIZE(SwashRingData, 8); + CHKSIZE(FrSkyBarData, 6); + CHKSIZE(FrSkyLineData, 6); + CHKTYPE(union FrSkyScreenData, 24); + CHKSIZE(FrSkyTelemetryData, 106); + CHKSIZE(ModelHeader, 24); + CHKSIZE(CurveData, 4); + +#if defined(REV9E) + CHKSIZE(RadioData, 952); + CHKSIZE(ModelData, 6519); +#else + CHKSIZE(RadioData, 872); + CHKSIZE(ModelData, 6506); +#endif + +#elif defined(PCBHORUS) + CHKSIZE(MixData, 20); + CHKSIZE(ExpoData, 17); + CHKSIZE(LimitData, 13); + CHKSIZE(CustomFunctionData, 9); + CHKSIZE(FlightModeData, 40); + CHKSIZE(TimerData, 16); + CHKSIZE(SwashRingData, 8); + + CHKSIZE(FrSkyTelemetryData, 7); + CHKSIZE(ModelHeader, 27); + CHKSIZE(CurveData, 4); + CHKSIZE(RadioData, 835); + CHKSIZE(ModelData, 9335); + +#elif defined(PCBSKY9X) + CHKSIZE(MixData, 20); + CHKSIZE(ExpoData, 11); + CHKSIZE(LimitData, 5); + CHKSIZE(CustomFunctionData, 9); + CHKSIZE(FlightModeData, 38); + CHKSIZE(TimerData, 11); + CHKSIZE(SwashRingData, 3); + CHKSIZE(FrSkyBarData, 5); + CHKSIZE(FrSkyLineData, 2); + CHKSIZE(FrSkyTelemetryData, 90); + CHKSIZE(ModelHeader, 12); + CHKTYPE(CurveData, 2); + CHKSIZE(RadioData, 685); + CHKSIZE(ModelData, 4671); +#else + // Common for all variants + CHKSIZE(LimitData, 5); + CHKSIZE(SwashRingData, 3); + CHKSIZE(FrSkyBarData, 3); + CHKSIZE(FrSkyLineData, 2); + CHKSIZE(FrSkyTelemetryData, 43); + CHKSIZE(ModelHeader, 11); + CHKTYPE(CurveData, 1); + + // AVR +#if defined(CPUM2560) || defined(CPUM2561) + CHKSIZE(ExpoData, 5); + CHKSIZE(MixData, 10); +#else + CHKSIZE(MixData, 9); + CHKSIZE(ExpoData, 4); +#endif + +#if defined(CPUM2560) + CHKSIZE(CustomFunctionData, 4); + CHKSIZE(TimerData, 6); +#else + CHKSIZE(CustomFunctionData, 3); + CHKSIZE(TimerData, 3); +#endif + +#if defined(PCBSTD) + CHKSIZE(FlightModeData, 13); + CHKSIZE(RadioData, 84); +#else + CHKSIZE(FlightModeData, 30); + CHKSIZE(RadioData, 85); +#endif + +#if defined(PCBSTD) && defined (MAVLINK) + CHKSIZE(ModelData, 717); +#elif defined(PCBSTD) + CHKSIZE(ModelData, 756); +#elif defined(MAVLINK) + CHKSIZE(ModelData, 978); +#else + CHKSIZE(ModelData, 1017); +#endif + +#endif /* board specific ifdefs*/ + +#if defined(CPUARM) + CHKSIZE(LogicalSwitchData, 9); +#if !defined(COLORLCD) + CHKSIZE(FrSkyChannelData, 7); +#endif + CHKSIZE(TelemetrySensor, 13); + CHKSIZE(ModuleData,70); +#else + CHKSIZE(LogicalSwitchData, 3); + CHKSIZE(FrSkyChannelData, 6); + CHKSIZE(ModuleData, 38); +#endif + +#if !defined(PCBSTD) + CHKSIZE(GVarData, 7); +#endif + + CHKSIZE(FrSkyRSSIAlarm, 1); + CHKSIZE(TrainerData, 16); + +#undef CHKSIZE +#undef CHKSIZEUNION +} +#endif /* BACKUP */