Browse Source

Fly View: Photo/Video widget simple camera DIGICAM_CONTROL support (#9216)

* No need to create special radio button properties

* Add simple camera support to photo/video widget

* Update
QGC4.4
Don Gagne 4 years ago committed by GitHub
parent
commit
3051f2eaf1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      ChangeLog.md
  2. 68
      src/FlightMap/Widgets/PhotoVideoControl.qml
  3. 11
      src/QmlControls/QGCRadioButton.qml
  4. 6
      src/Settings/FlyView.SettingsGroup.json
  5. 1
      src/Settings/FlyViewSettings.cc
  6. 1
      src/Settings/FlyViewSettings.h
  7. 9
      src/Vehicle/Vehicle.cc
  8. 3
      src/Vehicle/Vehicle.h
  9. 4
      src/VehicleSetup/FirmwareUpgrade.qml
  10. 10
      src/ui/preferences/GeneralSettings.qml

1
ChangeLog.md

@ -4,6 +4,7 @@ Note: This file only contains high level features or important fixes. @@ -4,6 +4,7 @@ Note: This file only contains high level features or important fixes.
## 4.1 - Daily build
* Support simple cameras which only support DIGICAM_CONTROL in the Photo/Video control on Fly View.
* Load Parameters From File: Support loading parameters which don't currently existing on the vehicle.
* Load Parameters From File: Add dialog which shows diff of file and vehicle params. Selective param upload from file.
* Video Streaming: New camera control supports capturing individual images from the stream

68
src/FlightMap/Widgets/PhotoVideoControl.qml

@ -27,23 +27,28 @@ Rectangle { @@ -27,23 +27,28 @@ Rectangle {
height: mainLayout.height + (_margins * 2)
color: "#80000000"
radius: _margins
visible: !QGroundControl.settingsManager.flyViewSettings.alternateInstrumentPanel.rawValue && (_mavlinkCamera || _videoStreamAvailable) && multiVehiclePanelSelector.showSingleVehiclePanel
visible: !QGroundControl.settingsManager.flyViewSettings.alternateInstrumentPanel.rawValue && (_mavlinkCamera || _videoStreamAvailable || _simpleCameraAvailable) && multiVehiclePanelSelector.showSingleVehiclePanel
property real _margins: ScreenTools.defaultFontPixelHeight / 2
property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
// The following properties relate to a simple camera
property var _flyViewSettings: QGroundControl.settingsManager.flyViewSettings
property bool _simpleCameraAvailable: !_mavlinkCamera && _activeVehicle && _flyViewSettings.showSimpleCameraControl.rawValue
property bool _onlySimpleCameraAvailable: !_anyVideoStreamAvailable && _simpleCameraAvailable
property bool _simpleCameraIsShootingInCurrentMode: _onlySimpleCameraAvailable && !_simplePhotoCaptureIsIdle
// The following properties relate to a simple video stream
property bool _videoStreamAvailable: _videoStreamManager.hasVideo
property var _videoStreamSettings: QGroundControl.settingsManager.videoSettings
property var _videoStreamManager: QGroundControl.videoManager
property bool _videoStreamAllowsPhotoWhileRecording: true
property bool _videoStreamIsStreaming: _videoStreamManager.streaming
property bool _videoStreamPhotoCaptureIsIdle: true
property bool _simplePhotoCaptureIsIdle: true
property bool _videoStreamRecording: _videoStreamManager.recording
property bool _videoStreamCanShoot: _videoStreamIsStreaming
property bool _videoStreamIsShootingInCurrentMode: _videoStreamInPhotoMode ? !_videoStreamPhotoCaptureIsIdle : _videoStreamRecording
property bool _videoStreamIsShootingInCurrentMode: _videoStreamInPhotoMode ? !_simplePhotoCaptureIsIdle : _videoStreamRecording
property bool _videoStreamInPhotoMode: false
property bool _onlyVideoStreamAvailable: !_mavlinkCamera && _videoStreamManager.hasVideo
// The following properties relate to a mavlink protocol camera
property var _mavlinkCameraManager: _activeVehicle ? _activeVehicle.cameraManager : null
@ -51,6 +56,7 @@ Rectangle { @@ -51,6 +56,7 @@ Rectangle {
property bool _noMavlinkCameras: _mavlinkCameraManager ? _mavlinkCameraManager.cameras.count === 0 : true
property var _mavlinkCamera: !_noMavlinkCameras ? (_mavlinkCameraManager.cameras.get(_mavlinkCameraManagerCurCameraIndex) && _mavlinkCameraManager.cameras.get(_mavlinkCameraManagerCurCameraIndex).paramComplete ? _mavlinkCameraManager.cameras.get(_mavlinkCameraManagerCurCameraIndex) : null) : null
property bool _multipleMavlinkCameras: _mavlinkCameraManager ? _mavlinkCameraManager.cameras.count > 1 : false
property string _mavlinkCameraName: _mavlinkCamera && _multipleMavlinkCameras ? _mavlinkCamera.modelName : ""
property bool _noMavlinkCameraStreams: _mavlinkCamera ? _mavlinkCamera.streamLabels.length : true
property bool _multipleMavlinkCameraStreams: _mavlinkCamera ? _mavlinkCamera.streamLabels.length > 1 : false
property int _mavlinCameraCurStreamIndex: _mavlinkCamera ? _mavlinkCamera.currentStream : -1
@ -72,15 +78,18 @@ Rectangle { @@ -72,15 +78,18 @@ Rectangle {
// The following settings and functions unify between a mavlink camera and a simple video stream for simple access
property bool _anyVideoStreamAvailable: _videoStreamManager.hasVideo
property string _mavlinkCameraName: _mavlinkCamera ? (_multipleMavlinkCameras ? _mavlinkCamera.modelName : "") : qsTr("Video Stream")
property bool _showModeIndicator: _mavlinkCamera ? _mavlinkCameraHasModes : _onlyVideoStreamAvailable
property bool _modeIndicatorPhotoMode: _mavlinkCamera ? _mavlinkCameraInPhotoMode : _videoStreamInPhotoMode
property string _cameraName: _mavlinkCamera ? _mavlinkCameraName : ""
property bool _showModeIndicator: _mavlinkCamera ? _mavlinkCameraHasModes : _videoStreamManager.hasVideo
property bool _modeIndicatorPhotoMode: _mavlinkCamera ? _mavlinkCameraInPhotoMode : _videoStreamInPhotoMode || _onlySimpleCameraAvailable
property bool _allowsPhotoWhileRecording: _mavlinkCamera ? _mavlinkCameraAllowsPhotoWhileRecording : _videoStreamAllowsPhotoWhileRecording
property bool _switchToPhotoModeAllowed: !_modeIndicatorPhotoMode && (_mavlinkCamera ? !_mavlinkCameraIsShooting : true)
property bool _switchToVideoModeAllowed: _modeIndicatorPhotoMode && (_mavlinkCamera ? !_mavlinkCameraIsShooting : true)
property bool _videoIsRecording: _mavlinkCamera ? _mavlinkCameraIsShooting : _videoStreamRecording
property bool _canShootInCurrentMode: _mavlinkCamera ? _mavlinkCameraCanShoot : _videoStreamCanShoot
property bool _isShootingInCurrentMode: _mavlinkCamera ? _mavlinkCameraIsShooting : _videoStreamIsShootingInCurrentMode
property bool _canShootInCurrentMode: _mavlinkCamera ? _mavlinkCameraCanShoot : _videoStreamCanShoot || _simpleCameraAvailable
property bool _isShootingInCurrentMode: _mavlinkCamera ? _mavlinkCameraIsShooting : _videoStreamIsShootingInCurrentMode || _simpleCameraIsShootingInCurrentMode
on_OnlySimpleCameraAvailableChanged: console.log("_onlySimpleCameraAvailable", _onlySimpleCameraAvailable, _modeIndicatorPhotoMode, _videoStreamInPhotoMode, _mavlinkCamera)
on_ModeIndicatorPhotoModeChanged: console.log("_modeIndicatorPhotoMode", _modeIndicatorPhotoMode)
function setCameraMode(photoMode) {
_videoStreamInPhotoMode = photoMode
@ -94,6 +103,7 @@ Rectangle { @@ -94,6 +103,7 @@ Rectangle {
}
function toggleShooting() {
console.log("toggleShooting", _anyVideoStreamAvailable)
if (_mavlinkCamera) {
if(_mavlinkCameraInVideoMode) {
_mavlinkCamera.toggleVideo()
@ -104,11 +114,15 @@ Rectangle { @@ -104,11 +114,15 @@ Rectangle {
_mavlinkCamera.takePhoto()
}
}
} else {
} else if (_onlySimpleCameraAvailable || (_simpleCameraAvailable && _anyVideoStreamAvailable && _videoStreamInPhotoMode && !videoGrabRadio.checked)) {
_simplePhotoCaptureIsIdle = false
_activeVehicle.triggerSimpleCamera()
simplePhotoCaptureTimer.start()
} else if (_anyVideoStreamAvailable) {
if (_videoStreamInPhotoMode) {
_videoStreamPhotoCaptureIsIdle = false
_simplePhotoCaptureIsIdle = false
_videoStreamManager.grabImage()
videoStreamPhotoCaptureTimer.start()
simplePhotoCaptureTimer.start()
} else {
if (_videoStreamManager.recording) {
_videoStreamManager.stopRecording()
@ -120,9 +134,9 @@ Rectangle { @@ -120,9 +134,9 @@ Rectangle {
}
Timer {
id: videoStreamPhotoCaptureTimer
id: simplePhotoCaptureTimer
interval: 500
onTriggered: _videoStreamPhotoCaptureIsIdle = true
onTriggered: _simplePhotoCaptureIsIdle = true
}
QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
@ -138,6 +152,7 @@ Rectangle { @@ -138,6 +152,7 @@ Rectangle {
sourceSize.height: height
color: qgcPal.text
fillMode: Image.PreserveAspectFit
visible: !_onlySimpleCameraAvailable
QGCMouseArea {
fillItem: parent
@ -216,6 +231,23 @@ Rectangle { @@ -216,6 +231,23 @@ Rectangle {
}
}
RowLayout {
Layout.alignment: Qt.AlignHCenter
spacing: 0
visible: _showModeIndicator && !_mavlinkCamera && _simpleCameraAvailable && _videoStreamInPhotoMode
QGCRadioButton {
id: videoGrabRadio
font.pointSize: ScreenTools.smallFontPointSize
text: qsTr("Video Grab")
}
QGCRadioButton {
font.pointSize: ScreenTools.smallFontPointSize
text: qsTr("Camera Trigger")
checked: true
}
}
// Take Photo, Start/Stop Video button
// IMPORTANT: This control supports both mavlink cameras and simple video streams. Do no reference anything here which is not
// using the unified properties/functions.
@ -250,8 +282,8 @@ Rectangle { @@ -250,8 +282,8 @@ Rectangle {
QGCLabel {
Layout.alignment: Qt.AlignHCenter
text: _mavlinkCameraName
visible: _mavlinkCameraName !== ""
text: _cameraName
visible: _cameraName !== ""
}
QGCLabel {
Layout.alignment: Qt.AlignHCenter
@ -261,9 +293,9 @@ Rectangle { @@ -261,9 +293,9 @@ Rectangle {
}
QGCLabel {
Layout.alignment: Qt.AlignHCenter
text: _activeVehicle && _mavlinkCameraInPhotoMode ? ('00000' + _activeVehicle.cameraTriggerPoints.count).slice(-5) : "0000_mavlinkCameraPhotoMode0"
text: _activeVehicle ? ('00000' + _activeVehicle.cameraTriggerPoints.count).slice(-5) : "00000"
font.pointSize: ScreenTools.largeFontPointSize
visible: _mavlinkCameraInPhotoMode
visible: _modeIndicatorPhotoMode
}
QGCLabel {
Layout.alignment: Qt.AlignHCenter

11
src/QmlControls/QGCRadioButton.qml

@ -7,9 +7,10 @@ import QGroundControl.ScreenTools 1.0 @@ -7,9 +7,10 @@ import QGroundControl.ScreenTools 1.0
RadioButton {
id: control
font.family: ScreenTools.normalFontFamily
font.pointSize: ScreenTools.defaultFontPointSize
property color textColor: _qgcPal.text
property bool textBold: false
property real textFontPointSize: ScreenTools.defaultFontPointSize
property var _qgcPal: QGCPalette { colorGroupEnabled: enabled }
property bool _noText: text === ""
@ -36,9 +37,9 @@ RadioButton { @@ -36,9 +37,9 @@ RadioButton {
contentItem: Text {
text: control.text
font.family: ScreenTools.normalFontFamily
font.pointSize: textFontPointSize
font.bold: control.textBold
font.family: control.font.pointSize
font.pointSize: control.font.pointSize
font.bold: control.font.bold
color: control.textColor
opacity: enabled ? 1.0 : 0.3
verticalAlignment: Text.AlignVCenter

6
src/Settings/FlyView.SettingsGroup.json

@ -48,6 +48,12 @@ @@ -48,6 +48,12 @@
"default": false
},
{
"name": "showSimpleCameraControl",
"shortDesc": "Show controls for camera triggering using MAV_CMD_DO_DIGICAM_CONTROL.",
"type": "bool",
"default": true
},
{
"name": "maxGoToLocationDistance",
"shortDesc": "Maximum distance allowed for Go To Location.",
"type": "double",

1
src/Settings/FlyViewSettings.cc

@ -25,3 +25,4 @@ DECLARE_SETTINGSFACT(FlyViewSettings, showAdditionalIndicatorsCompass) @@ -25,3 +25,4 @@ DECLARE_SETTINGSFACT(FlyViewSettings, showAdditionalIndicatorsCompass)
DECLARE_SETTINGSFACT(FlyViewSettings, lockNoseUpCompass)
DECLARE_SETTINGSFACT(FlyViewSettings, maxGoToLocationDistance)
DECLARE_SETTINGSFACT(FlyViewSettings, keepMapCenteredOnVehicle)
DECLARE_SETTINGSFACT(FlyViewSettings, showSimpleCameraControl)

1
src/Settings/FlyViewSettings.h

@ -27,4 +27,5 @@ public: @@ -27,4 +27,5 @@ public:
DEFINE_SETTINGFACT(lockNoseUpCompass)
DEFINE_SETTINGFACT(maxGoToLocationDistance)
DEFINE_SETTINGFACT(keepMapCenteredOnVehicle)
DEFINE_SETTINGFACT(showSimpleCameraControl)
};

9
src/Vehicle/Vehicle.cc

@ -3826,3 +3826,12 @@ void Vehicle::sendJoystickDataThreadSafe(float roll, float pitch, float yaw, flo @@ -3826,3 +3826,12 @@ void Vehicle::sendJoystickDataThreadSafe(float roll, float pitch, float yaw, flo
sendMessageOnLinkThreadSafe(sharedLink.get(), message);
}
}
void Vehicle::triggerSimpleCamera()
{
sendMavCommand(_defaultComponentId,
MAV_CMD_DO_DIGICAM_CONTROL,
true, // show errors
0.0, 0.0, 0.0, 0.0, // param 1-4 unused
1.0); // trigger camera
}

3
src/Vehicle/Vehicle.h

@ -391,6 +391,9 @@ public: @@ -391,6 +391,9 @@ public:
/// Removes the vehicle from the system
Q_INVOKABLE void closeVehicle(void) { _vehicleLinkManager->closeVehicle(); }
/// Trigger camera using MAV_CMD_DO_DIGICAM_CONTROL command
Q_INVOKABLE void triggerSimpleCamera(void);
#if !defined(NO_ARDUPILOT_DIALECT)
Q_INVOKABLE void flashBootloader();
#endif

4
src/VehicleSetup/FirmwareUpgrade.qml

@ -329,7 +329,7 @@ SetupPage { @@ -329,7 +329,7 @@ SetupPage {
QGCRadioButton {
id: px4FlightStackRadio
text: qsTr("PX4 Pro ")
textBold: _defaultFirmwareIsPX4
font.bold: _defaultFirmwareIsPX4
checked: _defaultFirmwareIsPX4
visible: !_singleFirmwareMode && !px4Flow && QGroundControl.apmFirmwareSupported
@ -342,7 +342,7 @@ SetupPage { @@ -342,7 +342,7 @@ SetupPage {
QGCRadioButton {
id: apmFlightStack
text: qsTr("ArduPilot")
textBold: !_defaultFirmwareIsPX4
font.bold: !_defaultFirmwareIsPX4
checked: !_defaultFirmwareIsPX4
visible: !_singleFirmwareMode && !px4Flow && QGroundControl.apmFirmwareSupported

10
src/ui/preferences/GeneralSettings.qml

@ -156,6 +156,7 @@ Rectangle { @@ -156,6 +156,7 @@ Rectangle {
property Fact _alternateInstrumentPanel: QGroundControl.settingsManager.flyViewSettings.alternateInstrumentPanel
}
FactCheckBox {
text: qsTr("Show additional heading indicators on Compass")
visible: _showAdditionalIndicatorsCompass.visible
@ -163,6 +164,7 @@ Rectangle { @@ -163,6 +164,7 @@ Rectangle {
property Fact _showAdditionalIndicatorsCompass: QGroundControl.settingsManager.flyViewSettings.showAdditionalIndicatorsCompass
}
FactCheckBox {
text: qsTr("Lock Compass Nose-Up")
visible: _lockNoseUpCompass.visible
@ -171,6 +173,14 @@ Rectangle { @@ -171,6 +173,14 @@ Rectangle {
property Fact _lockNoseUpCompass: QGroundControl.settingsManager.flyViewSettings.lockNoseUpCompass
}
FactCheckBox {
text: qsTr("Show simple camera controls (DIGICAM_CONTROL)")
visible: _showDumbCameraControl.visible
fact: _showDumbCameraControl
property Fact _showDumbCameraControl: QGroundControl.settingsManager.flyViewSettings.showSimpleCameraControl
}
GridLayout {
columns: 2

Loading…
Cancel
Save