From 5db30ea7bcfa35fe36565ce438e97895aaa2238a Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 26 Aug 2019 08:36:31 +0200 Subject: [PATCH] More unit tests and unified target for all tests (#6661) * added general settings tests * fixed pre-219 switchUnlockState (CPN) * X7 radio settings tests * updated X10 model * patched TESTS_PATH to point directly at the complete tests path * fixed horus general settings switch conversion * cpn x10 general settings tests * fixed horus cpn import * use x10 model from otx file to ease editing with companion * added make targets "gtests" and "tests" gtests builds all the tests (radio & companion) tests builds and executes all the tests (radio & companion) * fixed companion tests cmake * fixed gtests-radio target * fixed commit tests * fixed converting LS & RS on X10 * fixed converting global functions on X10 * fixed source conversion on X10 * fixed throttle source on X10 * fixed throttle source on radio and companion * more checks and re-enabled Horus screenData copy * more tests (X10) * [X10] restore correct direction for RS & LS * [horus] convert "Value" widget source * fixed conversion of ModelHeader::bitmap length * added missing X10 radio tests to companion tests * fixed conversion of telemetry sources in logical switches * [horus] fixed potential crash * fixed "AND switch" conversion in logical switches --- CMakeLists.txt | 11 +++ .../src/firmwares/opentx/opentxeeprom.cpp | 49 +++++++--- companion/src/modeledit/setup.cpp | 20 ++-- companion/src/tests/CMakeLists.txt | 16 ++-- companion/src/tests/conversions.cpp | 89 +++++++++++++++-- radio/src/gui/480x272/model_setup.cpp | 5 +- .../conversions/conversions_218_219.cpp | 67 ++++++++++--- radio/src/storage/modelslist.cpp | 15 ++- .../targets/common/arm/stm32/adc_driver.cpp | 2 +- radio/src/tests/CMakeLists.txt | 35 +++++-- radio/src/tests/MODELS/model_22_x10.bin | Bin 9388 -> 0 bytes radio/src/tests/conversions.cpp | 90 +++++++++++++++--- radio/src/tests/eeprom_22_x7.bin | Bin 32768 -> 32768 bytes radio/src/tests/eeprom_22_x9d+.bin | Bin 32768 -> 32768 bytes radio/src/tests/lcd.cpp | 16 ++-- radio/src/tests/lcd_480x272.cpp | 2 +- radio/src/tests/model_22_x10.otx | Bin 0 -> 795 bytes radio/src/tests/radio_22_x10.bin | Bin 855 -> 0 bytes tools/commit-tests.sh | 28 +++--- 19 files changed, 340 insertions(+), 105 deletions(-) delete mode 100644 radio/src/tests/MODELS/model_22_x10.bin create mode 100644 radio/src/tests/model_22_x10.otx delete mode 100644 radio/src/tests/radio_22_x10.bin 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 2ecad1c2ff4c88b6c632a397f82a020ebe93b68f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9388 zcmc~VsW89gyF^9g_uDrN)B^zwj2MQca4=zt2{2=dNw8pwDQsh4Xi&fq9~Br4fzc2c z4S_)y0uO8kos&i#ga`p`^9NLcnv93R)zP zZ7mZ62ibZN8rc{)1Q5JY7A-axG#KJk0Uv#w2~FE2()30-K98MCuX1laYPve>RcdZ=)F)m<2w*ah@n>$;dL9 zk?|We}ee%x7WbWSHE}WXU&$3+NUG28dw^69vr~xhD$R YGxC54UJ$_tBKSds0Fc;xfW@I20CAR1`Tzg` delta 446 zcmZo@U}|V!5@2OuWM*(+VBlb|6kud%P@E|EhLwrIT7YwMBcpvi0|Vo&i4G}D|Nl=C zah%BP!O@h`oYI)mkg}0$5tHD;hDDEVOxnVDB{fe$pdJDI8QC}eXUhi)urSmoF)~l| zJ*e@KaU%0Xzln?sjle9QiA+$I_e5q83!xi{#Zk}70OW=-O=eihLnw5 ziWWc)hf3?W(w~5RQ3<4kD_)HYEVq}@@$Y{^V jI=K-@vQ0h+B-tl3GTAe7Om+m4oRb@w>Nh(uAE*HUtsE;| delta 137 zcmZo@U}|V!5@2Ou>Ii)eBA!Q@i zA|}C0k8Vsl$8;q%PeGs_0sNQ@SU3HzE(Yp@0OrY!jP{HylMez(*2#=a_Ka+k9f2hK Xz 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 0000000000000000000000000000000000000000..e81996c2b2a7ffcc3131d2850dc39ec594425b68 GIT binary patch literal 795 zcmWIWW@Zs#U|`^2NOYF+cfQ>HW)YAV&dk8T52S+}T|E8uixN{Z^YxN4^WOIE<~rmc z;F`awx5Kr|RYW(ZC8TNU-Wy$O=W1+j64>nPa?owD{DbtLyc;)(i0~}g91$M=w&ttl z(KC(J?Gq2K5!`C6b4XrAEb*+_HL=*=wW~S5U18PLTq2rzmg$*V@eRjUZy64)f6;m2 z=`y>sU*Fw!@;Y^X&Q%$WPp4mIU+(PJKYzS);zpH+SF@WZ{`ZKP9nSsql5cdS(#mC-qZP(MlW<)wvSiW>5fieK*sjEwsW$7dCt}Gsh7vI35Fm@e9nISf5i@-hkWmTSWkU_J8j=I<2!lm7dI+6&0MRw@Xh~AeCtow+*vGmVqMU~ z(wkNvX0r+guG#X=;p5Ursd4L;J}9kAof-6jE!DE(dz*-Wpy1otQQy@ygQtWtySV%o zdh;aW-iIiUphfHd*wyaJu;2_Z*>Ze;OoFi4GKa(8E?qEMFxM*Izrd&+gA1v+wCC){AXbo--?B z7y`T*nIIalCnlgNNB}Kqp=(BuI)u*iKqf{+qH9NYK0-Se(2Wqg5uOR~W@Q7ZU(6|Pfy&_jeZo&A=c@re+3)-29Z(97DaN%si+O8VI9YQqvMkb4nQg|A&Y%KSao3V*vmH CmKhBI 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