diff --git a/custom-example/custom.qrc b/custom-example/custom.qrc index 8b2ffc7bf9e80bb1d6843493ad842161cde51450..ad84746e072c969ce10f22027e0265e530598a2b 100644 --- a/custom-example/custom.qrc +++ b/custom-example/custom.qrc @@ -27,6 +27,10 @@ res/Images/horizontal_speed.svg res/Images/microSD.svg res/Images/odometer.svg + res/images/thermal-brightness.svg + res/images/thermal-palette.svg + res/images/thermal-pip.svg + res/images/thermal-standard.svg res/Images/vertical_speed.svg res/Images/void.png diff --git a/custom-example/res/CustomCameraControl.qml b/custom-example/res/CustomCameraControl.qml index 7a0225d73b940180ee1822179cde7f5abc13668e..aa767e9cc35f4772253d5e846a82499a7f0d4e60 100644 --- a/custom-example/res/CustomCameraControl.qml +++ b/custom-example/res/CustomCameraControl.qml @@ -30,11 +30,14 @@ import CustomQuickInterface 1.0 import Custom.Widgets 1.0 Item { - height: cameraRect.height - width: cameraRect.width + (ScreenTools.defaultFontPixelWidth * 2) + height: mainColumn.height + width: mainColumn.width + (ScreenTools.defaultFontPixelWidth * 2) visible: !QGroundControl.videoManager.fullScreen - readonly property string _commLostStr: qsTr("NO CAMERA") + readonly property string _commLostStr: qsTr("NO CAMERA") + readonly property real buttonSize: ScreenTools.defaultFontPixelWidth * 4 + readonly property real buttonRadius: ScreenTools.defaultFontPixelWidth * 0.5 + readonly property real iconRatio: 0.666 property real _spacers: ScreenTools.defaultFontPixelHeight property real _labelFieldWidth: ScreenTools.defaultFontPixelWidth * 28 @@ -56,6 +59,8 @@ Item { property bool _recordingVideo: _cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING property bool _settingsEnabled: !_communicationLost && _camera && _camera.cameraMode !== QGCCameraControl.CAM_MODE_UNDEFINED && _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_IDLE && !_recordingVideo property bool _hasZoom: _camera && _camera.hasZoom + property Fact _evFact: _camera ? _camera.ev : null + property Fact _irPaletteFact: _camera ? _camera.irPalette : null Connections { target: QGroundControl.multiVehicleManager.activeVehicle @@ -70,234 +75,348 @@ Item { anchors.fill: parent } - Rectangle { - id: cameraRect - height: cameraCol.height - width: cameraCol.width + (ScreenTools.defaultFontPixelWidth * 4) - color: qgcPal.windowShade - radius: ScreenTools.defaultFontPixelWidth * 0.5 - Column { - id: cameraCol - spacing: _spacers - anchors.centerIn: parent - Item { - height: 1 - width: 1 - } - //----------------------------------------------------------------- - //-- Camera Name - QGCLabel { - text: activeVehicle ? (_camera && _camera.modelName !== "" ? _camera.modelName : _commLostStr) : _commLostStr - font.pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter + //------------------------------------------------------------------------- + //-- Main Column + Column { + id: mainColumn + spacing: ScreenTools.defaultFontPixelHeight + anchors.centerIn: parent + //--------------------------------------------------------------------- + //-- Quick Thermal Modes + Rectangle { + id: backgroundRect + width: buttonsRow.width + (ScreenTools.defaultFontPixelWidth * 4) + height: buttonsRow.height + (ScreenTools.defaultFontPixelHeight) + color: qgcPal.windowShade + radius: height * 0.5 + visible: _camera && _camera.modelName === "DSC-QX30" && QGroundControl.videoManager.hasThermal + anchors.horizontalCenter: parent.horizontalCenter + ButtonGroup { + id: buttonGroup + exclusive: true + buttons: buttonsRow.children } - //----------------------------------------------------------------- - //-- Camera Mode - Item { - width: modeCol.width - height: modeCol.height - anchors.horizontalCenter: parent.horizontalCenter - Column { - id: modeCol - spacing: _spacers * 0.5 + Row { + id: buttonsRow + spacing: ScreenTools.defaultFontPixelWidth * 0.25 + anchors.centerIn: parent + //-- Standard + QGCHoverButton { + width: buttonSize + height: width + checkable: true + radius: buttonRadius + onClicked: { + _camera.thermalMode = QGCCameraControl.THERMAL_OFF + //-- Restore EV to 0 + if(_evFact) { + _evFact.value = 6 + } + } QGCColoredImage { - height: ScreenTools.defaultFontPixelHeight * 1.25 - width: height - source: (_cameraModeUndefined || _cameraPhotoMode) ? "/custom/img/camera_photo.svg" : "/custom/img/camera_video.svg" - color: qgcPal.text - fillMode: Image.PreserveAspectFit + source: "/custom/img/thermal-standard.svg" + color: parent.checked ? qgcPal.buttonHighlightText : qgcPal.buttonText + width: parent.width * iconRatio + height: width + anchors.centerIn: parent sourceSize.height: height - anchors.horizontalCenter: parent.horizontalCenter - } - QGCLabel { - text: _cameraVideoMode ? qsTr("Video") : qsTr("Photo") - font.pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter } } - MouseArea { - anchors.fill: parent - enabled: !_cameraModeUndefined && _camera && _camera.videoStatus !== QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING && _cameraPhotoIdle - onClicked: { - _camera.toggleMode() + //-- PIP + QGCHoverButton { + width: buttonSize + height: width + checkable: true + radius: buttonRadius + onClicked: _camera.thermalMode = QGCCameraControl.THERMAL_PIP + QGCColoredImage { + source: "/custom/img/thermal-pip.svg" + color: parent.checked ? qgcPal.buttonHighlightText : qgcPal.buttonText + width: parent.width * iconRatio + height: width + anchors.centerIn: parent + sourceSize.height: height } } - } - //----------------------------------------------------------------- - //-- Shutter - Rectangle { - color: Qt.rgba(0,0,0,0) - width: height - height: ScreenTools.defaultFontPixelHeight * 4 - radius: width * 0.5 - border.color: qgcPal.buttonText - border.width: 2 - anchors.horizontalCenter: parent.horizontalCenter - Rectangle { - width: parent.width * 0.75 + // Visual with high brightness + QGCHoverButton { + width: buttonSize height: width - radius: width * 0.5 - color: _cameraModeUndefined ? qgcPal.colorGrey : ( _cameraVideoMode ? qgcPal.colorRed : qgcPal.text ) - visible: !pauseVideo.visible - anchors.centerIn: parent + checkable: true + radius: buttonRadius + onClicked: { + _camera.thermalMode = QGCCameraControl.THERMAL_OFF + //-- Set EV to +1.3 + if(_evFact) { + _evFact.value = 10 + } + } QGCColoredImage { - id: busyIndicator - height: parent.height * 0.75 - width: height - source: "/qmlimages/MapSync.svg" + source: "/custom/img/thermal-brightness.svg" + color: parent.checked ? qgcPal.buttonHighlightText : qgcPal.buttonText + width: parent.width * iconRatio + height: width + anchors.centerIn: parent sourceSize.height: height - fillMode: Image.PreserveAspectFit - mipmap: true - smooth: true - color: qgcPal.windowShade - visible: { - if(_cameraPhotoMode && !_cameraPhotoIdle && !_cameraElapsedMode) { - return true + } + } + // Thermal with color-map + QGCHoverButton { + width: buttonSize + height: width + checkable: true + radius: buttonRadius + onClicked: { + if(_irPaletteFact) { + var entryIdx = _irPaletteFact.enumStrings.find("Rainbow") + if(entryIdx !== undefined) { + _irPaletteFact.value = entryIdx; } - return false + _camera.thermalMode = QGCCameraControl.THERMAL_FULL } + } + QGCColoredImage { + source: "/custom/img/thermal-palette.svg" + color: parent.checked ? qgcPal.buttonHighlightText : qgcPal.buttonText + width: parent.width * iconRatio + height: width anchors.centerIn: parent - RotationAnimation on rotation { - loops: Animation.Infinite - from: 360 - to: 0 - duration: 740 - running: busyIndicator.visible + sourceSize.height: height + } + } + } + } + //--------------------------------------------------------------------- + //-- Main Camera Control + Rectangle { + id: cameraRect + height: cameraCol.height + width: cameraCol.width + (ScreenTools.defaultFontPixelWidth * 4) + color: qgcPal.windowShade + radius: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.horizontalCenter: parent.horizontalCenter + Column { + id: cameraCol + spacing: _spacers + anchors.centerIn: parent + Item { + height: 1 + width: 1 + } + //----------------------------------------------------------------- + //-- Camera Name + QGCLabel { + text: activeVehicle ? (_camera && _camera.modelName !== "" ? _camera.modelName : _commLostStr) : _commLostStr + font.pointSize: ScreenTools.smallFontPointSize + anchors.horizontalCenter: parent.horizontalCenter + } + //----------------------------------------------------------------- + //-- Camera Mode + Item { + width: modeCol.width + height: modeCol.height + anchors.horizontalCenter: parent.horizontalCenter + Column { + id: modeCol + spacing: _spacers * 0.5 + QGCColoredImage { + height: ScreenTools.defaultFontPixelHeight * 1.25 + width: height + source: (_cameraModeUndefined || _cameraPhotoMode) ? "/custom/img/camera_photo.svg" : "/custom/img/camera_video.svg" + color: qgcPal.text + fillMode: Image.PreserveAspectFit + sourceSize.height: height + anchors.horizontalCenter: parent.horizontalCenter + } + QGCLabel { + text: _cameraVideoMode ? qsTr("Video") : qsTr("Photo") + font.pointSize: ScreenTools.smallFontPointSize + anchors.horizontalCenter: parent.horizontalCenter } } - QGCLabel { - text: _camera ? _camera.photoLapse.toFixed(0) + 's' : qsTr('N/A') - font.family: ScreenTools.demiboldFontFamily - color: qgcPal.colorBlue - visible: _cameraElapsedMode - anchors.centerIn: parent + MouseArea { + anchors.fill: parent + enabled: !_cameraModeUndefined && _camera && _camera.videoStatus !== QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING && _cameraPhotoIdle + onClicked: { + _camera.toggleMode() + } } } + //----------------------------------------------------------------- + //-- Shutter Rectangle { - id: pauseVideo - width: parent.width * 0.5 - height: width - color: _cameraModeUndefined ? qgcPal.colorGrey : qgcPal.colorRed - visible: { - if(_cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) { - return true - } - if(_cameraPhotoMode) { - if(_camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IDLE || _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IN_PROGRESS) { + color: Qt.rgba(0,0,0,0) + width: height + height: ScreenTools.defaultFontPixelHeight * 4 + radius: width * 0.5 + border.color: qgcPal.buttonText + border.width: 2 + anchors.horizontalCenter: parent.horizontalCenter + Rectangle { + width: parent.width * 0.75 + height: width + radius: width * 0.5 + color: _cameraModeUndefined ? qgcPal.colorGrey : ( _cameraVideoMode ? qgcPal.colorRed : qgcPal.text ) + visible: !pauseVideo.visible + anchors.centerIn: parent + QGCColoredImage { + id: busyIndicator + height: parent.height * 0.75 + width: height + source: "/qmlimages/MapSync.svg" + sourceSize.height: height + fillMode: Image.PreserveAspectFit + mipmap: true + smooth: true + color: qgcPal.windowShade + visible: { + if(_cameraPhotoMode && !_cameraPhotoIdle && !_cameraElapsedMode) { + return true + } + return false + } + anchors.centerIn: parent + RotationAnimation on rotation { + loops: Animation.Infinite + from: 360 + to: 0 + duration: 740 + running: busyIndicator.visible + } + } + QGCLabel { + text: _camera ? _camera.photoLapse.toFixed(0) + 's' : qsTr('N/A') + font.family: ScreenTools.demiboldFontFamily + color: qgcPal.colorBlue + visible: _cameraElapsedMode + anchors.centerIn: parent + } + } + Rectangle { + id: pauseVideo + width: parent.width * 0.5 + height: width + color: _cameraModeUndefined ? qgcPal.colorGrey : qgcPal.colorRed + visible: { + if(_cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) { return true } - } - return false + if(_cameraPhotoMode) { + if(_camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IDLE || _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IN_PROGRESS) { + return true + } + } + return false + } + anchors.centerIn: parent } - anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - enabled: !_noSdCard - onClicked: { - if(_cameraVideoMode) { - if(_camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) { - _camera.stopVideo() - } else { - if(!_fullSD) { - _camera.startVideo() + MouseArea { + anchors.fill: parent + enabled: !_noSdCard + onClicked: { + if(_cameraVideoMode) { + if(_camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) { + _camera.stopVideo() + } else { + if(!_fullSD) { + _camera.startVideo() + } } - } - } else { - if(_camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IDLE || _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IN_PROGRESS) { - _camera.stopTakePhoto() } else { - if(!_fullSD) { - _camera.takePhoto() + if(_camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IDLE || _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IN_PROGRESS) { + _camera.stopTakePhoto() + } else { + if(!_fullSD) { + _camera.takePhoto() + } } } } } } - } - //----------------------------------------------------------------- - //-- Settings - Item { - width: settingsCol.width - height: settingsCol.height - anchors.horizontalCenter: parent.horizontalCenter - Column { - id: settingsCol - spacing: _spacers * 0.5 + //----------------------------------------------------------------- + //-- Settings + Item { + width: settingsCol.width + height: settingsCol.height anchors.horizontalCenter: parent.horizontalCenter + Column { + id: settingsCol + spacing: _spacers * 0.5 + anchors.horizontalCenter: parent.horizontalCenter + QGCColoredImage { + width: ScreenTools.defaultFontPixelHeight * 1.25 + height: width + sourceSize.width: width + source: "qrc:/custom/img/camera_settings.svg" + color: qgcPal.text + fillMode: Image.PreserveAspectFit + opacity: _settingsEnabled ? 1 : 0.5 + anchors.horizontalCenter: parent.horizontalCenter + } + QGCLabel { + text: qsTr("Settings") + font.pointSize: ScreenTools.smallFontPointSize + anchors.horizontalCenter: parent.horizontalCenter + } + } + MouseArea { + anchors.fill: parent + enabled: _settingsEnabled + onClicked: { + cameraSettings.open() + } + } + } + //----------------------------------------------------------------- + //-- microSD Card + Column { + spacing: _spacers * 0.5 + anchors.horizontalCenter: parent.horizontalCenter QGCColoredImage { width: ScreenTools.defaultFontPixelHeight * 1.25 height: width sourceSize.width: width - source: "qrc:/custom/img/camera_settings.svg" + source: "qrc:/custom/img/microSD.svg" color: qgcPal.text fillMode: Image.PreserveAspectFit opacity: _settingsEnabled ? 1 : 0.5 anchors.horizontalCenter: parent.horizontalCenter } QGCLabel { - text: qsTr("Settings") - font.pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - } - MouseArea { - anchors.fill: parent - enabled: _settingsEnabled - onClicked: { - cameraSettings.open() + text: { + if(_noSdCard) return qsTr("NONE") + if(_fullSD) return qsTr("FULL") + return _camera ? _camera.storageFreeStr : "" + } + color: (_noSdCard || _fullSD) ? qgcPal.colorOrange : qgcPal.text + font.pointSize: ScreenTools.smallFontPointSize + anchors.horizontalCenter: parent.horizontalCenter } } - } - //----------------------------------------------------------------- - //-- microSD Card - Column { - spacing: _spacers * 0.5 - anchors.horizontalCenter: parent.horizontalCenter - QGCColoredImage { - width: ScreenTools.defaultFontPixelHeight * 1.25 - height: width - sourceSize.width: width - source: "qrc:/custom/img/microSD.svg" - color: qgcPal.text - fillMode: Image.PreserveAspectFit - opacity: _settingsEnabled ? 1 : 0.5 - anchors.horizontalCenter: parent.horizontalCenter + /* + //----------------------------------------------------------------- + //-- Recording Time / Images Captured + CustomLabel { + text: (_cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) ? _camera.recordTimeStr : "00:00:00" + visible: _cameraVideoMode + pointSize: ScreenTools.smallFontPointSize + anchors.horizontalCenter: parent.horizontalCenter } - QGCLabel { - text: { - if(_noSdCard) return qsTr("NONE") - if(_fullSD) return qsTr("FULL") - return _camera ? _camera.storageFreeStr : "" - } - color: (_noSdCard || _fullSD) ? qgcPal.colorOrange : qgcPal.text - font.pointSize: ScreenTools.smallFontPointSize + CustomLabel { + text: activeVehicle && _cameraPhotoMode ? ('00000' + activeVehicle.cameraTriggerPoints.count).slice(-5) : "00000" + visible: _cameraPhotoMode + pointSize: ScreenTools.smallFontPointSize anchors.horizontalCenter: parent.horizontalCenter } - } - /* - //----------------------------------------------------------------- - //-- Recording Time / Images Captured - CustomLabel { - text: (_cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) ? _camera.recordTimeStr : "00:00:00" - visible: _cameraVideoMode - pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - CustomLabel { - text: activeVehicle && _cameraPhotoMode ? ('00000' + activeVehicle.cameraTriggerPoints.count).slice(-5) : "00000" - visible: _cameraPhotoMode - pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - */ - Item { - height: 1 - width: 1 + */ + Item { + height: 1 + width: 1 + } } } } - //------------------------------------------------------------------------- //-- Camera Settings Popup { diff --git a/custom-example/res/CustomFlyView.qml b/custom-example/res/CustomFlyView.qml index 08d1155bb0a04e4275645246aff342c5fa719935..548aafd61892fcc794d6678cdece85139b1e71c9 100644 --- a/custom-example/res/CustomFlyView.qml +++ b/custom-example/res/CustomFlyView.qml @@ -512,10 +512,9 @@ Item { Item { id: gimbalControl visible: camControlLoader.visible && CustomQuickInterface.showGimbalControl - anchors.top: camControlLoader.bottom - anchors.topMargin: height * -0.5 + anchors.bottom: camControlLoader.bottom anchors.right: camControlLoader.left - anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 2 + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * (QGroundControl.videoManager.hasThermal ? -4 : 2) height: parent.width * 0.125 width: height property real curPitch: 0 diff --git a/custom-example/res/Images/thermal-brightness.svg b/custom-example/res/Images/thermal-brightness.svg new file mode 100644 index 0000000000000000000000000000000000000000..7319222623413a122044321560331dd5df97ac17 --- /dev/null +++ b/custom-example/res/Images/thermal-brightness.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/custom-example/res/Images/thermal-palette.svg b/custom-example/res/Images/thermal-palette.svg new file mode 100644 index 0000000000000000000000000000000000000000..86154314242a9826f9004def7e4c5fdc69eb4bf0 --- /dev/null +++ b/custom-example/res/Images/thermal-palette.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/custom-example/res/Images/thermal-pip.svg b/custom-example/res/Images/thermal-pip.svg new file mode 100644 index 0000000000000000000000000000000000000000..22518b141a7cef29bb2209163466007438aaa7d7 --- /dev/null +++ b/custom-example/res/Images/thermal-pip.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/custom-example/res/Images/thermal-standard.svg b/custom-example/res/Images/thermal-standard.svg new file mode 100644 index 0000000000000000000000000000000000000000..b5ecc3cc31caf4b042411c7b508b18b555a0dd67 --- /dev/null +++ b/custom-example/res/Images/thermal-standard.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/custom-example/src/CustomPlugin.cc b/custom-example/src/CustomPlugin.cc index d09e09f68a880f40f96f06aae4f40f35309ad354..748cdbd9b34659071786b3189e900391d2897304 100644 --- a/custom-example/src/CustomPlugin.cc +++ b/custom-example/src/CustomPlugin.cc @@ -395,8 +395,8 @@ CustomPlugin::paletteOverride(QString colorName, QGCPalette::PaletteColorInfo_t& colorInfo[QGCPalette::Light][QGCPalette::ColorGroupDisabled] = QColor("#585858"); } else if (colorName == QStringLiteral("hoverColor")) { - colorInfo[QGCPalette::Dark][QGCPalette::ColorGroupEnabled] = QColor("#E7D8AE"); - colorInfo[QGCPalette::Dark][QGCPalette::ColorGroupDisabled] = QColor("#E7D8AE"); + colorInfo[QGCPalette::Dark][QGCPalette::ColorGroupEnabled] = QColor("#746D59"); + colorInfo[QGCPalette::Dark][QGCPalette::ColorGroupDisabled] = QColor("#746D59"); colorInfo[QGCPalette::Light][QGCPalette::ColorGroupEnabled] = QColor("#464f5a"); colorInfo[QGCPalette::Light][QGCPalette::ColorGroupDisabled] = QColor("#464f5a"); } diff --git a/custom-example/src/FirmwarePlugin/CustomCameraControl.cc b/custom-example/src/FirmwarePlugin/CustomCameraControl.cc index ff67b4d71f94a9dd8d8a1d5259fe9848040821d5..cbb74227cb4e1f297ee69377790fe366ed0540f8 100644 --- a/custom-example/src/FirmwarePlugin/CustomCameraControl.cc +++ b/custom-example/src/FirmwarePlugin/CustomCameraControl.cc @@ -17,11 +17,12 @@ QGC_LOGGING_CATEGORY(CustomCameraLog, "CustomCameraLog") QGC_LOGGING_CATEGORY(CustomCameraVerboseLog, "CustomCameraVerboseLog") +static const char* kCAM_IRPALETTE = "CAM_IRPALETTE"; + //----------------------------------------------------------------------------- CustomCameraControl::CustomCameraControl(const mavlink_camera_information_t *info, Vehicle* vehicle, int compID, QObject* parent) : QGCCameraControl(info, vehicle, compID, parent) { - connect(_vehicle, &Vehicle::mavlinkMessageReceived, this, &CustomCameraControl::_mavlinkMessageReceived); } //----------------------------------------------------------------------------- @@ -94,42 +95,15 @@ CustomCameraControl::_setVideoStatus(VideoStatus status) //----------------------------------------------------------------------------- void -CustomCameraControl::_mavlinkMessageReceived(const mavlink_message_t& message) +CustomCameraControl::handleCaptureStatus(const mavlink_camera_capture_status_t& cap) { - switch (message.msgid) { - case MAVLINK_MSG_ID_MOUNT_ORIENTATION: - _handleGimbalOrientation(message); - break; - } + QGCCameraControl::handleCaptureStatus(cap); } //----------------------------------------------------------------------------- -void -CustomCameraControl::_handleGimbalOrientation(const mavlink_message_t& message) +Fact* +CustomCameraControl::irPalette() { - mavlink_mount_orientation_t o; - mavlink_msg_mount_orientation_decode(&message, &o); - if(fabsf(_gimbalRoll - o.roll) > 0.5f) { - _gimbalRoll = o.roll; - emit gimbalRollChanged(); - } - if(fabsf(_gimbalPitch - o.pitch) > 0.5f) { - _gimbalPitch = o.pitch; - emit gimbalPitchChanged(); - } - if(fabsf(_gimbalYaw - o.yaw) > 0.5f) { - _gimbalYaw = o.yaw; - emit gimbalYawChanged(); - } - if(!_gimbalData) { - _gimbalData = true; - emit gimbalDataChanged(); - } + return (_paramComplete && _activeSettings.contains(kCAM_IRPALETTE)) ? getFact(kCAM_IRPALETTE) : nullptr; } -//----------------------------------------------------------------------------- -void -CustomCameraControl::handleCaptureStatus(const mavlink_camera_capture_status_t& cap) -{ - QGCCameraControl::handleCaptureStatus(cap); -} diff --git a/custom-example/src/FirmwarePlugin/CustomCameraControl.h b/custom-example/src/FirmwarePlugin/CustomCameraControl.h index b159c66b66b28e8fadb1addc552d926fdc3bb5ca..42ead7cad9d4ed65187eccb89b0aa1c0d9547b68 100644 --- a/custom-example/src/FirmwarePlugin/CustomCameraControl.h +++ b/custom-example/src/FirmwarePlugin/CustomCameraControl.h @@ -28,11 +28,9 @@ class CustomCameraControl : public QGCCameraControl public: CustomCameraControl(const mavlink_camera_information_t* info, Vehicle* vehicle, int compID, QObject* parent = nullptr); - Q_PROPERTY(qreal gimbalRoll READ gimbalRoll NOTIFY gimbalRollChanged) - Q_PROPERTY(qreal gimbalPitch READ gimbalPitch NOTIFY gimbalPitchChanged) - Q_PROPERTY(qreal gimbalYaw READ gimbalYaw NOTIFY gimbalYawChanged) - Q_PROPERTY(bool gimbalData READ gimbalData NOTIFY gimbalDataChanged) + Q_PROPERTY(Fact* irPalette READ irPalette NOTIFY parametersReady) + Fact* irPalette (); bool takePhoto () override; bool stopTakePhoto () override; bool startVideo () override; @@ -41,29 +39,7 @@ public: void setPhotoMode () override; void handleCaptureStatus (const mavlink_camera_capture_status_t& capStatus) override; - qreal gimbalRoll () { return static_cast(_gimbalRoll);} - qreal gimbalPitch () { return static_cast(_gimbalPitch); } - qreal gimbalYaw () { return static_cast(_gimbalYaw); } - bool gimbalData () { return _gimbalData; } - -private slots: - void _mavlinkMessageReceived (const mavlink_message_t& message); - -signals: - void gimbalRollChanged (); - void gimbalPitchChanged (); - void gimbalYawChanged (); - void gimbalDataChanged (); - protected: void _setVideoStatus (VideoStatus status) override; -private: - void _handleGimbalOrientation(const mavlink_message_t& message); - -private: - float _gimbalRoll = 0.0; - float _gimbalPitch = 0.0; - float _gimbalYaw = 0.0; - bool _gimbalData = false; };