QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
JoystickComponent.qml
Go to the documentation of this file.
1import QtQuick
2import QtQuick.Controls
3import QtQuick.Dialogs
4import QtQuick.Layouts
5
6import QGroundControl
7import QGroundControl.Controls
8import QGroundControl.VehicleSetup
9import QGroundControl.FactControls
10
11SetupPage {
12 pageComponent: joystickManager.activeJoystick ? pageComponent : noJoysticksComponent
13
14 Component {
15 id: pageComponent
16
17 ColumnLayout {
18 id: root
19 spacing: ScreenTools.defaultFontPixelHeight / 2
20
21 property Fact activeJoystickNameFact: QGroundControl.settingsManager.joystickManagerSettings.activeJoystickName
22 property string activeJoystickName: activeJoystickNameFact.value
23 property var availableJoystickNames: joystickManager.availableJoystickNames
24 property var activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
25 property var activeJoystick: joystickManager.activeJoystick
26 property bool activeJoystickCalibrated: activeJoystick ? activeJoystick.settings.calibrated.rawValue : false
27
28 RowLayout {
29 spacing: ScreenTools.defaultFontPixelWidth
30 visible: joystickCombo.visible || calibrationRequiredLabel.visible
31
32 QGCComboBox {
33 id: joystickCombo
34 sizeToContents: true
35 visible: activeJoystickName !== "" && QGroundControl.corePlugin.options.allowJoystickSelection
36
37 onActivated: (index) => { activeJoystickNameFact.rawValue = textAt(index) }
38
39 function _buildModel() {
40 const availableNames = joystickManager.availableJoystickNames || [];
41 const modelNames = [...availableNames];
42 if (activeJoystickName && !modelNames.includes(activeJoystickName)) {
43 modelNames.push(activeJoystickName);
44 }
45 joystickCombo.model = modelNames;
46 }
47
48 function _selectActiveJoystick() {
49 let index = joystickCombo.find(activeJoystickName)
50 if (index === -1) {
51 console.warn("Internal error: Active joystick name not in combo", activeJoystickName)
52 } else {
53 joystickCombo.currentIndex = index
54 }
55 }
56
57 function _recalc() {
58 _buildModel()
59 _selectActiveJoystick()
60 }
61
62 Component.onCompleted: _recalc()
63 Connections { target: root; function onActiveJoystickNameChanged() { joystickCombo._recalc() } }
64 Connections { target: joystickManager; function onAvailableJoystickNamesChanged() { joystickCombo._recalc() } }
65 }
66
67 QGCCheckBox {
68 text: qsTr("Enable")
69 checked: joystickManager.activeJoystickEnabledForActiveVehicle
70 enabled: activeJoystickCalibrated
71
72 onClicked: joystickManager.activeJoystickEnabledForActiveVehicle = checked
73 }
74
75 QGCLabel {
76 font.pointSize: ScreenTools.smallFontPointSize
77 text: qsTr("Not currently available")
78 visible: !activeJoystick
79 }
80
81 QGCLabel {
82 id: calibrationRequiredLabel
83 text: activeJoystickCalibrated ? qsTr("Calibrated") : qsTr("Requires Calibration")
84 enabled: !activeJoystickCalibrated
85 }
86 }
87
88 Loader {
89 id: remoteControlCalibrationLoader
90 Layout.fillWidth: true
91 sourceComponent: activeJoystick && !activeVehicle.armed ? remoteControlCalibrationComponent : null
92 }
93
94 Component {
95 id: remoteControlCalibrationComponent
96
97 RemoteControlCalibration {
98 id: remoteControlCalibration
99
100 controller: JoystickConfigController {
101 joystick: joystickManager.activeJoystick
102 statusText: remoteControlCalibration.statusText
103 cancelButton: remoteControlCalibration.cancelButton
104 nextButton: remoteControlCalibration.nextButton
105 joystickMode: true
106 }
107
108 useDeadband: controller && controller.joystick && controller.joystick.settings.useDeadband.rawValue
109
110 additionalSetupComponent: _activeJoystick ? _additionalSetupComponent : null
111 additionalMonitorComponent: _activeJoystick ? _additionalMonitorComponent : null
112
113 property var _controller: controller
114 property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
115 property var _activeJoystick: _controller.joystick
116 property bool _requiresCalibration: _activeJoystick ? (_activeJoystick.requiresCalibration && !_activeJoystick.settings.calibrated.rawValue) : false
117
118 Component.onCompleted: controller.start()
119
120 Connections {
121 target: controller
122
123 function onCalibrationCompleted() {
124 if (joystickManager.activeJoystickEnabledForActiveVehicle) {
125 return;
126 }
127 QGroundControl.showMessageDialog(
128 root,
129 qsTr("Enable Joystick"),
130 qsTr("%1 calibration is complete. Enable it now?").arg(_activeJoystick.name),
131 Dialog.Yes | Dialog.No,
132 function() { joystickManager.activeJoystickEnabledForActiveVehicle = true });
133 }
134 }
135
136 Component {
137 id: _additionalSetupComponent
138
139 ColumnLayout {
140 spacing: ScreenTools.defaultFontPixelHeight / 2
141 enabled: !controller.calibrating
142
143 QGCTabBar {
144 id: tabBar
145 Layout.fillWidth: true
146
147 QGCTabButton {
148 text: qsTr("Buttons")
149 checked: true
150 }
151
152 QGCTabButton {
153 text: qsTr("Settings")
154 checked: false
155 }
156 }
157
158 JoystickComponentButtons {
159 id: joystickButtons
160 Layout.fillWidth: true
161 joystick: _activeJoystick
162 controller: _controller
163 visible: tabBar.currentIndex === 0
164 }
165
166 JoystickComponentSettings {
167 id: joystickSettings
168 Layout.fillWidth: true
169 joystick: _activeJoystick
170 visible: tabBar.currentIndex === 1
171 }
172 }
173 }
174
175 Component {
176 id: _additionalMonitorComponent
177
178 JoystickComponentButtonMonitor {
179 }
180 }
181 }
182 }
183 }
184 }
185
186 Component {
187 id: noJoysticksComponent
188 QGCLabel {
189 width: availableWidth
190 height: availableHeight
191 text: qsTr("No joysticks or gamepads detected.")
192 wrapMode: Text.WordWrap
193 }
194 }
195}