Unverified Commit ccd2a1ed authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #8657 from DonLakeFlyer/SetRCToParam

Set RC To Param support
parents eac7e5db 17313b9b
...@@ -652,6 +652,7 @@ HEADERS += \ ...@@ -652,6 +652,7 @@ HEADERS += \
src/QmlControls/QmlObjectListModel.h \ src/QmlControls/QmlObjectListModel.h \
src/QmlControls/QGCGeoBoundingCube.h \ src/QmlControls/QGCGeoBoundingCube.h \
src/QmlControls/RCChannelMonitorController.h \ src/QmlControls/RCChannelMonitorController.h \
src/QmlControls/RCToParamDialogController.h \
src/QmlControls/ScreenToolsController.h \ src/QmlControls/ScreenToolsController.h \
src/QtLocationPlugin/QMLControl/QGCMapEngineManager.h \ src/QtLocationPlugin/QMLControl/QGCMapEngineManager.h \
src/Settings/ADSBVehicleManagerSettings.h \ src/Settings/ADSBVehicleManagerSettings.h \
...@@ -857,6 +858,7 @@ SOURCES += \ ...@@ -857,6 +858,7 @@ SOURCES += \
src/QmlControls/QmlObjectListModel.cc \ src/QmlControls/QmlObjectListModel.cc \
src/QmlControls/QGCGeoBoundingCube.cc \ src/QmlControls/QGCGeoBoundingCube.cc \
src/QmlControls/RCChannelMonitorController.cc \ src/QmlControls/RCChannelMonitorController.cc \
src/QmlControls/RCToParamDialogController.cc \
src/QmlControls/ScreenToolsController.cc \ src/QmlControls/ScreenToolsController.cc \
src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc \ src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc \
src/Settings/ADSBVehicleManagerSettings.cc \ src/Settings/ADSBVehicleManagerSettings.cc \
......
...@@ -159,6 +159,7 @@ ...@@ -159,6 +159,7 @@
<file alias="QGroundControl/Controls/RallyPointItemEditor.qml">src/PlanView/RallyPointItemEditor.qml</file> <file alias="QGroundControl/Controls/RallyPointItemEditor.qml">src/PlanView/RallyPointItemEditor.qml</file>
<file alias="QGroundControl/Controls/RallyPointMapVisuals.qml">src/PlanView/RallyPointMapVisuals.qml</file> <file alias="QGroundControl/Controls/RallyPointMapVisuals.qml">src/PlanView/RallyPointMapVisuals.qml</file>
<file alias="QGroundControl/Controls/RCChannelMonitor.qml">src/QmlControls/RCChannelMonitor.qml</file> <file alias="QGroundControl/Controls/RCChannelMonitor.qml">src/QmlControls/RCChannelMonitor.qml</file>
<file alias="QGroundControl/Controls/RCToParamDialog.qml">src/QmlControls/RCToParamDialog.qml</file>
<file alias="QGroundControl/Controls/RoundButton.qml">src/QmlControls/RoundButton.qml</file> <file alias="QGroundControl/Controls/RoundButton.qml">src/QmlControls/RoundButton.qml</file>
<file alias="QGroundControl/Controls/SectionHeader.qml">src/QmlControls/SectionHeader.qml</file> <file alias="QGroundControl/Controls/SectionHeader.qml">src/QmlControls/SectionHeader.qml</file>
<file alias="QGroundControl/Controls/SetupPage.qml">src/AutoPilotPlugins/Common/SetupPage.qml</file> <file alias="QGroundControl/Controls/SetupPage.qml">src/AutoPilotPlugins/Common/SetupPage.qml</file>
...@@ -278,6 +279,7 @@ ...@@ -278,6 +279,7 @@
<file alias="PlanView.SettingsGroup.json">src/Settings/PlanView.SettingsGroup.json</file> <file alias="PlanView.SettingsGroup.json">src/Settings/PlanView.SettingsGroup.json</file>
<file alias="QGCMapCircle.Facts.json">src/MissionManager/QGCMapCircle.Facts.json</file> <file alias="QGCMapCircle.Facts.json">src/MissionManager/QGCMapCircle.Facts.json</file>
<file alias="RallyPoint.FactMetaData.json">src/MissionManager/RallyPoint.FactMetaData.json</file> <file alias="RallyPoint.FactMetaData.json">src/MissionManager/RallyPoint.FactMetaData.json</file>
<file alias="RCToParamDialog.FactMetaData.json">src/QmlControls/RCToParamDialog.FactMetaData.json</file>
<file alias="RTK.SettingsGroup.json">src/Settings/RTK.SettingsGroup.json</file> <file alias="RTK.SettingsGroup.json">src/Settings/RTK.SettingsGroup.json</file>
<file alias="SpeedSection.FactMetaData.json">src/MissionManager/SpeedSection.FactMetaData.json</file> <file alias="SpeedSection.FactMetaData.json">src/MissionManager/SpeedSection.FactMetaData.json</file>
<file alias="StructureScan.SettingsGroup.json">src/MissionManager/StructureScan.SettingsGroup.json</file> <file alias="StructureScan.SettingsGroup.json">src/MissionManager/StructureScan.SettingsGroup.json</file>
......
...@@ -34,7 +34,7 @@ Column { ...@@ -34,7 +34,7 @@ Column {
property real _margins: ScreenTools.defaultFontPixelWidth / 2 property real _margins: ScreenTools.defaultFontPixelWidth / 2
property int _colMax: 4 property int _colMax: 4
property bool _settingsUnlocked: false property bool _settingsUnlocked: false
property var _valueDialogInstrumentValue: null property var instrumentValue: null
property var _rgFontSizes: [ ScreenTools.defaultFontPointSize, ScreenTools.smallFontPointSize, ScreenTools.mediumFontPointSize, ScreenTools.largeFontPointSize ] property var _rgFontSizes: [ ScreenTools.defaultFontPointSize, ScreenTools.smallFontPointSize, ScreenTools.mediumFontPointSize, ScreenTools.largeFontPointSize ]
property var _rgFontSizeRatios: [ 1, ScreenTools.smallFontPointRatio, ScreenTools.mediumFontPointRatio, ScreenTools.largeFontPointRatio ] property var _rgFontSizeRatios: [ 1, ScreenTools.smallFontPointRatio, ScreenTools.mediumFontPointRatio, ScreenTools.largeFontPointRatio ]
property real _doubleDescent: ScreenTools.defaultFontDescent * 2 property real _doubleDescent: ScreenTools.defaultFontDescent * 2
...@@ -79,8 +79,8 @@ Column { ...@@ -79,8 +79,8 @@ Column {
property int rowIndex property int rowIndex
onClicked: { onClicked: {
_valueDialogInstrumentValue = instrumentValue instrumentValue = instrumentValue
mainWindow.showPopupDialog(valueDialog, qsTr("Value Display"), StandardButton.Close) mainWindow.showPopupDialog(valueDialogComponent, { instrumentValue: instrumentValue })
} }
} }
} }
...@@ -243,7 +243,7 @@ Column { ...@@ -243,7 +243,7 @@ Column {
QGCButton { QGCButton {
Layout.fillHeight: true Layout.fillHeight: true
Layout.minimumHeight: ScreenTools.minTouchPixels Layout.preferredHeight: ScreenTools.minTouchPixels
Layout.preferredWidth: parent.width Layout.preferredWidth: parent.width
text: qsTr("+") text: qsTr("+")
onClicked: controller.appendColumn(rowRepeaterLayout.rowIndex) onClicked: controller.appendColumn(rowRepeaterLayout.rowIndex)
...@@ -251,7 +251,7 @@ Column { ...@@ -251,7 +251,7 @@ Column {
QGCButton { QGCButton {
Layout.fillHeight: true Layout.fillHeight: true
Layout.minimumHeight: ScreenTools.minTouchPixels Layout.preferredHeight: ScreenTools.minTouchPixels
Layout.preferredWidth: parent.width Layout.preferredWidth: parent.width
text: qsTr("-") text: qsTr("-")
enabled: index !== 0 || columnRepeater.count !== 1 enabled: index !== 0 || columnRepeater.count !== 1
...@@ -293,9 +293,15 @@ Column { ...@@ -293,9 +293,15 @@ Column {
} }
Component { Component {
id: valueDialog id: valueDialogComponent
QGCPopupDialog { QGCPopupDialog {
id: valueDisplayDialog
title: qsTr("Value Display")
buttons: StandardButton.Close
property var instrumentValue: dialogProperties.instrumentValue
GridLayout { GridLayout {
rowSpacing: _margins rowSpacing: _margins
columnSpacing: _margins columnSpacing: _margins
...@@ -304,52 +310,51 @@ Column { ...@@ -304,52 +310,51 @@ Column {
QGCCheckBox { QGCCheckBox {
id: valueCheckBox id: valueCheckBox
text: qsTr("Value") text: qsTr("Value")
checked: _valueDialogInstrumentValue.fact checked: instrumentValue.fact
onClicked: { onClicked: {
if (checked) { if (checked) {
_valueDialogInstrumentValue.setFact(_valueDialogInstrumentValue.factGroupNames[0], _valueDialogInstrumentValue.factValueNames[0]) instrumentValue.setFact(instrumentValue.factGroupNames[0], instrumentValue.factValueNames[0])
} else { } else {
_valueDialogInstrumentValue.clearFact() instrumentValue.clearFact()
} }
} }
} }
QGCComboBox { QGCComboBox {
model: _valueDialogInstrumentValue.factGroupNames model: instrumentValue.factGroupNames
sizeToContents: true sizeToContents: true
enabled: valueCheckBox.enabled enabled: valueCheckBox.enabled
onModelChanged: currentIndex = find(_valueDialogInstrumentValue.factGroupName) onModelChanged: currentIndex = find(instrumentValue.factGroupName)
Component.onCompleted: currentIndex = find(_valueDialogInstrumentValue.factGroupName) Component.onCompleted: currentIndex = find(instrumentValue.factGroupName)
onActivated: { onActivated: {
_valueDialogInstrumentValue.setFact(currentText, "") instrumentValue.setFact(currentText, "")
_valueDialogInstrumentValue.icon = "" instrumentValue.icon = ""
_valueDialogInstrumentValue.label = _valueDialogInstrumentValue.fact.shortDescription instrumentValue.label = instrumentValue.fact.shortDescription
} }
} }
QGCComboBox { QGCComboBox {
model: _valueDialogInstrumentValue.factValueNames model: instrumentValue.factValueNames
sizeToContents: true sizeToContents: true
enabled: valueCheckBox.enabled enabled: valueCheckBox.enabled
onModelChanged: currentIndex = _valueDialogInstrumentValue.fact ? find(_valueDialogInstrumentValue.factName) : -1 onModelChanged: currentIndex = instrumentValue.fact ? find(instrumentValue.factName) : -1
Component.onCompleted: currentIndex = _valueDialogInstrumentValue.fact ? find(_valueDialogInstrumentValue.factName) : -1 Component.onCompleted: currentIndex = instrumentValue.fact ? find(instrumentValue.factName) : -1
onActivated: { onActivated: {
_valueDialogInstrumentValue.setFact(_valueDialogInstrumentValue.factGroupName, currentText) instrumentValue.setFact(instrumentValue.factGroupName, currentText)
_valueDialogInstrumentValue.icon = "" instrumentValue.icon = ""
_valueDialogInstrumentValue.label = _valueDialogInstrumentValue.fact.shortDescription instrumentValue.label = instrumentValue.fact.shortDescription
} }
} }
QGCRadioButton { QGCRadioButton {
id: iconCheckBox id: iconCheckBox
text: qsTr("Icon") text: qsTr("Icon")
Component.onCompleted: checked = _valueDialogInstrumentValue.icon != "" Component.onCompleted: checked = instrumentValue.icon != ""
onClicked: { onClicked: {
_valueDialogInstrumentValue.label = "" instrumentValue.label = ""
_valueDialogInstrumentValue.icon = _valueDialogInstrumentValue.iconNames[0] instrumentValue.icon = instrumentValue.iconNames[0]
iconPickerDialogIcon = _valueDialogInstrumentValue.icon var updateFunction = function(icon){ instrumentValue.icon = icon }
iconPickerDialogUpdateIconFunction = function(icon){ _valueDialogInstrumentValue.icon = icon } mainWindow.showPopupDialog(iconPickerDialog, { iconNames: instrumentValue.iconNames, icon: instrumentValue.icon, updateIconFunction: updateFunction })
mainWindow.showPopupDialog(iconPickerDialog, qsTr("Select Icon"), StandardButton.Close)
} }
} }
...@@ -357,7 +362,7 @@ Column { ...@@ -357,7 +362,7 @@ Column {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
height: iconPositionCombo.height height: iconPositionCombo.height
width: height width: height
source: "/InstrumentValueIcons/" + (_valueDialogInstrumentValue.icon ? _valueDialogInstrumentValue.icon : _valueDialogInstrumentValue.iconNames[0]) source: "/InstrumentValueIcons/" + (instrumentValue.icon ? instrumentValue.icon : instrumentValue.iconNames[0])
sourceSize.height: height sourceSize.height: height
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
mipmap: true mipmap: true
...@@ -368,29 +373,28 @@ Column { ...@@ -368,29 +373,28 @@ Column {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
iconPickerDialogIcon = _valueDialogInstrumentValue.icon var updateFunction = function(icon){ instrumentValue.icon = icon }
iconPickerDialogUpdateIconFunction = function(icon){ _valueDialogInstrumentValue.icon = icon } mainWindow.showPopupDialog(iconPickerDialog, { iconNames: instrumentValue.iconNames, icon: instrumentValue.icon, updateIconFunction: updateFunction })
mainWindow.showPopupDialog(iconPickerDialog, qsTr("Select Icon"), StandardButton.Close)
} }
} }
} }
QGCComboBox { QGCComboBox {
id: iconPositionCombo id: iconPositionCombo
model: _valueDialogInstrumentValue.iconPositionNames model: instrumentValue.iconPositionNames
currentIndex: _valueDialogInstrumentValue.iconPosition currentIndex: instrumentValue.iconPosition
sizeToContents: true sizeToContents: true
onActivated: _valueDialogInstrumentValue.iconPosition = index onActivated: instrumentValue.iconPosition = index
enabled: iconCheckBox.checked enabled: iconCheckBox.checked
} }
QGCRadioButton { QGCRadioButton {
id: labelCheckBox id: labelCheckBox
text: qsTr("Label") text: qsTr("Label")
Component.onCompleted: checked = _valueDialogInstrumentValue.label != "" Component.onCompleted: checked = instrumentValue.label != ""
onClicked: { onClicked: {
_valueDialogInstrumentValue.icon = "" instrumentValue.icon = ""
_valueDialogInstrumentValue.label = _valueDialogInstrumentValue.fact ? _valueDialogInstrumentValue.fact.shortDescription : qsTr("Label") instrumentValue.label = instrumentValue.fact ? instrumentValue.fact.shortDescription : qsTr("Label")
} }
} }
...@@ -398,7 +402,7 @@ Column { ...@@ -398,7 +402,7 @@ Column {
id: labelTextField id: labelTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.columnSpan: 2 Layout.columnSpan: 2
text: _valueDialogInstrumentValue.label text: instrumentValue.label
enabled: labelCheckBox.checked enabled: labelCheckBox.checked
} }
...@@ -406,16 +410,16 @@ Column { ...@@ -406,16 +410,16 @@ Column {
QGCComboBox { QGCComboBox {
id: fontSizeCombo id: fontSizeCombo
model: _valueDialogInstrumentValue.fontSizeNames model: instrumentValue.fontSizeNames
currentIndex: _valueDialogInstrumentValue.fontSize currentIndex: instrumentValue.fontSize
sizeToContents: true sizeToContents: true
onActivated: _valueDialogInstrumentValue.fontSize = index onActivated: instrumentValue.fontSize = index
} }
QGCCheckBox { QGCCheckBox {
text: qsTr("Show Units") text: qsTr("Show Units")
checked: _valueDialogInstrumentValue.showUnits checked: instrumentValue.showUnits
onClicked: _valueDialogInstrumentValue.showUnits = checked onClicked: instrumentValue.showUnits = checked
} }
QGCLabel { text: qsTr("Range") } QGCLabel { text: qsTr("Range") }
...@@ -423,10 +427,10 @@ Column { ...@@ -423,10 +427,10 @@ Column {
QGCComboBox { QGCComboBox {
id: rangeTypeCombo id: rangeTypeCombo
Layout.columnSpan: 2 Layout.columnSpan: 2
model: _valueDialogInstrumentValue.rangeTypeNames model: instrumentValue.rangeTypeNames
currentIndex: _valueDialogInstrumentValue.rangeType currentIndex: instrumentValue.rangeType
sizeToContents: true sizeToContents: true
onActivated: _valueDialogInstrumentValue.rangeType = index onActivated: instrumentValue.rangeType = index
} }
Loader { Loader {
...@@ -436,8 +440,10 @@ Column { ...@@ -436,8 +440,10 @@ Column {
Layout.preferredWidth: item ? item.width : 0 Layout.preferredWidth: item ? item.width : 0
Layout.preferredHeight: item ? item.height : 0 Layout.preferredHeight: item ? item.height : 0
property var instrumentValue: valueDisplayDialog.instrumentValue
function updateSourceComponent() { function updateSourceComponent() {
switch (_valueDialogInstrumentValue.rangeType) { switch (instrumentValue.rangeType) {
case InstrumentValue.NoRangeInfo: case InstrumentValue.NoRangeInfo:
sourceComponent = undefined sourceComponent = undefined
break break
...@@ -456,7 +462,7 @@ Column { ...@@ -456,7 +462,7 @@ Column {
Component.onCompleted: updateSourceComponent() Component.onCompleted: updateSourceComponent()
Connections { Connections {
target: _valueDialogInstrumentValue target: instrumentValue
onRangeTypeChanged: rangeLoader.updateSourceComponent() onRangeTypeChanged: rangeLoader.updateSourceComponent()
} }
...@@ -465,12 +471,16 @@ Column { ...@@ -465,12 +471,16 @@ Column {
} }
} }
property string iconPickerDialogIcon
property var iconPickerDialogUpdateIconFunction
Component { Component {
id: iconPickerDialog id: iconPickerDialog
QGCPopupDialog { QGCPopupDialog {
property var iconNames: dialogProperties.iconNames
property string icon: dialogProperties.icon
property var updateIconFunction: dialogProperties.updateIconFunction
title: qsTr("Select Icon")
buttons: StandardButton.Close
GridLayout { GridLayout {
columns: 10 columns: 10
...@@ -478,14 +488,14 @@ Column { ...@@ -478,14 +488,14 @@ Column {
rowSpacing: 0 rowSpacing: 0
Repeater { Repeater {
model: _valueDialogInstrumentValue.iconNames model: iconNames
Rectangle { Rectangle {
height: ScreenTools.minTouchPixels height: ScreenTools.minTouchPixels
width: height width: height
color: currentSelection ? qgcPal.text : qgcPal.window color: currentSelection ? qgcPal.text : qgcPal.window
property bool currentSelection: iconPickerDialogIcon == modelData property bool currentSelection: icon == modelData
QGCColoredImage { QGCColoredImage {
anchors.centerIn: parent anchors.centerIn: parent
...@@ -501,8 +511,8 @@ Column { ...@@ -501,8 +511,8 @@ Column {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
iconPickerDialogIcon = modelData icon = modelData
iconPickerDialogUpdateIconFunction(modelData) updateIconFunction(modelData)
hideDialog() hideDialog()
} }
} }
...@@ -521,21 +531,21 @@ Column { ...@@ -521,21 +531,21 @@ Column {
height: childrenRect.height height: childrenRect.height
function updateRangeValue(index, text) { function updateRangeValue(index, text) {
var newValues = _valueDialogInstrumentValue.rangeValues var newValues = instrumentValue.rangeValues
newValues[index] = parseFloat(text) newValues[index] = parseFloat(text)
_valueDialogInstrumentValue.rangeValues = newValues instrumentValue.rangeValues = newValues
} }
function updateColorValue(index, color) { function updateColorValue(index, color) {
var newColors = _valueDialogInstrumentValue.rangeColors var newColors = instrumentValue.rangeColors
newColors[index] = color newColors[index] = color
_valueDialogInstrumentValue.rangeColors = newColors instrumentValue.rangeColors = newColors
} }
ColorDialog { ColorDialog {
id: colorPickerDialog id: colorPickerDialog
modality: Qt.ApplicationModal modality: Qt.ApplicationModal
currentColor: _valueDialogInstrumentValue.rangeColors[colorIndex] currentColor: instrumentValue.rangeColors[colorIndex]
onAccepted: updateColorValue(colorIndex, color) onAccepted: updateColorValue(colorIndex, color)
property int colorIndex: 0 property int colorIndex: 0
...@@ -560,13 +570,13 @@ Column { ...@@ -560,13 +570,13 @@ Column {
spacing: _margins spacing: _margins
Repeater { Repeater {
model: _valueDialogInstrumentValue.rangeValues.length model: instrumentValue.rangeValues.length
QGCButton { QGCButton {
width: ScreenTools.implicitTextFieldHeight width: ScreenTools.implicitTextFieldHeight
height: width height: width
text: qsTr("-") text: qsTr("-")
onClicked: _valueDialogInstrumentValue.removeRangeValue(index) onClicked: instrumentValue.removeRangeValue(index)
} }
} }
} }
...@@ -576,10 +586,10 @@ Column { ...@@ -576,10 +586,10 @@ Column {
spacing: _margins spacing: _margins
Repeater { Repeater {
model: _valueDialogInstrumentValue.rangeValues.length model: instrumentValue.rangeValues.length
QGCTextField { QGCTextField {
text: _valueDialogInstrumentValue.rangeValues[index] text: instrumentValue.rangeValues[index]
onEditingFinished: updateRangeValue(index, text) onEditingFinished: updateRangeValue(index, text)
} }
} }
...@@ -588,12 +598,12 @@ Column { ...@@ -588,12 +598,12 @@ Column {
Column { Column {
spacing: _margins spacing: _margins
Repeater { Repeater {
model: _valueDialogInstrumentValue.rangeColors model: instrumentValue.rangeColors
QGCCheckBox { QGCCheckBox {
height: ScreenTools.implicitTextFieldHeight height: ScreenTools.implicitTextFieldHeight
checked: _valueDialogInstrumentValue.isValidColor(_valueDialogInstrumentValue.rangeColors[index]) checked: instrumentValue.isValidColor(instrumentValue.rangeColors[index])
onClicked: updateColorValue(index, checked ? "green" : _valueDialogInstrumentValue.invalidColor()) onClicked: updateColorValue(index, checked ? "green" : instrumentValue.invalidColor())
} }
} }
} }
...@@ -601,13 +611,13 @@ Column { ...@@ -601,13 +611,13 @@ Column {
Column { Column {
spacing: _margins spacing: _margins
Repeater { Repeater {
model: _valueDialogInstrumentValue.rangeColors model: instrumentValue.rangeColors
Rectangle { Rectangle {
width: ScreenTools.implicitTextFieldHeight width: ScreenTools.implicitTextFieldHeight
height: width height: width
border.color: qgcPal.text border.color: qgcPal.text
color: _valueDialogInstrumentValue.isValidColor(modelData) ? modelData : qgcPal.text color: instrumentValue.isValidColor(modelData) ? modelData : qgcPal.text
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
...@@ -623,7 +633,7 @@ Column { ...@@ -623,7 +633,7 @@ Column {
QGCButton { QGCButton {
text: qsTr("Add Row") text: qsTr("Add Row")
onClicked: _valueDialogInstrumentValue.addRangeValue() onClicked: instrumentValue.addRangeValue()
} }
} }
} }
...@@ -637,15 +647,15 @@ Column { ...@@ -637,15 +647,15 @@ Column {
height: childrenRect.height height: childrenRect.height
function updateRangeValue(index, text) { function updateRangeValue(index, text) {
var newValues = _valueDialogInstrumentValue.rangeValues var newValues = instrumentValue.rangeValues
newValues[index] = parseFloat(text) newValues[index] = parseFloat(text)
_valueDialogInstrumentValue.rangeValues = newValues instrumentValue.rangeValues = newValues
} }
function updateIconValue(index, icon) { function updateIconValue(index, icon) {
var newIcons = _valueDialogInstrumentValue.rangeIcons var newIcons = instrumentValue.rangeIcons
newIcons[index] = icon newIcons[index] = icon
_valueDialogInstrumentValue.rangeIcons = newIcons instrumentValue.rangeIcons = newIcons
} }
Column { Column {
...@@ -667,13 +677,13 @@ Column { ...@@ -667,13 +677,13 @@ Column {
spacing: _margins spacing: _margins
Repeater { Repeater {
model: _valueDialogInstrumentValue.rangeValues.length model: instrumentValue.rangeValues.length
QGCButton { QGCButton {
width: ScreenTools.implicitTextFieldHeight width: ScreenTools.implicitTextFieldHeight
height: width height: width
text: qsTr("-") text: qsTr("-")
onClicked: _valueDialogInstrumentValue.removeRangeValue(index) onClicked: instrumentValue.removeRangeValue(index)
} }
} }
} }
...@@ -683,10 +693,10 @@ Column { ...@@ -683,10 +693,10 @@ Column {
spacing: _margins spacing: _margins
Repeater { Repeater {
model: _valueDialogInstrumentValue.rangeValues.length model: instrumentValue.rangeValues.length
QGCTextField { QGCTextField {
text: _valueDialogInstrumentValue.rangeValues[index] text: instrumentValue.rangeValues[index]
onEditingFinished: updateRangeValue(index, text) onEditingFinished: updateRangeValue(index, text)
} }
} }
...@@ -696,7 +706,7 @@ Column { ...@@ -696,7 +706,7 @@ Column {
spacing: _margins spacing: _margins
Repeater { Repeater {
model: _valueDialogInstrumentValue.rangeIcons model: instrumentValue.rangeIcons
QGCColoredImage { QGCColoredImage {
height: ScreenTools.implicitTextFieldHeight height: ScreenTools.implicitTextFieldHeight
...@@ -711,9 +721,8 @@ Column { ...@@ -711,9 +721,8 @@ Column {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
iconPickerDialogIcon = modelData var updateFunction = function(icon){ updateIconValue(index, icon) }
iconPickerDialogUpdateIconFunction = function(icon){ updateIconValue(index, icon) } mainWindow.showPopupDialog(iconPickerDialog, { iconNames: instrumentValue.iconNames, icon: modelData, updateIconFunction = updateFunction })
mainWindow.showPopupDialog(iconPickerDialog, qsTr("Select Icon"), StandardButton.Close)
} }
} }
} }
...@@ -723,7 +732,7 @@ Column { ...@@ -723,7 +732,7 @@ Column {
QGCButton { QGCButton {
text: qsTr("Add Row") text: qsTr("Add Row")
onClicked: _valueDialogInstrumentValue.addRangeValue() onClicked: instrumentValue.addRangeValue()
} }
} }
} }
...@@ -737,15 +746,15 @@ Column { ...@@ -737,15 +746,15 @@ Column {
height: childrenRect.height height: childrenRect.height
function updateRangeValue(index, text) { function updateRangeValue(index, text) {
var newValues = _valueDialogInstrumentValue.rangeValues var newValues = instrumentValue.rangeValues
newValues[index] = parseFloat(text) newValues[index] = parseFloat(text)
_valueDialogInstrumentValue.rangeValues = newValues instrumentValue.rangeValues = newValues
} }
function updateOpacityValue(index, opacity) { function updateOpacityValue(index, opacity) {
var newOpacities = _valueDialogInstrumentValue.rangeOpacities var newOpacities = instrumentValue.rangeOpacities
newOpacities[index] = opacity newOpacities[index] = opacity
_valueDialogInstrumentValue.rangeOpacities = newOpacities instrumentValue.rangeOpacities = newOpacities
} }
Column { Column {
...@@ -767,13 +776,13 @@ Column { ...@@ -767,13 +776,13 @@ Column {
spacing: _margins spacing: _margins
Repeater { Repeater {
model: _valueDialogInstrumentValue.rangeValues.length model: instrumentValue.rangeValues.length
QGCButton { QGCButton {
width: ScreenTools.implicitTextFieldHeight width: ScreenTools.implicitTextFieldHeight
height: width height: width
text: qsTr("-") text: qsTr("-")
onClicked: _valueDialogInstrumentValue.removeRangeValue(index) onClicked: instrumentValue.removeRangeValue(index)
} }
} }
} }
...@@ -783,7 +792,7 @@ Column { ...@@ -783,7 +792,7 @@ Column {
spacing: _margins spacing: _margins
Repeater { Repeater {
model: _valueDialogInstrumentValue.rangeValues model: instrumentValue.rangeValues
QGCTextField { QGCTextField {
text: modelData text: modelData
...@@ -796,7 +805,7 @@ Column { ...@@ -796,7 +805,7 @@ Column {
spacing: _margins spacing: _margins
Repeater { Repeater {
model: _valueDialogInstrumentValue.rangeOpacities model: instrumentValue.rangeOpacities
QGCTextField { QGCTextField {
text: modelData text: modelData
...@@ -808,7 +817,7 @@ Column { ...@@ -808,7 +817,7 @@ Column {
QGCButton { QGCButton {
text: qsTr("Add Row") text: qsTr("Add Row")
onClicked: _valueDialogInstrumentValue.addRangeValue() onClicked: instrumentValue.addRangeValue()
} }
} }
} }
......
...@@ -101,6 +101,7 @@ ...@@ -101,6 +101,7 @@
#include "VehicleObjectAvoidance.h" #include "VehicleObjectAvoidance.h"
#include "TrajectoryPoints.h" #include "TrajectoryPoints.h"
#include "ValuesWidgetController.h" #include "ValuesWidgetController.h"
#include "RCToParamDialogController.h"
#if defined(QGC_ENABLE_PAIRING) #if defined(QGC_ENABLE_PAIRING)
#include "PairingManager.h" #include "PairingManager.h"
...@@ -540,6 +541,7 @@ void QGCApplication::_initCommon() ...@@ -540,6 +541,7 @@ void QGCApplication::_initCommon()
qmlRegisterType<LogDownloadController> (kQGCControllers, 1, 0, "LogDownloadController"); qmlRegisterType<LogDownloadController> (kQGCControllers, 1, 0, "LogDownloadController");
qmlRegisterType<SyslinkComponentController> (kQGCControllers, 1, 0, "SyslinkComponentController"); qmlRegisterType<SyslinkComponentController> (kQGCControllers, 1, 0, "SyslinkComponentController");
qmlRegisterType<EditPositionDialogController> (kQGCControllers, 1, 0, "EditPositionDialogController"); qmlRegisterType<EditPositionDialogController> (kQGCControllers, 1, 0, "EditPositionDialogController");
qmlRegisterType<RCToParamDialogController> (kQGCControllers, 1, 0, "RCToParamDialogController");
#ifndef __mobile__ #ifndef __mobile__
#ifndef NO_SERIAL_LINK #ifndef NO_SERIAL_LINK
......
...@@ -28,7 +28,8 @@ Item { ...@@ -28,7 +28,8 @@ Item {
property int _rowWidth: 10 // Dynamic adjusted at runtime property int _rowWidth: 10 // Dynamic adjusted at runtime
property bool _searchFilter: searchText.text.trim() != "" ///< true: showing results of search property bool _searchFilter: searchText.text.trim() != "" ///< true: showing results of search
property var _searchResults ///< List of parameter names from search results property var _searchResults ///< List of parameter names from search results
property bool _showRCToParam: !ScreenTools.isMobile && QGroundControl.multiVehicleManager.activeVehicle.px4Firmware property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
property bool _showRCToParam: _activeVehicle.px4Firmware
property var _appSettings: QGroundControl.settingsManager.appSettings property var _appSettings: QGroundControl.settingsManager.appSettings
ParameterEditorController { ParameterEditorController {
...@@ -133,8 +134,8 @@ Item { ...@@ -133,8 +134,8 @@ Item {
} }
QGCMenuSeparator { visible: _showRCToParam } QGCMenuSeparator { visible: _showRCToParam }
QGCMenuItem { QGCMenuItem {
text: qsTr("Clear RC to Param") text: qsTr("Clear all RC to Param")
onTriggered: controller.clearRCToParam() onTriggered: _activeVehicle.clearAllParamMapRC()
visible: _showRCToParam visible: _showRCToParam
} }
QGCMenuSeparator { } QGCMenuSeparator { }
......
...@@ -86,13 +86,6 @@ QStringList ParameterEditorController::searchParameters(const QString& searchTex ...@@ -86,13 +86,6 @@ QStringList ParameterEditorController::searchParameters(const QString& searchTex
return list; return list;
} }
void ParameterEditorController::clearRCToParam(void)
{
if (_uas) {
_uas->unsetRCToParameterMap();
}
}
void ParameterEditorController::saveToFile(const QString& filename) void ParameterEditorController::saveToFile(const QString& filename)
{ {
if (!filename.isEmpty()) { if (!filename.isEmpty()) {
......
...@@ -41,7 +41,6 @@ public: ...@@ -41,7 +41,6 @@ public:
Q_INVOKABLE QStringList getGroupsForCategory(const QString& category); Q_INVOKABLE QStringList getGroupsForCategory(const QString& category);
Q_INVOKABLE QStringList searchParameters(const QString& searchText, bool searchInName=true, bool searchInDescriptions=true); Q_INVOKABLE QStringList searchParameters(const QString& searchText, bool searchInName=true, bool searchInDescriptions=true);
Q_INVOKABLE void clearRCToParam(void);
Q_INVOKABLE void saveToFile(const QString& filename); Q_INVOKABLE void saveToFile(const QString& filename);
Q_INVOKABLE void loadFromFile(const QString& filename); Q_INVOKABLE void loadFromFile(const QString& filename);
Q_INVOKABLE void refresh(void); Q_INVOKABLE void refresh(void);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
import QtQuick 2.3 import QtQuick 2.3
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.Layouts 1.2 import QtQuick.Layouts 1.2
import QtQuick.Dialogs 1.3
import QGroundControl 1.0 import QGroundControl 1.0
import QGroundControl.Controls 1.0 import QGroundControl.Controls 1.0
...@@ -286,11 +287,19 @@ QGCViewDialog { ...@@ -286,11 +287,19 @@ QGCViewDialog {
} }
QGCButton { QGCButton {
text: qsTr("Set RC to Param...") text: qsTr("Set RC to Param")
width: _editFieldWidth width: _editFieldWidth
visible: _advanced.checked && !validate && showRCToParam visible: _advanced.checked && !validate && showRCToParam
onClicked: controller.setRCToParam(fact.name) onClicked: mainWindow.showPopupDialog(rcToParamDialog)
} }
} // Column } // Column
} }
Component {
id: rcToParamDialog
RCToParamDialog {
tuningFact: fact
}
}
} // QGCViewDialog } // QGCViewDialog
...@@ -8,8 +8,12 @@ ...@@ -8,8 +8,12 @@
****************************************************************************/ ****************************************************************************/
import QtQuick 2.12 import QtQuick 2.12
import QtQuick.Dialogs 1.3
Item { Item {
property string title
property var buttons: StandardButton.Ok
width: childrenRect.width width: childrenRect.width
height: childrenRect.height height: childrenRect.height
......
...@@ -18,7 +18,10 @@ import QGroundControl.Palette 1.0 ...@@ -18,7 +18,10 @@ import QGroundControl.Palette 1.0
import QGroundControl.ScreenTools 1.0 import QGroundControl.ScreenTools 1.0
Popup { Popup {
id: root property var dialogComponent
property var dialogProperties
id: popupRoot
anchors.centerIn: parent anchors.centerIn: parent
width: mainFlickable.width + (padding * 2) width: mainFlickable.width + (padding * 2)
height: mainFlickable.height + (padding * 2) height: mainFlickable.height + (padding * 2)
...@@ -26,68 +29,66 @@ Popup { ...@@ -26,68 +29,66 @@ Popup {
modal: true modal: true
focus: true focus: true
property var pal: QGroundControl.globalPalette property var _pal: QGroundControl.globalPalette
property real frameSize: ScreenTools.defaultFontPixelWidth property real _frameSize: ScreenTools.defaultFontPixelWidth
property string _dialogTitle
property real _contentMargin: ScreenTools.defaultFontPixelHeight / 2
property real _popupDoubleInset: ScreenTools.defaultFontPixelHeight * 2
property real _maxAvailableWidth: parent.width - _popupDoubleInset
property real _maxAvailableHeight: parent.height - _popupDoubleInset
background: Item { background: Item {
Rectangle { Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.top: parent.top anchors.top: parent.top
width: frameSize width: _frameSize
height: frameSize height: _frameSize
color: pal.text color: _pal.text
visible: enabled visible: enabled
} }
Rectangle { Rectangle {
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: parent.top
width: frameSize width: _frameSize
height: frameSize height: _frameSize
color: pal.text color: _pal.text
visible: enabled visible: enabled
} }
Rectangle { Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
width: frameSize width: _frameSize
height: frameSize height: _frameSize
color: pal.text color: _pal.text
visible: enabled visible: enabled
} }
Rectangle { Rectangle {
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
width: frameSize width: _frameSize
height: frameSize height: _frameSize
color: pal.text color: _pal.text
visible: enabled visible: enabled
} }
Rectangle { Rectangle {
anchors.margins: root.padding anchors.margins: popupRoot.padding
anchors.fill: parent anchors.fill: parent
color: pal.window color: _pal.window
} }
} }
property string title Component.onCompleted: {
property var buttons _dialogTitle = dialogComponentLoader.item.title
property var dialogComponent setupDialogButtons(dialogComponentLoader.item.buttons)
}
property real _contentMargin: ScreenTools.defaultFontPixelHeight / 2
property real _popupDoubleInset: ScreenTools.defaultFontPixelHeight * 2
property real _maxAvailableWidth: parent.width - _popupDoubleInset
property real _maxAvailableHeight: parent.height - _popupDoubleInset
Component.onCompleted: setupDialogButtons()
QGCPalette { id: qgcPal; colorGroupEnabled: parent.enabled } QGCPalette { id: qgcPal; colorGroupEnabled: parent.enabled }
function setupDialogButtons() { function setupDialogButtons(buttons) {
acceptButton.visible = false acceptButton.visible = false
rejectButton.visible = false rejectButton.visible = false
// Accept role buttons // Accept role buttons
...@@ -210,6 +211,8 @@ Popup { ...@@ -210,6 +211,8 @@ Popup {
x: _contentMargin x: _contentMargin
sourceComponent: dialogComponent sourceComponent: dialogComponent
focus: true focus: true
property var dialogProperties: popupRoot.dialogProperties
property bool acceptAllowed: acceptButton.visible property bool acceptAllowed: acceptButton.visible
property bool rejectAllowed: rejectButton.visible property bool rejectAllowed: rejectButton.visible
} }
......
...@@ -80,6 +80,7 @@ RallyPointEditorHeader 1.0 RallyPointEditorHeader.qml ...@@ -80,6 +80,7 @@ RallyPointEditorHeader 1.0 RallyPointEditorHeader.qml
RallyPointItemEditor 1.0 RallyPointItemEditor.qml RallyPointItemEditor 1.0 RallyPointItemEditor.qml
RallyPointMapVisuals 1.0 RallyPointMapVisuals.qml RallyPointMapVisuals 1.0 RallyPointMapVisuals.qml
RCChannelMonitor 1.0 RCChannelMonitor.qml RCChannelMonitor 1.0 RCChannelMonitor.qml
RCToParamDialog 1.0 RCToParamDialog.qml
RoundButton 1.0 RoundButton.qml RoundButton 1.0 RoundButton.qml
SectionHeader 1.0 SectionHeader.qml SectionHeader 1.0 SectionHeader.qml
SetupPage 1.0 SetupPage.qml SetupPage 1.0 SetupPage.qml
......
[
{
"name": "Scale",
"shortDescription": "Scale the RC range",
"type": "double",
"min": -1,
"max": 1,
"defaultValue": 1,
"decimalPlaces": 1
},
{
"name": "CenterValue",
"shortDescription": "Parameter value when RC output is 0",
"type": "double",
"min": -180.0,
"max": 180.0,
"decimalPlaces": 7
},
{
"name": "MinValue",
"shortDescription": "Minimum parameter value",
"type": "double",
"decimalPlaces": 7
},
{
"name": "MaxValue",
"shortDescription": "Maximum parameter value",
"type": "double",
"decimalPlaces": 7
}
]
/****************************************************************************
*
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
import QtQuick 2.12
import QtQuick.Layouts 1.2
import QtQuick.Controls 2.5
import QtQuick.Dialogs 1.3
import QGroundControl 1.0
import QGroundControl.Controls 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Controllers 1.0
QGCPopupDialog {
property alias tuningFact: controller.tuningFact
title: qsTr("RC To Param")
buttons: StandardButton.Cancel | StandardButton.Ok
function accept() {
QGroundControl.multiVehicleManager.activeVehicle.sendParamMapRC(tuningFact.name, scale.text, centerValue.text, tuningID.currentIndex, minValue.text, maxValue.text);
hideDialog()
}
RCToParamDialogController {
id: controller
}
ColumnLayout {
spacing: ScreenTools.defaultDialogControlSpacing
QGCLabel {
Layout.preferredWidth: mainGrid.width
Layout.fillWidth: true
wrapMode: Text.WordWrap
text: qsTr("Bind an RC Channel to a parameter value. Tuning IDs can be mapped to an RC Channel from Radio Setup page.")
}
QGCLabel {
Layout.preferredWidth: mainGrid.width
Layout.fillWidth: true
text: qsTr("Waiting on parameter update from Vehicle.")
visible: !controller.ready
}
GridLayout {
id: mainGrid
columns: 2
rowSpacing: ScreenTools.defaultDialogControlSpacing
columnSpacing: ScreenTools.defaultDialogControlSpacing
enabled: controller.ready
QGCLabel { text: qsTr("Parameter") }
QGCLabel { text: tuningFact.name }
QGCLabel { text: qsTr("Tuning ID") }
QGCComboBox {
id: tuningID
Layout.fillWidth: true
currentIndex: 0
model: [ 1, 2, 3 ]
}
QGCLabel { text: qsTr("Scale") }
QGCTextField {
id: scale
text: controller.scale.valueString
}
QGCLabel { text: qsTr("Center Value") }
QGCTextField {
id: centerValue
text: controller.center.valueString
}
QGCLabel { text: qsTr("Min Value") }
QGCTextField {
id: minValue
text: controller.min.valueString
}
QGCLabel { text: qsTr("Max Value") }
QGCTextField {
id: maxValue
text: controller.max.valueString
}
}
QGCLabel {
Layout.preferredWidth: mainGrid.width
Layout.fillWidth: true
wrapMode: Text.WordWrap
text: qsTr("Double check that all values are correct prior to confirming dialog.")
}
}
}
/****************************************************************************
*
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
#include "RCToParamDialogController.h"
#include "QGCApplication.h"
#include "ParameterManager.h"
const char* RCToParamDialogController::_scaleFactName = "Scale";
const char* RCToParamDialogController::_centerFactName = "CenterValue";
const char* RCToParamDialogController::_minFactName = "MinValue";
const char* RCToParamDialogController::_maxFactName = "MaxValue";
QMap<QString, FactMetaData*> RCToParamDialogController::_metaDataMap;
RCToParamDialogController::RCToParamDialogController(void)
: _scaleFact (0, _scaleFactName, FactMetaData::valueTypeDouble)
, _centerFact (0, _centerFactName, FactMetaData::valueTypeDouble)
, _minFact (0, _minFactName, FactMetaData::valueTypeDouble)
, _maxFact (0, _maxFactName, FactMetaData::valueTypeDouble)
{
if (_metaDataMap.isEmpty()) {
_metaDataMap = FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/RCToParamDialog.FactMetaData.json"), nullptr /* QObject parent */);
}
_scaleFact.setMetaData (_metaDataMap[_scaleFactName], true /* setDefaultFromMetaData */);
_centerFact.setMetaData (_metaDataMap[_centerFactName]);
_minFact.setMetaData (_metaDataMap[_minFactName]);
_maxFact.setMetaData (_metaDataMap[_maxFactName]);
}
void RCToParamDialogController::setTuningFact(Fact* tuningFact)
{
_tuningFact = tuningFact;
emit tuningFactChanged(tuningFact);
_centerFact.setRawValue(_tuningFact->rawValue().toDouble());
_minFact.setRawValue(_tuningFact->rawMin().toDouble());
_maxFact.setRawValue(_tuningFact->rawMax().toDouble());
connect(_tuningFact, &Fact::vehicleUpdated, this, &RCToParamDialogController::_parameterUpdated);
qgcApp()->toolbox()->multiVehicleManager()->activeVehicle()->parameterManager()->refreshParameter(FactSystem::defaultComponentId, _tuningFact->name());
}
void RCToParamDialogController::_parameterUpdated(void)
{
_ready = true;
emit readyChanged(true);
}
/****************************************************************************
*
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
#pragma once
#include <QObject>
#include <QGeoCoordinate>
#include "FactSystem.h"
class RCToParamDialogController : public QObject
{
Q_OBJECT
public:
RCToParamDialogController(void);
Q_PROPERTY(Fact* tuningFact READ tuningFact WRITE setTuningFact NOTIFY tuningFactChanged)
Q_PROPERTY(bool ready MEMBER _ready NOTIFY readyChanged) // true: editing can begin, false: still waiting for param update from vehicle
Q_PROPERTY(Fact* scale READ scale CONSTANT)
Q_PROPERTY(Fact* center READ center CONSTANT)
Q_PROPERTY(Fact* min READ min CONSTANT)
Q_PROPERTY(Fact* max READ max CONSTANT)
Fact* tuningFact (void) { return _tuningFact; }
Fact* scale (void) { return &_scaleFact; }
Fact* center (void) { return &_centerFact; }
Fact* min (void) { return &_minFact; }
Fact* max (void) { return &_maxFact; }
void setTuningFact (Fact* tuningFact);
signals:
void tuningFactChanged (Fact* fact);
void readyChanged (bool ready);
private slots:
void _parameterUpdated(void);
private:
static QMap<QString, FactMetaData*> _metaDataMap;
Fact* _tuningFact = nullptr;
bool _ready = false;
Fact _scaleFact;
Fact _centerFact;
Fact _minFact;
Fact _maxFact;
static const char* _scaleFactName;
static const char* _centerFactName;
static const char* _minFactName;
static const char* _maxFactName;
};
...@@ -46,6 +46,9 @@ Item { ...@@ -46,6 +46,9 @@ Item {
/// QFontMetrics::descent for default font at default point size /// QFontMetrics::descent for default font at default point size
property real defaultFontDescent: 0 property real defaultFontDescent: 0
/// The default amount of space in between controls in a dialog
property real defaultDialogControlSpacing: defaultFontPixelHeight / 2
property real smallFontPointSize: 10 property real smallFontPointSize: 10
property real mediumFontPointSize: 10 property real mediumFontPointSize: 10
property real largeFontPointSize: 10 property real largeFontPointSize: 10
......
...@@ -4337,6 +4337,54 @@ void Vehicle::updateFlightDistance(double distance) ...@@ -4337,6 +4337,54 @@ void Vehicle::updateFlightDistance(double distance)
_flightDistanceFact.setRawValue(_flightDistanceFact.rawValue().toDouble() + distance); _flightDistanceFact.setRawValue(_flightDistanceFact.rawValue().toDouble() + distance);
} }
void Vehicle::sendParamMapRC(const QString& paramName, double scale, double centerValue, int tuningID, double minValue, double maxValue)
{
mavlink_message_t message;
char param_id_cstr[MAVLINK_MSG_PARAM_MAP_RC_FIELD_PARAM_ID_LEN] = {};
// Copy string into buffer, ensuring not to exceed the buffer size
for (unsigned int i = 0; i < sizeof(param_id_cstr); i++) {
if ((int)i < paramName.length()) {
param_id_cstr[i] = paramName.toLatin1()[i];
}
}
mavlink_msg_param_map_rc_pack_chan(static_cast<uint8_t>(_mavlink->getSystemId()),
static_cast<uint8_t>(_mavlink->getComponentId()),
priorityLink()->mavlinkChannel(),
&message,
_id,
MAV_COMP_ID_AUTOPILOT1,
param_id_cstr,
-1, // parameter name specified as string in previous argument
static_cast<uint8_t>(tuningID),
static_cast<float>(scale),
static_cast<float>(centerValue),
static_cast<float>(minValue),
static_cast<float>(maxValue));
sendMessageOnLink(priorityLink(), message);
}
void Vehicle::clearAllParamMapRC(void)
{
char param_id_cstr[MAVLINK_MSG_PARAM_MAP_RC_FIELD_PARAM_ID_LEN] = {};
for (int i = 0; i < 3; i++) {
mavlink_message_t message;
mavlink_msg_param_map_rc_pack_chan(static_cast<uint8_t>(_mavlink->getSystemId()),
static_cast<uint8_t>(_mavlink->getComponentId()),
priorityLink()->mavlinkChannel(),
&message,
_id,
MAV_COMP_ID_AUTOPILOT1,
param_id_cstr,
-2, // Disable map for specified tuning id
i, // tuning id
0, 0, 0, 0); // unused
sendMessageOnLink(priorityLink(), message);
}
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
......
...@@ -781,6 +781,13 @@ public: ...@@ -781,6 +781,13 @@ public:
Q_INVOKABLE void gimbalYawStep (int direction); Q_INVOKABLE void gimbalYawStep (int direction);
Q_INVOKABLE void centerGimbal (); Q_INVOKABLE void centerGimbal ();
/// Sends PARAM_MAP_RC message to vehicle
Q_INVOKABLE void sendParamMapRC(const QString& paramName, double scale, double centerValue, int tuningID, double minValue, double maxValue);
/// Clears all PARAM_MAP_RC settings from vehicle
Q_INVOKABLE void clearAllParamMapRC(void);
#if !defined(NO_ARDUPILOT_DIALECT) #if !defined(NO_ARDUPILOT_DIALECT)
Q_INVOKABLE void flashBootloader(); Q_INVOKABLE void flashBootloader();
#endif #endif
......
...@@ -505,6 +505,10 @@ void MockLink::_handleIncomingMavlinkBytes(const uint8_t* bytes, int cBytes) ...@@ -505,6 +505,10 @@ void MockLink::_handleIncomingMavlinkBytes(const uint8_t* bytes, int cBytes)
_handleLogRequestData(msg); _handleLogRequestData(msg);
break; break;
case MAVLINK_MSG_ID_PARAM_MAP_RC:
_handleParamMapRC(msg);
break;
default: default:
break; break;
} }
...@@ -517,6 +521,22 @@ void MockLink::_handleHeartBeat(const mavlink_message_t& msg) ...@@ -517,6 +521,22 @@ void MockLink::_handleHeartBeat(const mavlink_message_t& msg)
qCDebug(MockLinkLog) << "Heartbeat"; qCDebug(MockLinkLog) << "Heartbeat";
} }
void MockLink::_handleParamMapRC(const mavlink_message_t& msg)
{
mavlink_param_map_rc_t paramMapRC;
mavlink_msg_param_map_rc_decode(&msg, &paramMapRC);
const QString paramName(QString::fromLocal8Bit(paramMapRC.param_id, static_cast<int>(strnlen(paramMapRC.param_id, MAVLINK_MSG_PARAM_MAP_RC_FIELD_PARAM_ID_LEN))));
if (paramMapRC.param_index == -1) {
qDebug() << QStringLiteral("MockLink - PARAM_MAP_RC: param(%1) tuningID(%2) centerValue(%3) scale(%4) min(%5) max(%6)").arg(paramName).arg(paramMapRC.parameter_rc_channel_index).arg(paramMapRC.param_value0).arg(paramMapRC.scale).arg(paramMapRC.param_value_min).arg(paramMapRC.param_value_max);
} else if (paramMapRC.param_index == -2) {
qDebug() << QStringLiteral("MockLink - PARAM_MAP_RC: Clear tuningID(%1)").arg(paramMapRC.parameter_rc_channel_index);
} else {
qWarning() << QStringLiteral("MockLink - PARAM_MAP_RC: Unsupported param_index(%1)").arg(paramMapRC.param_index);
}
}
void MockLink::_handleSetMode(const mavlink_message_t& msg) void MockLink::_handleSetMode(const mavlink_message_t& msg)
{ {
mavlink_set_mode_t request; mavlink_set_mode_t request;
......
...@@ -192,6 +192,7 @@ private: ...@@ -192,6 +192,7 @@ private:
void _handlePreFlightCalibration (const mavlink_command_long_t& request); void _handlePreFlightCalibration (const mavlink_command_long_t& request);
void _handleLogRequestList (const mavlink_message_t& msg); void _handleLogRequestList (const mavlink_message_t& msg);
void _handleLogRequestData (const mavlink_message_t& msg); void _handleLogRequestData (const mavlink_message_t& msg);
void _handleParamMapRC (const mavlink_message_t& msg);
float _floatUnionForParam (int componentId, const QString& paramName); float _floatUnionForParam (int componentId, const QString& paramName);
void _setParamFloatUnionIntoMap (int componentId, const QString& paramName, float paramFloat); void _setParamFloatUnionIntoMap (int componentId, const QString& paramName, float paramFloat);
void _sendHomePosition (void); void _sendHomePosition (void);
......
...@@ -986,68 +986,6 @@ void UAS::pairRX(int rxType, int rxSubType) ...@@ -986,68 +986,6 @@ void UAS::pairRX(int rxType, int rxSubType)
} }
} }
void UAS::sendMapRCToParam(QString param_id, float scale, float value0, quint8 param_rc_channel_index, float valueMin, float valueMax)
{
if (!_vehicle) {
return;
}
mavlink_message_t message;
char param_id_cstr[MAVLINK_MSG_PARAM_MAP_RC_FIELD_PARAM_ID_LEN] = {};
// Copy string into buffer, ensuring not to exceed the buffer size
for (unsigned int i = 0; i < sizeof(param_id_cstr); i++)
{
if ((int)i < param_id.length())
{
param_id_cstr[i] = param_id.toLatin1()[i];
}
}
mavlink_msg_param_map_rc_pack_chan(mavlink->getSystemId(),
mavlink->getComponentId(),
_vehicle->priorityLink()->mavlinkChannel(),
&message,
this->uasId,
_vehicle->defaultComponentId(),
param_id_cstr,
-1,
param_rc_channel_index,
value0,
scale,
valueMin,
valueMax);
_vehicle->sendMessageOnLink(_vehicle->priorityLink(), message);
//qDebug() << "Mavlink message sent";
}
void UAS::unsetRCToParameterMap()
{
if (!_vehicle) {
return;
}
char param_id_cstr[MAVLINK_MSG_PARAM_MAP_RC_FIELD_PARAM_ID_LEN] = {};
for (int i = 0; i < 3; i++) {
mavlink_message_t message;
mavlink_msg_param_map_rc_pack_chan(mavlink->getSystemId(),
mavlink->getComponentId(),
_vehicle->priorityLink()->mavlinkChannel(),
&message,
this->uasId,
_vehicle->defaultComponentId(),
param_id_cstr,
-2,
i,
0.0f,
0.0f,
0.0f,
0.0f);
_vehicle->sendMessageOnLink(_vehicle->priorityLink(), message);
}
}
void UAS::shutdownVehicle(void) void UAS::shutdownVehicle(void)
{ {
_vehicle = nullptr; _vehicle = nullptr;
......
...@@ -210,11 +210,6 @@ public slots: ...@@ -210,11 +210,6 @@ public slots:
void startBusConfig(StartBusConfigType calType); void startBusConfig(StartBusConfigType calType);
void stopBusConfig(void); void stopBusConfig(void);
/** @brief Send command to map a RC channel to a parameter */
void sendMapRCToParam(QString param_id, float scale, float value0, quint8 param_rc_channel_index, float valueMin, float valueMax);
/** @brief Send command to disable all bindings/maps between RC and parameters */
void unsetRCToParameterMap();
signals: signals:
void imageStarted(quint64 timestamp); void imageStarted(quint64 timestamp);
/** @brief A new camera image has arrived */ /** @brief A new camera image has arrived */
......
...@@ -82,12 +82,6 @@ public slots: ...@@ -82,12 +82,6 @@ public slots:
/** @brief Order the robot to pair its receiver **/ /** @brief Order the robot to pair its receiver **/
virtual void pairRX(int rxType, int rxSubType) = 0; virtual void pairRX(int rxType, int rxSubType) = 0;
/** @brief Send command to map a RC channel to a parameter */
virtual void sendMapRCToParam(QString param_id, float scale, float value0, quint8 param_rc_channel_index, float valueMin, float valueMax) = 0;
/** @brief Send command to disable all bindings/maps between RC and parameters */
virtual void unsetRCToParameterMap() = 0;
signals: signals:
/** @brief The robot is connected **/ /** @brief The robot is connected **/
void connected(); void connected();
......
...@@ -229,13 +229,13 @@ ApplicationWindow { ...@@ -229,13 +229,13 @@ ApplicationWindow {
} }
} }
function showPopupDialog(component, title, buttons) { function showPopupDialog(component, properties) {
var popup = popupDialogContainterComponent.createObject(mainWindow, { "title": title, "buttons": buttons, "dialogComponent": component}) var dialog = popupDialogContainerComponent.createObject(mainWindow, { dialogComponent: component, dialogProperties: properties })
popup.open() dialog.open()
} }
Component { Component {
id: popupDialogContainterComponent id: popupDialogContainerComponent
QGCPopupDialogContainer { } QGCPopupDialogContainer { }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment