6import QGroundControl.Controls
11 function saveSettings() {
12 subEditConfig.firmware = firmwareTypeCombo.selectedFirmware
13 if (firmwareTypeCombo.apmFirmwareSelected) {
14 if (vehicleTypeCombo.currentIndex === 1) {
15 subEditConfig.vehicle = MAVLinkEnums.MAV_TYPE_FIXED_WING
17 subEditConfig.vehicle = MAVLinkEnums.MAV_TYPE_QUADROTOR
20 subEditConfig.sendStatus = sendStatus.checked
21 subEditConfig.apmStartFreshParams = apmStartFreshParams.checked
22 subEditConfig.enableCamera = enableCamera.checked
23 subEditConfig.enableGimbal = enableGimbal.checked
24 subEditConfig.enableProximity = enableProximity.checked
25 subEditConfig.enableADSB = enableADSB.checked
26 subEditConfig.incrementVehicleId = incrementVehicleId.checked
27 subEditConfig.homeLocation = homeLocationCombo.currentIndex
28 subEditConfig.cameraCaptureVideo = cameraCaptureVideo.checked
29 subEditConfig.cameraCaptureImage = cameraCaptureImage.checked
30 subEditConfig.cameraHasModes = cameraHasModes.checked
31 subEditConfig.cameraHasVideoStream = cameraHasVideoStream.checked
32 // The stream type combo only applies when the camera advertises a video stream;
33 // persist Disabled otherwise so a stale selection can't linger in settings.
34 subEditConfig.videoStreamType = cameraHasVideoStream.checked ? videoStreamTypeCombo.currentIndex : 0
35 subEditConfig.cameraCanCaptureImageInVideoMode = cameraCanCaptureImageInVideoMode.checked
36 subEditConfig.cameraCanCaptureVideoInImageMode = cameraCanCaptureVideoInImageMode.checked
37 subEditConfig.cameraHasBasicZoom = cameraHasBasicZoom.checked
38 subEditConfig.cameraHasTrackingPoint = cameraHasTrackingPoint.checked
39 subEditConfig.cameraHasTrackingRectangle = cameraHasTrackingRectangle.checked
40 subEditConfig.gimbalHasRollAxis = gimbalHasRollAxis.checked
41 subEditConfig.gimbalHasPitchAxis = gimbalHasPitchAxis.checked
42 subEditConfig.gimbalHasYawAxis = gimbalHasYawAxis.checked
43 subEditConfig.gimbalHasYawFollow = gimbalHasYawFollow.checked
44 subEditConfig.gimbalHasYawLock = gimbalHasYawLock.checked
45 subEditConfig.gimbalHasRetract = gimbalHasRetract.checked
46 subEditConfig.gimbalHasNeutral = gimbalHasNeutral.checked
49 Component.onCompleted: {
50 let firmwareIndex = firmwareTypeCombo._firmwareValues.indexOf(subEditConfig.firmware)
51 if (firmwareIndex < 0) {
52 // Entries are ordered supported firmwares first, Generic last resort
55 firmwareTypeCombo.currentIndex = firmwareIndex
56 if (subEditConfig.vehicle === MAVLinkEnums.MAV_TYPE_FIXED_WING) {
57 vehicleTypeCombo.currentIndex = 1
59 vehicleTypeCombo.currentIndex = 0
61 videoStreamTypeCombo.currentIndex = subEditConfig.videoStreamType
62 homeLocationCombo.currentIndex = subEditConfig.homeLocation
67 Layout.fillWidth: true
68 text: qsTr("Send Status Text and Voice")
69 checked: subEditConfig.sendStatus
74 Layout.fillWidth: true
75 text: qsTr("Enable Camera")
76 checked: subEditConfig.enableCamera
81 Layout.fillWidth: true
82 text: qsTr("Enable Gimbal")
83 checked: subEditConfig.enableGimbal
88 Layout.fillWidth: true
89 text: qsTr("Enable Proximity Sensors")
90 checked: subEditConfig.enableProximity
95 Layout.fillWidth: true
96 text: qsTr("Enable ADS-B Vehicles")
97 checked: subEditConfig.enableADSB
101 id: incrementVehicleId
102 Layout.fillWidth: true
103 text: qsTr("Increment Vehicle Id")
104 checked: subEditConfig.incrementVehicleId
108 id: firmwareTypeCombo
109 Layout.fillWidth: true
110 label: qsTr("Firmware Type")
111 model: _firmwareEntries.map(entry => entry.name)
113 readonly property var _firmwareEntries: {
115 if (QGroundControl.px4ProFirmwareSupported) {
116 entries.push({ value: MAVLinkEnums.MAV_AUTOPILOT_PX4, name: qsTr("PX4 Pro") })
118 if (QGroundControl.apmFirmwareSupported) {
119 entries.push({ value: MAVLinkEnums.MAV_AUTOPILOT_ARDUPILOTMEGA, name: qsTr("ArduPilot") })
121 entries.push({ value: MAVLinkEnums.MAV_AUTOPILOT_GENERIC, name: qsTr("Generic MAVLink") })
124 readonly property var _firmwareValues: _firmwareEntries.map(entry => entry.value)
125 readonly property int selectedFirmware: currentIndex >= 0 ? _firmwareValues[currentIndex] : _firmwareValues[0]
126 readonly property bool apmFirmwareSelected: selectedFirmware === MAVLinkEnums.MAV_AUTOPILOT_ARDUPILOTMEGA
131 Layout.fillWidth: true
132 label: qsTr("Vehicle Type")
133 model: [ qsTr("ArduCopter"), qsTr("ArduPlane") ]
134 visible: firmwareTypeCombo.apmFirmwareSelected
138 id: homeLocationCombo
139 Layout.fillWidth: true
140 label: qsTr("Home Location")
142 qsTr("PX4 SITL Default"),
143 qsTr("ArduPilot SITL Default"),
149 id: apmStartFreshParams
150 Layout.fillWidth: true
151 text: qsTr("Start With Fresh Firmware Parameters (Setup Required)")
152 checked: subEditConfig.apmStartFreshParams
153 visible: firmwareTypeCombo.apmFirmwareSelected
157 // Reset the model, not the view — an imperative write to checked
158 // would sever its declarative binding
159 subEditConfig.apmStartFreshParams = false
164 SettingsGroupLayout {
165 Layout.fillWidth: true
166 heading: qsTr("Camera Capabilities")
167 visible: enableCamera.checked
170 id: cameraHasVideoStream
171 Layout.fillWidth: true
172 text: "CAMERA_CAP_FLAGS_HAS_VIDEO_STREAM"
173 checked: subEditConfig.cameraHasVideoStream
174 visible: enableCamera.checked
178 id: videoStreamTypeCombo
179 Layout.fillWidth: true
180 label: qsTr("Served Video Stream")
181 visible: enableCamera.checked && cameraHasVideoStream.checked
184 qsTr("RTP/UDP H.264"),
185 qsTr("RTP/UDP H.265"),
186 qsTr("RTSP (H.264)"),
187 qsTr("MPEG-TS (UDP)"),
188 qsTr("MPEG-TS (TCP)")
193 id: cameraCaptureVideo
194 Layout.fillWidth: true
195 text: "CAMERA_CAP_FLAGS_CAPTURE_VIDEO"
196 checked: subEditConfig.cameraCaptureVideo
197 visible: enableCamera.checked
201 id: cameraCaptureImage
202 Layout.fillWidth: true
203 text: "CAMERA_CAP_FLAGS_CAPTURE_IMAGE"
204 checked: subEditConfig.cameraCaptureImage
205 visible: enableCamera.checked
210 Layout.fillWidth: true
211 text: "CAMERA_CAP_FLAGS_HAS_MODES"
212 checked: subEditConfig.cameraHasModes
213 visible: enableCamera.checked
217 id: cameraCanCaptureImageInVideoMode
218 Layout.fillWidth: true
219 text: "CAMERA_CAP_FLAGS_CAN_CAPTURE_IMAGE_IN_VIDEO_MODE"
220 checked: subEditConfig.cameraCanCaptureImageInVideoMode
221 visible: enableCamera.checked
225 id: cameraCanCaptureVideoInImageMode
226 Layout.fillWidth: true
227 text: "CAMERA_CAP_FLAGS_CAN_CAPTURE_VIDEO_IN_IMAGE_MODE"
228 checked: subEditConfig.cameraCanCaptureVideoInImageMode
229 visible: enableCamera.checked
233 id: cameraHasBasicZoom
234 Layout.fillWidth: true
235 text: "CAMERA_CAP_FLAGS_HAS_BASIC_ZOOM"
236 checked: subEditConfig.cameraHasBasicZoom
237 visible: enableCamera.checked
241 id: cameraHasTrackingPoint
242 Layout.fillWidth: true
243 text: "CAMERA_CAP_FLAGS_HAS_TRACKING_POINT"
244 checked: subEditConfig.cameraHasTrackingPoint
245 visible: enableCamera.checked
249 id: cameraHasTrackingRectangle
250 Layout.fillWidth: true
251 text: "CAMERA_CAP_FLAGS_HAS_TRACKING_RECTANGLE"
252 checked: subEditConfig.cameraHasTrackingRectangle
253 visible: enableCamera.checked
257 SettingsGroupLayout {
258 Layout.fillWidth: true
259 heading: qsTr("Gimbal Capabilities")
260 visible: enableGimbal.checked
263 id: gimbalHasRollAxis
264 Layout.fillWidth: true
265 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_ROLL_AXIS"
266 checked: subEditConfig.gimbalHasRollAxis
267 visible: enableGimbal.checked
271 id: gimbalHasPitchAxis
272 Layout.fillWidth: true
273 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_PITCH_AXIS"
274 checked: subEditConfig.gimbalHasPitchAxis
275 visible: enableGimbal.checked
280 Layout.fillWidth: true
281 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_YAW_AXIS"
282 checked: subEditConfig.gimbalHasYawAxis
283 visible: enableGimbal.checked
287 id: gimbalHasYawFollow
288 Layout.fillWidth: true
289 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_YAW_FOLLOW"
290 checked: subEditConfig.gimbalHasYawFollow
291 visible: enableGimbal.checked
296 Layout.fillWidth: true
297 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_YAW_LOCK"
298 checked: subEditConfig.gimbalHasYawLock
299 visible: enableGimbal.checked
304 Layout.fillWidth: true
305 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_RETRACT"
306 checked: subEditConfig.gimbalHasRetract
307 visible: enableGimbal.checked
312 Layout.fillWidth: true
313 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_NEUTRAL"
314 checked: subEditConfig.gimbalHasNeutral
315 visible: enableGimbal.checked