6import QGroundControl.Controls
11 readonly property int _MAV_AUTOPILOT_GENERIC: 0
12 readonly property int _MAV_AUTOPILOT_PX4: 12
13 readonly property int _MAV_AUTOPILOT_ARDUPILOTMEGA: 3
14 readonly property int _MAV_TYPE_FIXED_WING: 1
15 readonly property int _MAV_TYPE_QUADROTOR: 2
17 function saveSettings() {
18 subEditConfig.firmware = firmwareTypeCombo.selectedFirmware
19 if (firmwareTypeCombo.apmFirmwareSelected) {
20 if (vehicleTypeCombo.currentIndex === 1) { // Hardcoded _MAV_TYPE_FIXED_WING
21 subEditConfig.vehicle = _MAV_TYPE_FIXED_WING
23 subEditConfig.vehicle = _MAV_TYPE_QUADROTOR
26 subEditConfig.sendStatus = sendStatus.checked
27 subEditConfig.apmStartFreshParams = apmStartFreshParams.checked
28 subEditConfig.enableCamera = enableCamera.checked
29 subEditConfig.enableGimbal = enableGimbal.checked
30 subEditConfig.enableProximity = enableProximity.checked
31 subEditConfig.incrementVehicleId = incrementVehicleId.checked
32 subEditConfig.cameraCaptureVideo = cameraCaptureVideo.checked
33 subEditConfig.cameraCaptureImage = cameraCaptureImage.checked
34 subEditConfig.cameraHasModes = cameraHasModes.checked
35 subEditConfig.cameraHasVideoStream = cameraHasVideoStream.checked
36 // The stream type combo only applies when the camera advertises a video stream;
37 // persist Disabled otherwise so a stale selection can't linger in settings.
38 subEditConfig.videoStreamType = cameraHasVideoStream.checked ? videoStreamTypeCombo.currentIndex : 0
39 subEditConfig.cameraCanCaptureImageInVideoMode = cameraCanCaptureImageInVideoMode.checked
40 subEditConfig.cameraCanCaptureVideoInImageMode = cameraCanCaptureVideoInImageMode.checked
41 subEditConfig.cameraHasBasicZoom = cameraHasBasicZoom.checked
42 subEditConfig.cameraHasTrackingPoint = cameraHasTrackingPoint.checked
43 subEditConfig.cameraHasTrackingRectangle = cameraHasTrackingRectangle.checked
44 subEditConfig.gimbalHasRollAxis = gimbalHasRollAxis.checked
45 subEditConfig.gimbalHasPitchAxis = gimbalHasPitchAxis.checked
46 subEditConfig.gimbalHasYawAxis = gimbalHasYawAxis.checked
47 subEditConfig.gimbalHasYawFollow = gimbalHasYawFollow.checked
48 subEditConfig.gimbalHasYawLock = gimbalHasYawLock.checked
49 subEditConfig.gimbalHasRetract = gimbalHasRetract.checked
50 subEditConfig.gimbalHasNeutral = gimbalHasNeutral.checked
53 Component.onCompleted: {
54 let firmwareIndex = firmwareTypeCombo._firmwareValues.indexOf(subEditConfig.firmware)
55 if (firmwareIndex < 0) {
56 // Entries are ordered supported firmwares first, Generic last resort
59 firmwareTypeCombo.currentIndex = firmwareIndex
60 if (subEditConfig.vehicle === _MAV_TYPE_FIXED_WING) { // Hardcoded _MAV_TYPE_FIXED_WING
61 vehicleTypeCombo.currentIndex = 1
63 vehicleTypeCombo.currentIndex = 0
65 videoStreamTypeCombo.currentIndex = subEditConfig.videoStreamType
70 Layout.fillWidth: true
71 text: qsTr("Send Status Text and Voice")
72 checked: subEditConfig.sendStatus
77 Layout.fillWidth: true
78 text: qsTr("Enable Camera")
79 checked: subEditConfig.enableCamera
84 Layout.fillWidth: true
85 text: qsTr("Enable Gimbal")
86 checked: subEditConfig.enableGimbal
91 Layout.fillWidth: true
92 text: qsTr("Enable Proximity Sensors")
93 checked: subEditConfig.enableProximity
97 id: incrementVehicleId
98 Layout.fillWidth: true
99 text: qsTr("Increment Vehicle Id")
100 checked: subEditConfig.incrementVehicleId
104 id: firmwareTypeCombo
105 Layout.fillWidth: true
106 label: qsTr("Firmware Type")
107 model: _firmwareEntries.map(entry => entry.name)
109 readonly property var _firmwareEntries: {
111 if (QGroundControl.px4ProFirmwareSupported) {
112 entries.push({ value: _MAV_AUTOPILOT_PX4, name: qsTr("PX4 Pro") })
114 if (QGroundControl.apmFirmwareSupported) {
115 entries.push({ value: _MAV_AUTOPILOT_ARDUPILOTMEGA, name: qsTr("ArduPilot") })
117 entries.push({ value: _MAV_AUTOPILOT_GENERIC, name: qsTr("Generic MAVLink") })
120 readonly property var _firmwareValues: _firmwareEntries.map(entry => entry.value)
121 readonly property int selectedFirmware: currentIndex >= 0 ? _firmwareValues[currentIndex] : _firmwareValues[0]
122 readonly property bool apmFirmwareSelected: selectedFirmware === _MAV_AUTOPILOT_ARDUPILOTMEGA
127 Layout.fillWidth: true
128 label: qsTr("Vehicle Type")
129 model: [ qsTr("ArduCopter"), qsTr("ArduPlane") ]
130 visible: firmwareTypeCombo.apmFirmwareSelected
134 id: apmStartFreshParams
135 Layout.fillWidth: true
136 text: qsTr("Start With Fresh Firmware Parameters (Setup Required)")
137 checked: subEditConfig.apmStartFreshParams
138 visible: firmwareTypeCombo.apmFirmwareSelected
142 // Reset the model, not the view — an imperative write to checked
143 // would sever its declarative binding
144 subEditConfig.apmStartFreshParams = false
149 SettingsGroupLayout {
150 Layout.fillWidth: true
151 heading: qsTr("Camera Capabilities")
152 visible: enableCamera.checked
155 id: cameraHasVideoStream
156 Layout.fillWidth: true
157 text: "CAMERA_CAP_FLAGS_HAS_VIDEO_STREAM"
158 checked: subEditConfig.cameraHasVideoStream
159 visible: enableCamera.checked
163 id: videoStreamTypeCombo
164 Layout.fillWidth: true
165 label: qsTr("Served Video Stream")
166 visible: enableCamera.checked && cameraHasVideoStream.checked
169 qsTr("RTP/UDP H.264"),
170 qsTr("RTP/UDP H.265"),
171 qsTr("RTSP (H.264)"),
172 qsTr("MPEG-TS (UDP)"),
173 qsTr("MPEG-TS (TCP)")
178 id: cameraCaptureVideo
179 Layout.fillWidth: true
180 text: "CAMERA_CAP_FLAGS_CAPTURE_VIDEO"
181 checked: subEditConfig.cameraCaptureVideo
182 visible: enableCamera.checked
186 id: cameraCaptureImage
187 Layout.fillWidth: true
188 text: "CAMERA_CAP_FLAGS_CAPTURE_IMAGE"
189 checked: subEditConfig.cameraCaptureImage
190 visible: enableCamera.checked
195 Layout.fillWidth: true
196 text: "CAMERA_CAP_FLAGS_HAS_MODES"
197 checked: subEditConfig.cameraHasModes
198 visible: enableCamera.checked
202 id: cameraCanCaptureImageInVideoMode
203 Layout.fillWidth: true
204 text: "CAMERA_CAP_FLAGS_CAN_CAPTURE_IMAGE_IN_VIDEO_MODE"
205 checked: subEditConfig.cameraCanCaptureImageInVideoMode
206 visible: enableCamera.checked
210 id: cameraCanCaptureVideoInImageMode
211 Layout.fillWidth: true
212 text: "CAMERA_CAP_FLAGS_CAN_CAPTURE_VIDEO_IN_IMAGE_MODE"
213 checked: subEditConfig.cameraCanCaptureVideoInImageMode
214 visible: enableCamera.checked
218 id: cameraHasBasicZoom
219 Layout.fillWidth: true
220 text: "CAMERA_CAP_FLAGS_HAS_BASIC_ZOOM"
221 checked: subEditConfig.cameraHasBasicZoom
222 visible: enableCamera.checked
226 id: cameraHasTrackingPoint
227 Layout.fillWidth: true
228 text: "CAMERA_CAP_FLAGS_HAS_TRACKING_POINT"
229 checked: subEditConfig.cameraHasTrackingPoint
230 visible: enableCamera.checked
234 id: cameraHasTrackingRectangle
235 Layout.fillWidth: true
236 text: "CAMERA_CAP_FLAGS_HAS_TRACKING_RECTANGLE"
237 checked: subEditConfig.cameraHasTrackingRectangle
238 visible: enableCamera.checked
242 SettingsGroupLayout {
243 Layout.fillWidth: true
244 heading: qsTr("Gimbal Capabilities")
245 visible: enableGimbal.checked
248 id: gimbalHasRollAxis
249 Layout.fillWidth: true
250 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_ROLL_AXIS"
251 checked: subEditConfig.gimbalHasRollAxis
252 visible: enableGimbal.checked
256 id: gimbalHasPitchAxis
257 Layout.fillWidth: true
258 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_PITCH_AXIS"
259 checked: subEditConfig.gimbalHasPitchAxis
260 visible: enableGimbal.checked
265 Layout.fillWidth: true
266 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_YAW_AXIS"
267 checked: subEditConfig.gimbalHasYawAxis
268 visible: enableGimbal.checked
272 id: gimbalHasYawFollow
273 Layout.fillWidth: true
274 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_YAW_FOLLOW"
275 checked: subEditConfig.gimbalHasYawFollow
276 visible: enableGimbal.checked
281 Layout.fillWidth: true
282 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_YAW_LOCK"
283 checked: subEditConfig.gimbalHasYawLock
284 visible: enableGimbal.checked
289 Layout.fillWidth: true
290 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_RETRACT"
291 checked: subEditConfig.gimbalHasRetract
292 visible: enableGimbal.checked
297 Layout.fillWidth: true
298 text: "GIMBAL_MANAGER_CAP_FLAGS_HAS_NEUTRAL"
299 checked: subEditConfig.gimbalHasNeutral
300 visible: enableGimbal.checked