diff --git a/CMakeLists.txt b/CMakeLists.txt index d22e65cc7..d61674a94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -193,4 +193,15 @@ add_subdirectory(${RADIO_SRC_DIRECTORY}) if(Qt5Core_FOUND AND NOT DISABLE_COMPANION) add_subdirectory(${COMPANION_SRC_DIRECTORY}) + add_custom_target(gtests DEPENDS gtests-radio gtests-companion) + add_custom_target(tests + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/gtests-radio && ${CMAKE_CURRENT_BINARY_DIR}/gtests-companion + DEPENDS gtests + ) +else() + add_custom_target(gtests DEPENDS gtests-radio) + add_custom_target(tests + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/gtests-radio + DEPENDS gtests + ) endif() diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index e59bfe0ef..48f678b93 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -40,7 +40,13 @@ inline int MAX_SWITCHES(Board::Type board, int version) return Boards::getCapability(board, Board::Switches); } -#define MAX_KNOBS(board, version) (IS_HORUS(board) ? 8 : 4) +inline int MAX_KNOBS(Board::Type board, int version) +{ + if (version >= 219 && IS_HORUS(board)) + return 8; + + return 4; +} inline int MAX_POTS(Board::Type board, int version) { @@ -56,6 +62,14 @@ inline int MAX_POTS_STORAGE(Board::Type board, int version) return Boards::getCapability(board, Board::PotsStorage); } +inline int MAX_SLIDERS_SLOTS(Board::Type board, int version) +{ + if (version >= 219 && IS_HORUS(board)) + return 8; + + return 4; +} + // bitsize of swconfig_t / 2 (see radio/src/datastructs.h) inline int MAX_SWITCH_SLOTS(Board::Type board, int version) { @@ -254,8 +268,13 @@ class SourcesConversionTable: public ConversionTable { } } - for (int i=0; i=CPN_MAX_STICKS+MAX_POTS_STORAGE(board, version)) + offset += 2; + + addConversion(RawSource(SOURCE_TYPE_STICK, i + offset), val++); } for (int i=0; i 3) + modelData.thrTraceSrc += 2; } OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type board, unsigned int version, unsigned int variant): @@ -2639,7 +2661,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type if (IS_STM32(board)) { if (version >= 218) { internalField.Append(new UnsignedField<4>(this, generalData.hw_uartMode)); - if (!IS_HORUS(board)) { + if (!IS_HORUS(board) || version < 219) { for (uint8_t i=0; i<4; i++) { internalField.Append(new UnsignedField<1>(this, generalData.sliderConfig[i])); } @@ -2669,17 +2691,18 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type } for (int i=0; i= 3)) + offset += 2; if (i < Boards::getCapability(board, Board::PotsStorage)) - internalField.Append(new UnsignedField<2>(this, generalData.potConfig[i])); + internalField.Append(new UnsignedField<2>(this, generalData.potConfig[i+offset])); else internalField.Append(new SpareBitsField<2>(this)); } - if (IS_HORUS(board)) { - for (int i=0; i<8; i++) { + if (IS_HORUS(board) && version >= 219) { + for (int i=0; i(this, generalData.sliderConfig[i])); else @@ -2703,7 +2726,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type if (IS_TARANIS_X9E(board)) internalField.Append(new SpareBitsField<64>(this)); // switchUnlockStates - else if (IS_TARANIS_X9D(board)) + else if (version >= 219 && IS_TARANIS_X9D(board)) internalField.Append(new SpareBitsField<32>(this)); // switchUnlockStates else if (IS_TARANIS(board)) internalField.Append(new SpareBitsField<16>(this)); // switchUnlockStates @@ -2721,11 +2744,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type for (int i=0; i(this, generalData.stickName[i], "Stick name")); } - for (int i=0; i(this, generalData.potName[i], "Pot name")); } for (int i=0; ithrTraceSrc = index; + model->thrTraceSrc = ui->throttleSource->currentData().toUInt(); emit modified(); } } @@ -1244,14 +1244,20 @@ void SetupPanel::populateThrottleSourceCB() Board::Type board = firmware->getBoard(); lock = true; ui->throttleSource->clear(); - ui->throttleSource->addItem(tr("THR")); - for (int i=0; ithrottleSource->addItem(firmware->getAnalogInputName(4+i), i); + ui->throttleSource->addItem(tr("THR"), 0); + + int idx=1; + for (int i=0; ithrottleSource->addItem(firmware->getAnalogInputName(4+i), idx); + } } - for (int i=0; igetCapability(Outputs); i++) { - ui->throttleSource->addItem(RawSource(SOURCE_TYPE_CH, i).toString(model, &generalSettings)); + for (int i=0; igetCapability(Outputs); i++, idx++) { + ui->throttleSource->addItem(RawSource(SOURCE_TYPE_CH, i).toString(model, &generalSettings), idx); } - ui->throttleSource->setCurrentIndex(model->thrTraceSrc); + + int thrTraceSrcIdx = ui->throttleSource->findData(model->thrTraceSrc); + ui->throttleSource->setCurrentIndex(thrTraceSrcIdx); lock = false; } diff --git a/companion/src/tests/CMakeLists.txt b/companion/src/tests/CMakeLists.txt index 2be8973fc..a7666afeb 100644 --- a/companion/src/tests/CMakeLists.txt +++ b/companion/src/tests/CMakeLists.txt @@ -4,8 +4,8 @@ find_path(GTEST_INCDIR gtest/gtest.h HINTS "${GTEST_ROOT}/include" DOC "Path to find_path(GTEST_SRCDIR src/gtest-all.cc HINTS "${GTEST_ROOT}" "${GTEST_ROOT}/src/gtest" DOC "Path of Google Test 'src' folder.") if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) - add_library(gtests-cpn-lib STATIC EXCLUDE_FROM_ALL ${GTEST_SRCDIR}/src/gtest-all.cc ) - target_include_directories(gtests-cpn-lib PUBLIC ${GTEST_INCDIR} ${GTEST_INCDIR}/gtest ${GTEST_SRCDIR}) + add_library(gtests-companion-lib STATIC EXCLUDE_FROM_ALL ${GTEST_SRCDIR}/src/gtest-all.cc ) + target_include_directories(gtests-companion-lib PUBLIC ${GTEST_INCDIR} ${GTEST_INCDIR}/gtest ${GTEST_SRCDIR}) add_definitions(-DGTESTS) set(TESTS_PATH ${COMPANION_SRC_DIRECTORY}/tests) set(RADIO_TESTS_PATH ${RADIO_SRC_DIRECTORY}/tests) @@ -14,8 +14,8 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) include_directories(${CMAKE_CURRENT_BINARY_DIR}) if(WIN32) - target_include_directories(gtests-cpn-lib PUBLIC ${WIN_INCLUDE_DIRS}) - target_link_libraries(gtests-cpn-lib PRIVATE ${WIN_LINK_LIBRARIES}) + target_include_directories(gtests-companion-lib PUBLIC ${WIN_INCLUDE_DIRS}) + target_link_libraries(gtests-companion-lib PRIVATE ${WIN_LINK_LIBRARIES}) endif(WIN32) file(GLOB TEST_SRC_FILES ${TESTS_PATH}/*.cpp) @@ -25,10 +25,10 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1 - add_executable(gtests-cpn EXCLUDE_FROM_ALL ${TEST_SRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/location.h) - add_dependencies(gtests-cpn gtests-cpn-lib) - target_link_libraries(gtests-cpn gtests-cpn-lib pthread Qt5::Core Qt5::Widgets ${CPN_COMMON_LIB}) - message(STATUS "Added optional gtests-cpn target") + add_executable(gtests-companion EXCLUDE_FROM_ALL ${TEST_SRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/location.h) + add_dependencies(gtests-companion gtests-companion-lib) + target_link_libraries(gtests-companion gtests-companion-lib simulation firmwares storage common) + message(STATUS "Added optional gtests-companion target") else() message(WARNING "WARNING: gtests target will not be available (check that GTEST_INCDIR, GTEST_SRCDIR, and Qt5Widgets are configured).") endif() diff --git a/companion/src/tests/conversions.cpp b/companion/src/tests/conversions.cpp index a6e7e57aa..0d6b34272 100644 --- a/companion/src/tests/conversions.cpp +++ b/companion/src/tests/conversions.cpp @@ -1,7 +1,9 @@ #include "gtests.h" #include "location.h" +#include "storage/otx.h" #include "storage/storage.h" #include "firmwares/opentx/opentxinterface.h" +#include "firmwares/customfunctiondata.h" TEST(Conversions, ConversionX9DPFrom22) { @@ -10,6 +12,16 @@ TEST(Conversions, ConversionX9DPFrom22) ASSERT_EQ(true, store.load(radioData)); + ASSERT_EQ(true, store.load(radioData)); + + const GeneralSettings& settings = radioData.generalSettings; + EXPECT_EQ(RawSwitch(SWITCH_TYPE_TELEMETRY,1), settings.customFn[0].swtch); + EXPECT_EQ(FuncLogs, settings.customFn[0].func); + EXPECT_EQ(20, settings.customFn[0].param); + + EXPECT_STREQ("Tes", settings.switchName[0]); + EXPECT_EQ(Board::SWITCH_3POS, settings.switchConfig[0]); + const ModelData& model = radioData.models[0]; EXPECT_STREQ("Test", model.name); EXPECT_EQ(RawSwitch(SWITCH_TYPE_SWITCH,SWITCH_SA0), model.timers[0].mode); @@ -37,6 +49,14 @@ TEST(Conversions, ConversionX7From22) ASSERT_EQ(true, store.load(radioData)); + const GeneralSettings& settings = radioData.generalSettings; + EXPECT_EQ(RawSwitch(SWITCH_TYPE_TELEMETRY,1), settings.customFn[0].swtch); + EXPECT_EQ(FuncLogs, settings.customFn[0].func); + EXPECT_EQ(20, settings.customFn[0].param); + + EXPECT_STREQ("Tes", settings.switchName[0]); + EXPECT_EQ(Board::SWITCH_3POS, settings.switchConfig[0]); + const ModelData& model = radioData.models[0]; EXPECT_STREQ("Test", model.name); EXPECT_EQ(PULSES_PXX_R9M, model.moduleData[1].protocol); @@ -83,23 +103,77 @@ bool loadFile(QByteArray & filedata, const QString & filename) return true; } -TEST(Conversions, ConversionHorusFrom22) +TEST(Conversions, ConversionX10From22) { - QByteArray modelByteArray; - ASSERT_EQ(true, loadFile(modelByteArray, RADIO_TESTS_PATH "/MODELS/model_22_horus.bin")); + QByteArray byteBuffer; + +#define USE_OTX + +#if defined(USE_OTX) + OtxFormat otx(RADIO_TESTS_PATH "/model_22_x10.otx"); + RadioData radio; + EXPECT_EQ(true, otx.load(radio)); + + const GeneralSettings& settings = radio.generalSettings; + const ModelData& model = radio.models[0]; +#else + ASSERT_EQ(true, loadFile(byteBuffer, RADIO_TESTS_PATH "/model_22_x10/RADIO/radio.bin")); + + GeneralSettings settings; + EXPECT_NE(nullptr, loadRadioSettingsFromByteArray(settings, byteBuffer)); +#endif + + EXPECT_EQ(100, settings.calibSpanNeg[9]); + EXPECT_EQ(500, settings.calibMid[9]); + EXPECT_EQ(900, settings.calibSpanPos[9]); + + EXPECT_EQ(200, settings.calibSpanNeg[10]); + EXPECT_EQ(400, settings.calibMid[10]); + EXPECT_EQ(600, settings.calibSpanPos[10]); + + EXPECT_EQ(-23, settings.vBatMin); + EXPECT_EQ(20, settings.speakerVolume); + EXPECT_STREQ("en", settings.ttsLanguage); + EXPECT_STREQ("model1.bin", settings.currModelFilename); + + EXPECT_EQ(RawSwitch(SWITCH_TYPE_TELEMETRY,1), settings.customFn[0].swtch); + EXPECT_EQ(FuncLogs, settings.customFn[0].func); + EXPECT_EQ(20, settings.customFn[0].param); + + EXPECT_EQ(RawSwitch(SWITCH_TYPE_ON), settings.customFn[1].swtch); + EXPECT_EQ(FuncVolume, settings.customFn[1].func); + EXPECT_EQ(RawSource(SOURCE_TYPE_STICK,4+5+1).toValue(), settings.customFn[1].param); // RS + + EXPECT_STREQ("Tes", settings.switchName[0]); + EXPECT_EQ(Board::SWITCH_3POS, settings.switchConfig[0]); + + EXPECT_STREQ("BT_X10", settings.bluetoothName); + EXPECT_STREQ("Default", settings.themeName); + +#if !defined(USE_OTX) + byteBuffer.clear(); + ASSERT_EQ(true, loadFile(byteBuffer, RADIO_TESTS_PATH "/model_22_x10/MODELS/model1.bin")); ModelData model; - ASSERT_NE(nullptr, loadModelFromByteArray(model, modelByteArray)); + ASSERT_NE(nullptr, loadModelFromByteArray(model, byteBuffer)); +#endif EXPECT_STREQ("Test", model.name); + EXPECT_EQ(0, model.noGlobalFunctions); + EXPECT_EQ(0, model.beepANACenter); EXPECT_EQ(80, model.mixData[0].weight); - EXPECT_EQ(RawSource(SOURCE_TYPE_PPM,0), model.mixData[4].srcRaw); - EXPECT_EQ(RawSwitch(SWITCH_TYPE_TELEMETRY,1), model.mixData[4].swtch); + EXPECT_EQ(RawSource(SOURCE_TYPE_MAX), model.mixData[2].srcRaw); // MAX + EXPECT_EQ(RawSource(SOURCE_TYPE_STICK,4+5), model.mixData[3].srcRaw); // LS + EXPECT_EQ(RawSource(SOURCE_TYPE_PPM,0), model.mixData[5].srcRaw); + EXPECT_EQ(RawSwitch(SWITCH_TYPE_TELEMETRY,1), model.mixData[5].swtch); EXPECT_EQ(900, model.limitData[0].max); // -100 EXPECT_EQ(80, model.expoData[0].weight); EXPECT_EQ(LS_FN_VPOS, model.logicalSw[0].func); - EXPECT_EQ(RawSource(SOURCE_TYPE_PPM,0).toValue(), model.logicalSw[0].val1); + EXPECT_EQ(RawSource(SOURCE_TYPE_PPM,0).toValue(), model.logicalSw[0].val1); // TR1 EXPECT_EQ(0, model.logicalSw[0].val2); + EXPECT_EQ(RawSource(SOURCE_TYPE_TELEMETRY,19*3).toValue(), model.logicalSw[1].val1); // TELE:20 + EXPECT_EQ(20, model.logicalSw[1].val2); + EXPECT_EQ(RawSwitch(SWITCH_TYPE_VIRTUAL,1).toValue(), model.logicalSw[1].andsw); EXPECT_EQ(HELI_SWASH_TYPE_120X, model.swashRingData.type); EXPECT_STREQ("Tes", model.flightModeData[0].name); EXPECT_EQ(10, model.flightModeData[0].gvars[0]); @@ -110,4 +184,5 @@ TEST(Conversions, ConversionHorusFrom22) EXPECT_STREQ("Tes", model.sensorData[0].label); EXPECT_EQ(10, model.sensorData[0].id); EXPECT_EQ(9, model.sensorData[0].instance); + EXPECT_EQ(5 + 2 + 3, model.thrTraceSrc); // CH3 } diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index afbeb3138..ac6f03bd0 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -748,7 +748,8 @@ bool menuModelSetup(event_t event) case ITEM_MODEL_SETUP_THROTTLE_TRACE: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TTRACE); - if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTraceSrc, NUM_POTS+NUM_SLIDERS+MAX_OUTPUT_CHANNELS); + // check if source is available (EXT1 & EXT2 on X10) + if (attr) CHECK_INCDEC_MODELVAR_ZERO_CHECK(event, g_model.thrTraceSrc, NUM_POTS+NUM_SLIDERS+MAX_OUTPUT_CHANNELS, isThrottleSourceAvailable); uint8_t idx = g_model.thrTraceSrc + MIXSRC_Thr; if (idx > MIXSRC_Thr) idx += 1; @@ -1666,4 +1667,4 @@ bool menuModelSetup(event_t event) } return true; -} \ No newline at end of file +} diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index 2786bfb05..43c9a3e9d 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -58,6 +58,11 @@ int convertSource_218_to_219(int source) source += 2; #endif +#if defined(PCBX10) + if ((source == MIXSRC_EXT1) || (source == MIXSRC_EXT2)) + source += 2; +#endif + return source; } @@ -111,6 +116,12 @@ void convertModelData_218_to_219(ModelData &model) memcpy(&oldModel, &model, sizeof(ModelData_v218)); ModelData_v219 & newModel = (ModelData_v219 &) model; +#if defined(PCBHORUS) + // 4 bytes more for the ModelHeader::bitmap + memclear(&newModel.header.bitmap[10], 4); + memcpy(newModel.timers, oldModel.timers, offsetof(ModelData_v218, mixData) - offsetof(ModelData_v218, timers)); +#endif + memclear(newModel.mixData, sizeof(ModelData_v219) - offsetof(ModelData_v219, mixData)); char name[LEN_MODEL_NAME+1]; @@ -147,9 +158,9 @@ void convertModelData_218_to_219(ModelData &model) uint8_t cstate = lswFamily(sw.func); if (cstate == LS_FAMILY_OFS || cstate == LS_FAMILY_COMP || cstate == LS_FAMILY_DIFF) { LogicalSwitchData & sw = newModel.logicalSw[i]; - sw.v1 = convertSource_218_to_219((uint8_t)sw.v1); + sw.v1 = convertSource_218_to_219(sw.v1); if (cstate == LS_FAMILY_COMP) { - sw.v2 = convertSource_218_to_219((uint8_t)sw.v2); + sw.v2 = convertSource_218_to_219(sw.v2); } } else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { @@ -159,6 +170,7 @@ void convertModelData_218_to_219(ModelData &model) else if (cstate == LS_FAMILY_EDGE) { sw.v1 = convertSwitch_218_to_219(sw.v1); } + sw.andsw = convertSwitch_218_to_219(sw.andsw); } for (uint8_t i=0; i 3) // 0=Thr, 1/2/3=Old 3 Pots, then Sliders + newModel.thrTraceSrc += 2; +#endif newModel.switchWarningState = oldModel.switchWarningState; #if !defined(COLORLCD) newModel.switchWarningEnable = oldModel.switchWarningEnable; @@ -279,9 +295,33 @@ void convertModelData_218_to_219(ModelData &model) #endif #if defined(PCBHORUS) -// memcpy(newModel.screenData, oldModel.screenData, -// sizeof(newModel.screenData) + -// sizeof(newModel.topbarData)) + memcpy(newModel.screenData, oldModel.screenData, + sizeof(newModel.screenData) + + sizeof(newModel.topbarData)); + + for (int screen=0; screen(g_eeGeneral.potsConfig, POT_WITHOUT_DETENT, 2, 2); // T12 comes with wrongly defined pot2 #endif +#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX7) || defined(PCBXLITE) || defined(PCBHORUS) + for (uint8_t i=0; i= 2019 // force re-calibration settings.chkSum = 0xFFFF; diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index 1186ada8b..e82cbd032 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -80,11 +80,6 @@ void ModelCell::loadBitmap() }) partialmodel; const char * error = NULL; - buffer = new BitmapBuffer(BMP_RGB565, MODELCELL_WIDTH, MODELCELL_HEIGHT); - if (buffer == NULL) { - return; - } - if (strncmp(modelFilename, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME) == 0) { memcpy(&partialmodel.header, &g_model.header, sizeof(partialmodel)); } @@ -92,6 +87,13 @@ void ModelCell::loadBitmap() error = readModel(modelFilename, (uint8_t *)&partialmodel.header, sizeof(partialmodel), &version); } + if ((modelName[0] == 0) && ! error) + setModelName(partialmodel.header.name); // resets buffer!!! + + buffer = new BitmapBuffer(BMP_RGB565, MODELCELL_WIDTH, MODELCELL_HEIGHT); + if (buffer == NULL) { + return; + } buffer->clear(TEXT_BGCOLOR); if (error) { @@ -99,9 +101,6 @@ void ModelCell::loadBitmap() buffer->drawBitmapPattern(5, 23, LBM_LIBRARY_SLOT, TEXT_COLOR); } else { - if (modelName[0] == 0) - setModelName(partialmodel.header.name); - char timer[LEN_TIMER_STRING]; buffer->drawSizedText(5, 2, modelName, LEN_MODEL_NAME, SMLSIZE|TEXT_COLOR); getTimerString(timer, 0); diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 1d06e25f0..36d0e5a60 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -23,7 +23,7 @@ #if defined(SIMU) // not needed #elif defined(PCBX10) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,1, -1, 1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,1, 1, -1}; #elif defined(PCBX9E) #if defined(HORUS_STICKS) const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,-1,-1,1, -1,1,-1, -1,-1,-1}; diff --git a/radio/src/tests/CMakeLists.txt b/radio/src/tests/CMakeLists.txt index bef6b072e..73e1b34b0 100644 --- a/radio/src/tests/CMakeLists.txt +++ b/radio/src/tests/CMakeLists.txt @@ -4,23 +4,35 @@ find_path(GTEST_INCDIR gtest/gtest.h HINTS "${GTEST_ROOT}/include" DOC "Path to find_path(GTEST_SRCDIR src/gtest-all.cc HINTS "${GTEST_ROOT}" "${GTEST_ROOT}/src/gtest" DOC "Path of Google Test 'src' folder.") if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) - add_library(gtests-lib STATIC EXCLUDE_FROM_ALL ${GTEST_SRCDIR}/src/gtest-all.cc ) - target_include_directories(gtests-lib PUBLIC ${GTEST_INCDIR} ${GTEST_INCDIR}/gtest ${GTEST_SRCDIR}) + add_library(gtests-radio-lib STATIC EXCLUDE_FROM_ALL ${GTEST_SRCDIR}/src/gtest-all.cc ) + target_include_directories(gtests-radio-lib PUBLIC ${GTEST_INCDIR} ${GTEST_INCDIR}/gtest ${GTEST_SRCDIR}) add_definitions(-DSIMU) add_definitions(-DGTESTS) remove_definitions(-DCLI) - set(TESTS_PATH ${RADIO_SRC_DIRECTORY}) + set(TESTS_PATH ${RADIO_SRC_DIRECTORY}/tests) configure_file(${RADIO_SRC_DIRECTORY}/tests/location.h.in ${CMAKE_CURRENT_BINARY_DIR}/location.h @ONLY) include_directories(${CMAKE_CURRENT_BINARY_DIR}) + if(PCB STREQUAL X12S OR PCB STREQUAL X10) + add_custom_command( + MAIN_DEPENDENCY ${TESTS_PATH}/model_22_x10.otx + OUTPUT ${TESTS_PATH}/model_22_x10/RADIO/radio.bin ${TESTS_PATH}/model_22_x10/RADIO/models.txt ${TESTS_PATH}/model_22_x10/MODELS/model1.bin + COMMAND mkdir -p model_22_x10 && cd model_22_x10 && unzip -o -DD ../model_22_x10.otx + WORKING_DIRECTORY ${TESTS_PATH} + ) + add_custom_target(x10-model-test-files + DEPENDS ${TESTS_PATH}/model_22_x10/RADIO/radio.bin ${TESTS_PATH}/model_22_x10/RADIO/models.txt ${TESTS_PATH}/model_22_x10/MODELS/model1.bin + ) + endif() + if(WIN32) - target_include_directories(gtests-lib PUBLIC ${WIN_INCLUDE_DIRS}) - target_link_libraries(gtests-lib PRIVATE ${WIN_LINK_LIBRARIES}) + target_include_directories(gtests-radio-lib PUBLIC ${WIN_INCLUDE_DIRS}) + target_link_libraries(gtests-radio-lib PRIVATE ${WIN_LINK_LIBRARIES}) endif(WIN32) if(SDL_FOUND AND SIMU_AUDIO) - target_include_directories(gtests-lib PUBLIC ${SDL_INCLUDE_DIR}) - target_link_libraries(gtests-lib PRIVATE ${SDL_LIBRARY}) + target_include_directories(gtests-radio-lib PUBLIC ${SDL_INCLUDE_DIR}) + target_link_libraries(gtests-radio-lib PRIVATE ${SDL_LIBRARY}) endif() foreach(FILE ${SRC}) @@ -38,9 +50,12 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1 - add_executable(gtests EXCLUDE_FROM_ALL ${TEST_SRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/location.h ${RADIO_SRC} ../targets/simu/simpgmspace.cpp ../targets/simu/simueeprom.cpp ../targets/simu/simufatfs.cpp) - add_dependencies(gtests ${FIRMWARE_DEPENDENCIES} gtests-lib) - target_link_libraries(gtests gtests-lib pthread Qt5::Core Qt5::Widgets) + add_executable(gtests-radio EXCLUDE_FROM_ALL ${TEST_SRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/location.h ${RADIO_SRC} ../targets/simu/simpgmspace.cpp ../targets/simu/simueeprom.cpp ../targets/simu/simufatfs.cpp) + add_dependencies(gtests-radio ${FIRMWARE_DEPENDENCIES} gtests-radio-lib) + if(PCB STREQUAL X12S OR PCB STREQUAL X10) + add_dependencies(gtests-radio x10-model-test-files) + endif() + target_link_libraries(gtests-radio gtests-radio-lib pthread Qt5::Core Qt5::Widgets) message(STATUS "Added optional gtests target") else() message(WARNING "WARNING: gtests target will not be available (check that GTEST_INCDIR, GTEST_SRCDIR, and Qt5Widgets are configured).") diff --git a/radio/src/tests/MODELS/model_22_x10.bin b/radio/src/tests/MODELS/model_22_x10.bin deleted file mode 100644 index 2ecad1c2f..000000000 Binary files a/radio/src/tests/MODELS/model_22_x10.bin and /dev/null differ diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index f2a044a9c..be5c3d96e 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -33,12 +33,26 @@ void loadEEPROMFile(const char * filename) #if defined(PCBX9DP) TEST(Conversions, ConversionX9DPFrom22) { - loadEEPROMFile(TESTS_PATH "/tests/eeprom_22_x9d+.bin"); + loadEEPROMFile(TESTS_PATH "/eeprom_22_x9d+.bin"); eepromOpen(); + eeLoadGeneralSettingsData(); + convertRadioData_218_to_219(g_eeGeneral); eeConvertModel(0, 218); eeLoadModel(0); + EXPECT_EQ(-30, g_eeGeneral.vBatMin); + EXPECT_EQ(8, g_eeGeneral.speakerVolume); + EXPECT_EQ('e', g_eeGeneral.ttsLanguage[0]); + EXPECT_EQ('n', g_eeGeneral.ttsLanguage[1]); + + EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); + EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); + EXPECT_EQ(20, g_eeGeneral.customFn[0].all.val); + + EXPECT_ZSTREQ("Tes", g_eeGeneral.switchNames[0]); + EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); + EXPECT_ZSTREQ("Test", g_model.header.name); EXPECT_EQ(TMRMODE_COUNT - 1 + SWSRC_SA0, g_model.timers[0].mode); EXPECT_EQ(80, g_model.mixData[0].weight); @@ -60,12 +74,26 @@ TEST(Conversions, ConversionX9DPFrom22) #if defined(PCBX7) TEST(Conversions, ConversionX7From22) { - loadEEPROMFile(TESTS_PATH "/tests/eeprom_22_x7.bin"); + loadEEPROMFile(TESTS_PATH "/eeprom_22_x7.bin"); eepromOpen(); + eeLoadGeneralSettingsData(); + convertRadioData_218_to_219(g_eeGeneral); eeConvertModel(0, 218); eeLoadModel(0); + EXPECT_EQ(-30, g_eeGeneral.vBatMin); + EXPECT_EQ(8, g_eeGeneral.speakerVolume); + EXPECT_EQ('e', g_eeGeneral.ttsLanguage[0]); + EXPECT_EQ('n', g_eeGeneral.ttsLanguage[1]); + + EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); + EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); + EXPECT_EQ(20, g_eeGeneral.customFn[0].all.val); + + EXPECT_ZSTREQ("Tes", g_eeGeneral.switchNames[0]); + EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); + EXPECT_ZSTREQ("Test", g_model.header.name); EXPECT_EQ(MODULE_TYPE_R9M_PXX1, g_model.moduleData[EXTERNAL_MODULE].type); EXPECT_EQ(MODULE_SUBTYPE_R9M_EU, g_model.moduleData[EXTERNAL_MODULE].subType); @@ -97,30 +125,61 @@ TEST(Conversions, ConversionX7From22) #endif #if defined(PCBX10) -TEST(X10Conversions, ConversionRadioFrom22) +TEST(Conversions, ConversionX10From22) { - simuFatfsSetPaths(TESTS_PATH "/tests/", TESTS_PATH "/tests/"); - loadRadioSettings("/radio_22_x10.bin"); + simuFatfsSetPaths(TESTS_PATH "/model_22_x10/", TESTS_PATH "/model_22_x10/"); + + loadRadioSettings("/RADIO/radio.bin"); + loadModel("model1.bin"); EXPECT_EQ(219, g_eeGeneral.version); + + EXPECT_EQ(100, g_eeGeneral.calib[9].spanNeg); + EXPECT_EQ(500, g_eeGeneral.calib[9].mid); + EXPECT_EQ(900, g_eeGeneral.calib[9].spanPos); + + EXPECT_EQ(200, g_eeGeneral.calib[10].spanNeg); + EXPECT_EQ(400, g_eeGeneral.calib[10].mid); + EXPECT_EQ(600, g_eeGeneral.calib[10].spanPos); + + EXPECT_EQ(-23, g_eeGeneral.vBatMin); + EXPECT_EQ(8, g_eeGeneral.speakerVolume); 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_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); + EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); + EXPECT_EQ(20, g_eeGeneral.customFn[0].all.val); + + EXPECT_EQ(SWSRC_ON, g_eeGeneral.customFn[1].swtch); + EXPECT_EQ(FUNC_VOLUME, g_eeGeneral.customFn[1].func); + EXPECT_EQ(MIXSRC_RS, g_eeGeneral.customFn[1].all.val); + + EXPECT_ZSTREQ("Tes", g_eeGeneral.switchNames[0]); + EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); + + EXPECT_ZSTREQ("BT_X10", g_eeGeneral.bluetoothName); + EXPECT_STREQ("Default", g_eeGeneral.themeName); + + EXPECT_EQ(WHITE, g_eeGeneral.themeData.options[0].unsignedValue); + EXPECT_EQ(RED, g_eeGeneral.themeData.options[1].unsignedValue); EXPECT_ZSTREQ("Test", g_model.header.name); + EXPECT_EQ(0, g_model.noGlobalFunctions); + EXPECT_EQ(0, g_model.beepANACenter); EXPECT_EQ(80, g_model.mixData[0].weight); - EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.mixData[4].srcRaw); - EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_model.mixData[4].swtch); + EXPECT_EQ(MIXSRC_MAX, g_model.mixData[2].srcRaw); // MAX + EXPECT_EQ(MIXSRC_LS, g_model.mixData[3].srcRaw); // LS + EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.mixData[5].srcRaw); + EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_model.mixData[5].swtch); EXPECT_EQ(-100, g_model.limitData[0].max); EXPECT_EQ(80, g_model.expoData[0].weight); EXPECT_EQ(LS_FUNC_VPOS, g_model.logicalSw[0].func); EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.logicalSw[0].v1); EXPECT_EQ(0, g_model.logicalSw[0].v2); + EXPECT_EQ(MIXSRC_FIRST_TELEM+19*3, g_model.logicalSw[1].v1); // TELE:20 + EXPECT_EQ(20, g_model.logicalSw[1].v2); + EXPECT_EQ(SWSRC_FIRST_LOGICAL_SWITCH, g_model.logicalSw[1].andsw); EXPECT_EQ(SWASH_TYPE_120X, g_model.swashR.type); EXPECT_ZSTREQ("Tes", g_model.flightModeData[0].name); EXPECT_EQ(10, g_model.flightModeData[0].gvars[0]); @@ -131,6 +190,13 @@ TEST(X10Conversions, ConversionModelFrom22) EXPECT_ZSTREQ("Tes", g_model.telemetrySensors[0].label); EXPECT_EQ(10, g_model.telemetrySensors[0].id); EXPECT_EQ(9, g_model.telemetrySensors[0].frskyInstance.physID); + EXPECT_EQ((NUM_POTS + NUM_SLIDERS + 3), g_model.thrTraceSrc); // CH3 + + EXPECT_STREQ("Layout2P1", g_model.screenData[0].layoutName); + EXPECT_STREQ("ModelBmp", g_model.screenData[0].layoutData.zones[0].widgetName); + EXPECT_STREQ("Value", g_model.topbarData.zones[0].widgetName); + EXPECT_EQ(MIXSRC_FIRST_TELEM, g_model.topbarData.zones[0].widgetData.options[0].unsignedValue); + EXPECT_EQ(MIXSRC_RS, g_model.screenData[0].layoutData.zones[2].widgetData.options[0].unsignedValue); } #endif diff --git a/radio/src/tests/eeprom_22_x7.bin b/radio/src/tests/eeprom_22_x7.bin index 50fe2108b..5f9381631 100644 Binary files a/radio/src/tests/eeprom_22_x7.bin and b/radio/src/tests/eeprom_22_x7.bin differ diff --git a/radio/src/tests/eeprom_22_x9d+.bin b/radio/src/tests/eeprom_22_x9d+.bin index 5a724a6d4..8145e55dc 100644 Binary files a/radio/src/tests/eeprom_22_x9d+.bin and b/radio/src/tests/eeprom_22_x9d+.bin differ diff --git a/radio/src/tests/lcd.cpp b/radio/src/tests/lcd.cpp index 8cacb0bbb..8375c6f63 100644 --- a/radio/src/tests/lcd.cpp +++ b/radio/src/tests/lcd.cpp @@ -84,7 +84,7 @@ bool checkScreenshot(const QString & test) QPainter p(&buffer); doPaint(p); QString filename(QString("%1_%2x%3.png").arg(test).arg(LCD_W).arg(LCD_H)); - QImage reference(TESTS_PATH "/tests/" + filename); + QImage reference(TESTS_PATH "/" + filename); if (buffer == reference) { return true; @@ -272,7 +272,7 @@ TEST(Lcd, BMPWrapping) { lcdClear(); uint8_t bitmap[2+40*40/2]; - lcdLoadBitmap(bitmap, TESTS_PATH "/tests/plane.bmp", 40, 40); + lcdLoadBitmap(bitmap, TESTS_PATH "/plane.bmp", 40, 40); lcdDrawBitmap(200, 0, bitmap); lcdDrawBitmap(200, 60, bitmap); lcdDrawBitmap(240, 60, bitmap); // x too big @@ -341,31 +341,31 @@ TEST(Lcd, lcdDrawBitmapLoadAndDisplay) // Test proper BMP files, they should display correctly { TestBuffer<1000> bitmap(BITMAP_BUFFER_SIZE(7, 32)); - EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/tests/4b_7x32.bmp", 7, 32) != NULL); + EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/4b_7x32.bmp", 7, 32) != NULL); bitmap.leakCheck(); lcdDrawBitmap(10, 2, bitmap.buffer()); } { TestBuffer<1000> bitmap(BITMAP_BUFFER_SIZE(6, 32)); - EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/tests/1b_6x32.bmp", 6, 32) != NULL); + EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/1b_6x32.bmp", 6, 32) != NULL); bitmap.leakCheck(); lcdDrawBitmap(20, 2, bitmap.buffer()); } { TestBuffer<1000> bitmap(BITMAP_BUFFER_SIZE(31, 31)); - EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/tests/4b_31x31.bmp", 31, 31) != NULL); + EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/4b_31x31.bmp", 31, 31) != NULL); bitmap.leakCheck(); lcdDrawBitmap(30, 2, bitmap.buffer()); } { TestBuffer<1000> bitmap(BITMAP_BUFFER_SIZE(39, 32)); - EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/tests/1b_39x32.bmp", 39, 32) != NULL); + EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/1b_39x32.bmp", 39, 32) != NULL); bitmap.leakCheck(); lcdDrawBitmap(70, 2, bitmap.buffer()); } { TestBuffer<1000> bitmap(BITMAP_BUFFER_SIZE(20, 20)); - EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/tests/4b_20x20.bmp", 20, 20) != NULL); + EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/4b_20x20.bmp", 20, 20) != NULL); bitmap.leakCheck(); lcdDrawBitmap(120, 2, bitmap.buffer()); } @@ -379,7 +379,7 @@ TEST(Lcd, lcdDrawBitmapLoadAndDisplay) } { TestBuffer<1000> bitmap(BITMAP_BUFFER_SIZE(10, 10)); - EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/tests/1b_39x32.bmp", 10, 10) == NULL) << "to small buffer"; + EXPECT_TRUE(lcdLoadBitmap(bitmap.buffer(), TESTS_PATH "/1b_39x32.bmp", 10, 10) == NULL) << "to small buffer"; bitmap.leakCheck(); } } diff --git a/radio/src/tests/lcd_480x272.cpp b/radio/src/tests/lcd_480x272.cpp index 486b601f2..769fccc5f 100644 --- a/radio/src/tests/lcd_480x272.cpp +++ b/radio/src/tests/lcd_480x272.cpp @@ -67,7 +67,7 @@ bool checkScreenshot_480x272(const QString & test) QPainter p(&buffer); doPaint_480x272(p); QString filename(QString("%1_%2x%3.png").arg(test).arg(LCD_W).arg(LCD_H)); - QImage reference(TESTS_PATH "/tests/" + filename); + QImage reference(TESTS_PATH "/" + filename); if (buffer == reference) { return true; diff --git a/radio/src/tests/model_22_x10.otx b/radio/src/tests/model_22_x10.otx new file mode 100644 index 000000000..e81996c2b Binary files /dev/null and b/radio/src/tests/model_22_x10.otx differ diff --git a/radio/src/tests/radio_22_x10.bin b/radio/src/tests/radio_22_x10.bin deleted file mode 100644 index 6dc2ab39d..000000000 Binary files a/radio/src/tests/radio_22_x10.bin and /dev/null differ diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index b4bd0f589..83b35fc70 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -66,7 +66,7 @@ if [[ " SKY9X ARM9X ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=SKY9X -DHELI=YES DLUA=YES -DTELEMETRY=FRSKY -DPPM_LIMITS_SYMETRICAL=YES -DVARIO=YES -DAUTOSWITCH=YES -DAUTOSOURCE=YES -DAUDIO=YES -DGPS=YES -DPPM_CENTER_ADJUSTABLE=YES -DFLIGHT_MODES=YES -DOVERRIDE_CHANNEL_FUNCTION=YES -DFRSKY_STICKS=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " AR9X ARM9X ALL " =~ " ${FLAVOR} " ]] ; then @@ -75,7 +75,7 @@ if [[ " AR9X ARM9X ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=AR9X -DHELI=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " 9XRPRO ARM9X ALL " =~ " ${FLAVOR} " ]] ; then @@ -84,7 +84,7 @@ if [[ " 9XRPRO ARM9X ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=9XRPRO -DHELI=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " X9LITE ALL " =~ " ${FLAVOR} " ]] ; then @@ -93,7 +93,7 @@ if [[ " X9LITE ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=X9LITE -DHELI=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " X7 ALL " =~ " ${FLAVOR} " ]] ; then @@ -102,7 +102,7 @@ if [[ " X7 ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=X7 -DHELI=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " XLITE ALL " =~ " ${FLAVOR} " ]] ; then @@ -111,7 +111,7 @@ if [[ " XLITE ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=XLITE -DHELI=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " XLITES ALL " =~ " ${FLAVOR} " ]] ; then @@ -120,7 +120,7 @@ if [[ " XLITES ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=XLITES -DHELI=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " X9D X9 ALL " =~ " ${FLAVOR} " ]] ; then @@ -129,7 +129,7 @@ if [[ " X9D X9 ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=X9D -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " X9D+ X9 ALL " =~ " ${FLAVOR} " ]] ; then @@ -138,7 +138,7 @@ if [[ " X9D+ X9 ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=X9D+ -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " X9D+2019 X9 ALL " =~ " ${FLAVOR} " ]] ; then @@ -147,7 +147,7 @@ if [[ " X9D+2019 X9 ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=X9D+ -DPCBREV=2019 -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " X9E X9 ALL " =~ " ${FLAVOR} " ]] ; then @@ -156,7 +156,7 @@ if [[ " X9E X9 ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=X9E -DHELI=YES -DLUA=YES -DGVARS=YES -DPPM_UNIT=PERCENT_PREC1 ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " X10 HORUS ALL " =~ " ${FLAVOR} " ]] ; then @@ -165,7 +165,7 @@ if [[ " X10 HORUS ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=X10 -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " X12S HORUS ALL " =~ " ${FLAVOR} " ]] ; then @@ -174,7 +174,7 @@ if [[ " X12S HORUS ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=X12S -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " T12 ALL " =~ " ${FLAVOR} " ]] ; then @@ -183,7 +183,7 @@ if [[ " T12 ALL " =~ " ${FLAVOR} " ]] ; then cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 -DHELI=YES -DGVARS=YES ${SRCDIR} make -j${CORES} ${FIRMARE_TARGET} make -j${CORES} libsimulator - make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} + make -j${CORES} gtests && ./gtests-radio ${TEST_OPTIONS} && ./gtests-companion ${TEST_OPTIONS} fi if [[ " DEFAULT ALL " =~ " ${FLAVOR} " ]] ; then