mirror of
https://github.com/opentx/opentx.git
synced 2025-07-14 03:49:52 +03:00
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
This commit is contained in:
parent
274528ee1d
commit
5db30ea7bc
19 changed files with 340 additions and 105 deletions
|
@ -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()
|
||||
|
|
|
@ -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(board,version)+Boards::getCapability(board, Board::SlidersStorage)+Boards::getCapability(board, Board::MouseAnalogs)+MAX_GYRO_ANALOGS(board, version); i++) {
|
||||
addConversion(RawSource(SOURCE_TYPE_STICK, i), val++);
|
||||
for (int i=0; i<CPN_MAX_STICKS+MAX_POTS_STORAGE(board, version)+Boards::getCapability(board, Board::SlidersStorage)+Boards::getCapability(board, Board::MouseAnalogs)+MAX_GYRO_ANALOGS(board, version); i++) {
|
||||
|
||||
int offset = 0;
|
||||
if (version <= 218 && IS_HORUS(board) && i>=CPN_MAX_STICKS+MAX_POTS_STORAGE(board, version))
|
||||
offset += 2;
|
||||
|
||||
addConversion(RawSource(SOURCE_TYPE_STICK, i + offset), val++);
|
||||
}
|
||||
|
||||
for (int i=0; i<MAX_ROTARY_ENCODERS(board); i++) {
|
||||
|
@ -2475,6 +2494,9 @@ void OpenTxModelData::afterImport()
|
|||
}
|
||||
modelData.switchWarningStates = newSwitchWarningStates;
|
||||
}
|
||||
|
||||
if (version <= 218 && IS_HORUS_X10(board) && modelData.thrTraceSrc > 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<MAX_KNOBS(board, version); i++) {
|
||||
|
||||
int offset = 0;
|
||||
// 2 new pots for Horus from 219 on
|
||||
if (version <= 218 && IS_HORUS(board) && (i == 3))
|
||||
i += 2;
|
||||
if (version <= 218 && IS_HORUS(board) && (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<MAX_SLIDERS_SLOTS(board,version); i++) {
|
||||
if (i < Boards::getCapability(board, Board::SlidersStorage))
|
||||
internalField.Append(new UnsignedField<1>(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<CPN_MAX_STICKS; ++i) {
|
||||
internalField.Append(new ZCharField<3>(this, generalData.stickName[i], "Stick name"));
|
||||
}
|
||||
for (int i=0; i<Boards::getCapability(board, Board::PotsStorage); ++i) {
|
||||
if (version <= 218 && IS_HORUS(board) && (i == 3)) {
|
||||
// skip not yet existing pots (EXT1 / EXT2 for X10)
|
||||
i += 2;
|
||||
}
|
||||
for (int i=0; i<MAX_POTS_STORAGE(board, version); ++i) {
|
||||
internalField.Append(new ZCharField<3>(this, generalData.potName[i], "Pot name"));
|
||||
}
|
||||
for (int i=0; i<Boards::getCapability(board, Board::SlidersStorage); ++i) {
|
||||
|
|
|
@ -1184,7 +1184,7 @@ void SetupPanel::on_trimIncrement_currentIndexChanged(int index)
|
|||
void SetupPanel::on_throttleSource_currentIndexChanged(int index)
|
||||
{
|
||||
if (!lock) {
|
||||
model->thrTraceSrc = 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; i<getBoardCapability(board, Board::Pots)+getBoardCapability(board, Board::Sliders); i++) {
|
||||
ui->throttleSource->addItem(firmware->getAnalogInputName(4+i), i);
|
||||
ui->throttleSource->addItem(tr("THR"), 0);
|
||||
|
||||
int idx=1;
|
||||
for (int i=0; i<getBoardCapability(board, Board::Pots)+getBoardCapability(board, Board::Sliders); i++, idx++) {
|
||||
if (RawSource(SOURCE_TYPE_STICK,4+i).isAvailable(model,&generalSettings,board)) {
|
||||
ui->throttleSource->addItem(firmware->getAnalogInputName(4+i), idx);
|
||||
}
|
||||
for (int i=0; i<firmware->getCapability(Outputs); i++) {
|
||||
ui->throttleSource->addItem(RawSource(SOURCE_TYPE_CH, i).toString(model, &generalSettings));
|
||||
}
|
||||
ui->throttleSource->setCurrentIndex(model->thrTraceSrc);
|
||||
for (int i=0; i<firmware->getCapability(Outputs); i++, idx++) {
|
||||
ui->throttleSource->addItem(RawSource(SOURCE_TYPE_CH, i).toString(model, &generalSettings), idx);
|
||||
}
|
||||
|
||||
int thrTraceSrcIdx = ui->throttleSource->findData(model->thrTraceSrc);
|
||||
ui->throttleSource->setCurrentIndex(thrTraceSrcIdx);
|
||||
lock = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<MAX_SPECIAL_FUNCTIONS_218; i++) {
|
||||
|
@ -179,6 +191,10 @@ void convertModelData_218_to_219(ModelData &model)
|
|||
}
|
||||
|
||||
newModel.thrTraceSrc = oldModel.thrTraceSrc;
|
||||
#if defined(PCBX10)
|
||||
if (newModel.thrTraceSrc > 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<MAX_CUSTOM_SCREENS; screen++) {
|
||||
CustomScreenData& screenData = g_model.screenData[screen];
|
||||
if (screenData.layoutName[0] == '\0')
|
||||
continue;
|
||||
for (int zone=0; zone<MAX_LAYOUT_ZONES; zone++) {
|
||||
Layout::ZonePersistentData& zoneData = screenData.layoutData.zones[zone];
|
||||
if (strcmp("Value",zoneData.widgetName))
|
||||
continue;
|
||||
|
||||
ZoneOptionValue& option = zoneData.widgetData.options[0];
|
||||
option.unsignedValue = convertSource_218_to_219(option.unsignedValue);
|
||||
}
|
||||
}
|
||||
|
||||
for (int zone=0; zone<MAX_LAYOUT_ZONES; zone++) {
|
||||
Topbar::ZonePersistentData& zoneData = g_model.topbarData.zones[zone];
|
||||
if (strcmp("Value",zoneData.widgetName))
|
||||
continue;
|
||||
|
||||
ZoneOptionValue& option = zoneData.widgetData.options[0];
|
||||
option.unsignedValue = convertSource_218_to_219(option.unsignedValue);
|
||||
}
|
||||
|
||||
#else
|
||||
newModel.screensType = oldModel.frsky.screensType;
|
||||
memmove(&newModel.screens, &oldModel.frsky.screens, sizeof(newModel.screens));
|
||||
|
@ -320,13 +360,6 @@ void convertRadioData_218_to_219(RadioData & settings)
|
|||
memcpy(&oldSettings, &settings, sizeof(RadioData_v218));
|
||||
#endif
|
||||
|
||||
#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX7) || defined(PCBXLITE)
|
||||
for (uint8_t i=0; i<MAX_SPECIAL_FUNCTIONS_218; i++) {
|
||||
CustomFunctionData & cf = settings.customFn[i];
|
||||
cf.swtch = convertSwitch_218_to_219(cf.swtch);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCBX9D) || defined(PCBX9DP)
|
||||
// no bluetooth before PCBREV 2019
|
||||
settings.auxSerialMode = oldSettings.auxSerialMode;
|
||||
|
@ -376,6 +409,16 @@ void convertRadioData_218_to_219(RadioData & settings)
|
|||
g_eeGeneral.potsConfig = bfSet<uint32_t>(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<MAX_SPECIAL_FUNCTIONS_218; i++) {
|
||||
CustomFunctionData & cf = settings.customFn[i];
|
||||
cf.swtch = convertSwitch_218_to_219(cf.swtch);
|
||||
if (cf.func == FUNC_PLAY_VALUE || cf.func == FUNC_VOLUME || (IS_ADJUST_GV_FUNC(cf.func) && cf.all.mode == FUNC_ADJUST_GVAR_SOURCE)) {
|
||||
cf.all.val = convertSource_218_to_219(cf.all.val);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCBX9DP) && PCBREV >= 2019
|
||||
// force re-calibration
|
||||
settings.chkSum = 0xFFFF;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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).")
|
||||
|
|
Binary file not shown.
|
@ -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
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
BIN
radio/src/tests/model_22_x10.otx
Normal file
BIN
radio/src/tests/model_22_x10.otx
Normal file
Binary file not shown.
Binary file not shown.
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue