diff --git a/src/Comms/MockLink/CMakeLists.txt b/src/Comms/MockLink/CMakeLists.txt index 39830f21450..4832441c05b 100644 --- a/src/Comms/MockLink/CMakeLists.txt +++ b/src/Comms/MockLink/CMakeLists.txt @@ -29,6 +29,7 @@ set_source_files_properties(MockLink.Parameter.MetaData.json PROPERTIES QT_RESOU qt_add_resources(${CMAKE_PROJECT_NAME} mocklink_resources PREFIX "/MockLink" FILES + GenericMockLink.params PX4MockLink.params MockLink.General.MetaData.json MockLink.General.MetaData.json.xz diff --git a/src/Comms/MockLink/GenericMockLink.params b/src/Comms/MockLink/GenericMockLink.params new file mode 100644 index 00000000000..bed39dd5b1f --- /dev/null +++ b/src/Comms/MockLink/GenericMockLink.params @@ -0,0 +1,3 @@ +# Vehicle-Id Component-Id Name Value Type +1 1 TEST_UINT8 1 1 +1 1 TEST_UINT16 1 3 diff --git a/src/Comms/MockLink/MockLink.cc b/src/Comms/MockLink/MockLink.cc index aa048cf8523..4d2f26ff96f 100644 --- a/src/Comms/MockLink/MockLink.cc +++ b/src/Comms/MockLink/MockLink.cc @@ -397,6 +397,8 @@ void MockLink::_loadParams() } else { paramFile.setFileName(":/FirmwarePlugin/APM/Copter.OfflineEditing.params"); } + } else if (_firmwareType == MAV_AUTOPILOT_GENERIC) { + paramFile.setFileName(":/MockLink/GenericMockLink.params"); } else { paramFile.setFileName(":/MockLink/PX4MockLink.params"); } diff --git a/src/FactSystem/ParameterManager.cc b/src/FactSystem/ParameterManager.cc index 6a1de425db6..cdf269ba21d 100644 --- a/src/FactSystem/ParameterManager.cc +++ b/src/FactSystem/ParameterManager.cc @@ -489,16 +489,16 @@ bool ParameterManager::_mavlinkParamUnionToVariant(const mavlink_param_union_t & outValue = QVariant(paramUnion.param_float); return true; case MAV_PARAM_TYPE_UINT8: - outValue = QVariant(paramUnion.param_uint8); + outValue = QVariant(static_cast(paramUnion.param_uint8)); return true; case MAV_PARAM_TYPE_INT8: - outValue = QVariant(paramUnion.param_int8); + outValue = QVariant(static_cast(paramUnion.param_int8)); return true; case MAV_PARAM_TYPE_UINT16: - outValue = QVariant(paramUnion.param_uint16); + outValue = QVariant(static_cast(paramUnion.param_uint16)); return true; case MAV_PARAM_TYPE_INT16: - outValue = QVariant(paramUnion.param_int16); + outValue = QVariant(static_cast(paramUnion.param_int16)); return true; case MAV_PARAM_TYPE_UINT32: outValue = QVariant(paramUnion.param_uint32); diff --git a/test/FactSystem/ParameterManagerTest.cc b/test/FactSystem/ParameterManagerTest.cc index 13297321c0a..123aba4b89c 100644 --- a/test/FactSystem/ParameterManagerTest.cc +++ b/test/FactSystem/ParameterManagerTest.cc @@ -135,7 +135,8 @@ void ParameterManagerTest::_paramWriteNoAckRetry() // BAT1_V_CHARGED requires a vehicle reboot, so writing it pops the reboot // app message (debounce is reset per-test by the framework) expectAppMessage(QRegularExpression("Reboot vehicle for changes to take effect")); - _setParamWithFailureMode(MockLink::FailParamSetFirstAttemptNoAck, true /* expectSuccess */); + _setParamWithFailureMode(MockLink::FailParamSetFirstAttemptNoAck, true /* expectSuccess */, + QStringLiteral("BAT1_V_CHARGED"), MAV_AUTOPILOT_PX4); verifyExpectedLogMessage(); } @@ -145,11 +146,24 @@ void ParameterManagerTest::_paramWriteNoAckPermanent() // setRawValue), then the write-failed message (fires after retries exhaust) expectAppMessage(QRegularExpression("Reboot vehicle for changes to take effect")); expectAppMessage(QRegularExpression("Parameter write failed")); - _setParamWithFailureMode(MockLink::FailParamSetNoAck, false /* expectSuccess */); + _setParamWithFailureMode(MockLink::FailParamSetNoAck, false /* expectSuccess */, + QStringLiteral("BAT1_V_CHARGED"), MAV_AUTOPILOT_PX4); verifyExpectedLogMessage(); verifyExpectedLogMessage(); } +void ParameterManagerTest::_paramWriteUInt8() +{ + _setParamWithFailureMode(MockLink::FailParamSetNone, true /* expectSuccess */, + QStringLiteral("TEST_UINT8"), MAV_AUTOPILOT_GENERIC); +} + +void ParameterManagerTest::_paramWriteUInt16() +{ + _setParamWithFailureMode(MockLink::FailParamSetNone, true /* expectSuccess */, + QStringLiteral("TEST_UINT16"), MAV_AUTOPILOT_GENERIC); +} + void ParameterManagerTest::_paramReadFirstAttemptNoResponseRetry() { QVERIFY2(!_mockLink, "MockLink already connected"); @@ -206,7 +220,8 @@ void ParameterManagerTest::_paramWriteParamError() // setRawValue), then the write-failed message (fires on the PARAM_ERROR ack) expectAppMessage(QRegularExpression("Reboot vehicle for changes to take effect")); expectAppMessage(QRegularExpression("Parameter write failed")); - _setParamWithFailureMode(MockLink::FailParamSetParamError, false /* expectSuccess */); + _setParamWithFailureMode(MockLink::FailParamSetParamError, false /* expectSuccess */, + QStringLiteral("BAT1_V_CHARGED"), MAV_AUTOPILOT_PX4); verifyExpectedLogMessage(); verifyExpectedLogMessage(); } @@ -237,11 +252,17 @@ void ParameterManagerTest::_paramReadParamError() _disconnectMockLink(); } -void ParameterManagerTest::_setParamWithFailureMode(MockLink::ParamSetFailureMode_t failureMode, bool expectSuccess) +void ParameterManagerTest::_setParamWithFailureMode(MockLink::ParamSetFailureMode_t failureMode, bool expectSuccess, + const QString ¶mName, MAV_AUTOPILOT autopilot) { QVERIFY2(!_mockLink, "MockLink already connected"); + if (autopilot == MAV_AUTOPILOT_GENERIC) { + // Generic mock link has no metadata source; this warning is expected for generic autopilot + ignoreLogMessage("ComponentInformation.RequestMetaDataTypeStateMachine", QtWarningMsg, + QRegularExpression("failed to load metadata")); + } // Bring up a clean mock vehicle for each run - _connectMockLink(); + _connectMockLink(autopilot); QVERIFY(_mockLink); QVERIFY(_vehicle); _mockLink->setParamSetFailureMode(failureMode); @@ -250,8 +271,7 @@ void ParameterManagerTest::_setParamWithFailureMode(MockLink::ParamSetFailureMod ParameterManager* const paramManager = _vehicle->parameterManager(); QVERIFY(paramManager); QVERIFY(!_vehicle->parameterManager()->pendingWrites()); - // Use a parameter that exists in the mock PX4 set and has floating point range - Fact* const fact = paramManager->getParameter(MAV_COMP_ID_AUTOPILOT1, QStringLiteral("BAT1_V_CHARGED")); + Fact* const fact = paramManager->getParameter(MAV_COMP_ID_AUTOPILOT1, paramName); QVERIFY(fact); QSignalSpy rawValueChangedSpy(fact, &Fact::rawValueChanged); const QVariant originalValue = fact->rawValue(); @@ -261,7 +281,7 @@ void ParameterManagerTest::_setParamWithFailureMode(MockLink::ParamSetFailureMod : -std::numeric_limits::infinity(); const double maxValue = (metaData && metaData->rawMax().isValid()) ? metaData->rawMax().toDouble() : std::numeric_limits::infinity(); - const double step = 0.1; + const double step = fact->type() == FactMetaData::valueTypeFloat ? 0.1 : 1.0; auto adjustedValue = [&](double candidate) -> double { if (candidate > maxValue) { candidate = originalDouble - step; diff --git a/test/FactSystem/ParameterManagerTest.h b/test/FactSystem/ParameterManagerTest.h index e181867a928..b3cdedd1b0b 100644 --- a/test/FactSystem/ParameterManagerTest.h +++ b/test/FactSystem/ParameterManagerTest.h @@ -15,6 +15,8 @@ private slots: void _requestListMissingParamFail(); void _paramWriteNoAckRetry(); void _paramWriteNoAckPermanent(); + void _paramWriteUInt8(); + void _paramWriteUInt16(); void _paramReadFirstAttemptNoResponseRetry(); void _paramReadNoResponse(); void _paramWriteParamError(); @@ -29,5 +31,6 @@ private slots: private: void _noFailureWorker(MockConfiguration::FailureMode_t failureMode); - void _setParamWithFailureMode(MockLink::ParamSetFailureMode_t failureMode, bool expectSuccess); + void _setParamWithFailureMode(MockLink::ParamSetFailureMode_t failureMode, bool expectSuccess, + const QString ¶mName, MAV_AUTOPILOT autopilot); };