7import QGroundControl.Controls
8import QGroundControl.VehicleSetup
9import QGroundControl.FactControls
12 pageComponent: joystickManager.activeJoystick ? pageComponent : noJoysticksComponent
19 spacing: ScreenTools.defaultFontPixelHeight / 2
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
29 spacing: ScreenTools.defaultFontPixelWidth
30 visible: joystickCombo.visible || calibrationRequiredLabel.visible
35 visible: activeJoystickName !== "" && QGroundControl.corePlugin.options.allowJoystickSelection
37 onActivated: (index) => { activeJoystickNameFact.rawValue = textAt(index) }
39 function _buildModel() {
40 const availableNames = joystickManager.availableJoystickNames || [];
41 const modelNames = [...availableNames];
42 if (activeJoystickName && !modelNames.includes(activeJoystickName)) {
43 modelNames.push(activeJoystickName);
45 joystickCombo.model = modelNames;
48 function _selectActiveJoystick() {
49 let index = joystickCombo.find(activeJoystickName)
51 console.warn("Internal error: Active joystick name not in combo", activeJoystickName)
53 joystickCombo.currentIndex = index
59 _selectActiveJoystick()
62 Component.onCompleted: _recalc()
63 Connections { target: root; function onActiveJoystickNameChanged() { joystickCombo._recalc() } }
64 Connections { target: joystickManager; function onAvailableJoystickNamesChanged() { joystickCombo._recalc() } }
69 checked: joystickManager.activeJoystickEnabledForActiveVehicle
70 enabled: activeJoystickCalibrated
72 onClicked: joystickManager.activeJoystickEnabledForActiveVehicle = checked
76 font.pointSize: ScreenTools.smallFontPointSize
77 text: qsTr("Not currently available")
78 visible: !activeJoystick
82 id: calibrationRequiredLabel
83 text: activeJoystickCalibrated ? qsTr("Calibrated") : qsTr("Requires Calibration")
84 enabled: !activeJoystickCalibrated
89 id: remoteControlCalibrationLoader
90 Layout.fillWidth: true
91 sourceComponent: activeJoystick && !activeVehicle.armed ? remoteControlCalibrationComponent : null
95 id: remoteControlCalibrationComponent
97 RemoteControlCalibration {
98 id: remoteControlCalibration
100 controller: JoystickConfigController {
101 joystick: joystickManager.activeJoystick
102 statusText: remoteControlCalibration.statusText
103 cancelButton: remoteControlCalibration.cancelButton
104 nextButton: remoteControlCalibration.nextButton
108 useDeadband: controller && controller.joystick && controller.joystick.settings.useDeadband.rawValue
110 additionalSetupComponent: _activeJoystick ? _additionalSetupComponent : null
111 additionalMonitorComponent: _activeJoystick ? _additionalMonitorComponent : null
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
118 Component.onCompleted: controller.start()
123 function onCalibrationCompleted() {
124 if (joystickManager.activeJoystickEnabledForActiveVehicle) {
127 QGroundControl.showMessageDialog(
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 });
137 id: _additionalSetupComponent
140 spacing: ScreenTools.defaultFontPixelHeight / 2
141 enabled: !controller.calibrating
145 Layout.fillWidth: true
148 text: qsTr("Buttons")
153 text: qsTr("Settings")
158 JoystickComponentButtons {
160 Layout.fillWidth: true
161 joystick: _activeJoystick
162 controller: _controller
163 visible: tabBar.currentIndex === 0
166 JoystickComponentSettings {
168 Layout.fillWidth: true
169 joystick: _activeJoystick
170 visible: tabBar.currentIndex === 1
176 id: _additionalMonitorComponent
178 JoystickComponentButtonMonitor {
187 id: noJoysticksComponent
189 width: availableWidth
190 height: availableHeight
191 text: qsTr("No joysticks or gamepads detected.")
192 wrapMode: Text.WordWrap