/**************************************************************************** * * (c) 2009-2016 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ import QtQuick 2.7 import QtQuick.Controls 2.1 import QtQuick.Controls.Styles 1.2 import QtQuick.Layouts 1.3 import QtGraphicalEffects 1.0 import QGroundControl 1.0 import QGroundControl.FactSystem 1.0 import QGroundControl.FactControls 1.0 import QGroundControl.Controls 1.0 import QGroundControl.ScreenTools 1.0 SetupPage { id: cameraPage pageComponent: pageComponent Component { id: pageComponent Column { width: availableWidth FactPanelController { id: controller; factPanel: cameraPage.viewPanel } property real _margins: ScreenTools.defaultFontPixelHeight property real _middleRowWidth: ScreenTools.defaultFontPixelWidth * 16 property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 16 property Fact _camTriggerMode: controller.getParameterFact(-1, "TRIG_MODE") property Fact _camTriggerInterface: controller.getParameterFact(-1, "TRIG_INTERFACE", false) property Fact _camTriggerPol: controller.getParameterFact(-1, "TRIG_POLARITY", false) // Don't bitch about missing as these only exist if trigger mode is enabled property Fact _auxPins: controller.getParameterFact(-1, "TRIG_PINS", false) // Ditto property bool _rebooting: false property var _auxChannels: [ 0, 0, 0, 0, 0, 0] function clearAuxArray() { for(var i = 0; i < 6; i++) { _auxChannels[i] = 0 } } function setAuxPins() { if(_auxPins) { var values = "" for(var i = 0; i < 6; i++) { if(_auxChannels[i]) { values += ((i+1).toString()) } } _auxPins.value = parseInt(values) } } Component.onCompleted: { if(_auxPins) { clearAuxArray() var values = _auxPins.value.toString() for(var i = 0; i < values.length; i++) { var b = parseInt(values[i]) - 1 if(b >= 0 && b < 6) { _auxChannels[b] = 1 } } } } Item { id: applyAndRestart visible: false anchors.left: parent.left anchors.right: parent.right anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 10 anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 10 height: applyButton.height QGCLabel { anchors.left: parent.left text: qsTr("Vehicle must be restarted for changes to take effect. ") } QGCButton { id: applyButton anchors.right: parent.right text: qsTr("Apply and Restart") onClicked: { //-- This will reboot the vehicle! We're set not to allow changes if armed. QGroundControl.multiVehicleManager.activeVehicle.rebootVehicle() applyAndRestart.visible = false _rebooting = true } } } Column { id: mainCol spacing: _margins anchors.horizontalCenter: parent.horizontalCenter /* **** Camera Trigger **** */ QGCLabel { text: qsTr("Camera Trigger Settings") font.family: ScreenTools.demiboldFontFamily } Rectangle { id: camTrigRect color: qgcPal.windowShade width: camTrigRow.width + _margins * 2 height: camTrigRow.height + _margins * 2 Row { id: camTrigRow spacing: _margins anchors.verticalCenter: parent.verticalCenter Item { width: _margins * 0.5; height: 1; } QGCColoredImage { color: qgcPal.text height: ScreenTools.defaultFontPixelWidth * 10 width: ScreenTools.defaultFontPixelWidth * 20 sourceSize.width: width mipmap: true fillMode: Image.PreserveAspectFit source: "/qmlimages/CameraTrigger.svg" anchors.verticalCenter: parent.verticalCenter } Item { width: _margins * 0.5; height: 1; } Column { spacing: _margins * 0.5 anchors.verticalCenter: parent.verticalCenter Row { QGCLabel { anchors.baseline: camTrigCombo.baseline width: _middleRowWidth text: qsTr("Trigger mode:") } FactComboBox { id: camTrigCombo width: _editFieldWidth fact: _camTriggerMode indexModel: false enabled: !_rebooting onActivated: { applyAndRestart.visible = true } } } Row { visible: _camTriggerInterface ? true : false QGCLabel { anchors.baseline: camInterfaceCombo.baseline width: _middleRowWidth text: qsTr("Trigger interface:") } FactComboBox { id: camInterfaceCombo width: _editFieldWidth fact: _camTriggerInterface indexModel: false enabled: !_rebooting onActivated: { applyAndRestart.visible = true } } } Row { QGCLabel { text: qsTr("Time Interval") width: _middleRowWidth anchors.baseline: timeIntervalField.baseline color: qgcPal.text } FactTextField { id: timeIntervalField fact: controller.getParameterFact(-1, "TRIG_INTERVAL", false) showUnits: true width: _editFieldWidth enabled: _auxPins && _camTriggerMode.value === 2 } } Row { QGCLabel { text: qsTr("Distance Interval") width: _middleRowWidth anchors.baseline: trigDistField.baseline color: qgcPal.text } FactTextField { id: trigDistField fact: controller.getParameterFact(-1, "TRIG_DISTANCE", false) showUnits: true width: _editFieldWidth enabled: _auxPins && _camTriggerMode.value === 3 } } } } } /* **** Camera Hardware **** */ Item { width: 1; height: _margins * 0.5; } QGCLabel { text: qsTr("Hardware Settings") font.family: ScreenTools.demiboldFontFamily visible: _auxPins } Rectangle { color: qgcPal.windowShade width: camTrigRect.width height: camHardwareRow.height + _margins * 2 visible: _auxPins Row { id: camHardwareRow spacing: _margins anchors.verticalCenter: parent.verticalCenter Item { width: _margins * 0.5; height: 1; } Item { height: ScreenTools.defaultFontPixelWidth * 10 width: ScreenTools.defaultFontPixelWidth * 20 Column { spacing: ScreenTools.defaultFontPixelHeight anchors.centerIn: parent QGCLabel { text: "AUX Pin Assignment" anchors.horizontalCenter: parent.horizontalCenter } Row { spacing: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter Repeater { model: _auxChannels Column { spacing: ScreenTools.defaultFontPixelWidth * 0.5 QGCLabel { text: model.index + 1 color: qgcPal.text anchors.horizontalCenter: parent.horizontalCenter } Rectangle { id: auxPin width: ScreenTools.defaultFontPixelWidth * 2 height: ScreenTools.defaultFontPixelWidth * 2 border.color: qgcPal.text color: { if(_auxPins) { var pins = _auxPins.value.toString() var pin = (model.index + 1).toString() if(pins.indexOf(pin) < 0) return qgcPal.windowShadeDark else return "green" } else { return qgcPal.windowShade } } MouseArea { anchors.fill: parent onClicked: { _auxChannels[model.index] = 1 - _auxChannels[model.index] auxPin.color = _auxChannels[model.index] ? "green" : qgcPal.windowShadeDark setAuxPins() } } } } } } } } Item { width: _margins * 0.5; height: 1; } Column { visible: !_camTriggerInterface || (_camTriggerInterface.value === 1) spacing: _margins * 0.5 anchors.verticalCenter: parent.verticalCenter QGCLabel { id: returnHomeLabel text: "Trigger Pin Polarity:" } Row { Item { height: 1; width: _margins; } Column { spacing: _margins * 0.5 ExclusiveGroup { id: polarityGroup } QGCRadioButton { checked: _camTriggerPol && _camTriggerPol.value === 0 exclusiveGroup: polarityGroup text: "Low (0V)" onClicked: { if(_camTriggerPol) { _camTriggerPol.value = 0 } } } QGCRadioButton { checked: _camTriggerPol && _camTriggerPol.value > 0 exclusiveGroup: polarityGroup text: "High (3.3V)" onClicked: { if(_camTriggerPol) { _camTriggerPol.value = 1 } } } } } Item { width: 1; height: _margins * 0.5; } Row { QGCLabel { text: qsTr("Trigger Period") width: _middleRowWidth anchors.baseline: trigPeriodField.baseline color: qgcPal.text } FactTextField { id: trigPeriodField fact: controller.getParameterFact(-1, "TRIG_ACT_TIME", false) showUnits: true width: _editFieldWidth } } } } } } } } }