12 changed files with 601 additions and 8 deletions
@ -0,0 +1,81 @@
@@ -0,0 +1,81 @@
|
||||
/*=====================================================================
|
||||
|
||||
QGroundControl Open Source Ground Control Station |
||||
|
||||
(c) 2009 - 2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||
|
||||
This file is part of the QGROUNDCONTROL project |
||||
|
||||
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
======================================================================*/ |
||||
|
||||
/// @file
|
||||
/// @brief The Camera VehicleComponent is used to setup the camera modes and hardware
|
||||
/// configuration to use it.
|
||||
/// @author Gus Grubba <mavlink@grubba.com>
|
||||
|
||||
#include "CameraComponent.h" |
||||
#include "PX4AutoPilotPlugin.h" |
||||
|
||||
CameraComponent::CameraComponent(Vehicle* vehicle, AutoPilotPlugin* autopilot, QObject* parent) : |
||||
VehicleComponent(vehicle, autopilot, parent), |
||||
_name(tr("Camera")) |
||||
{ |
||||
} |
||||
|
||||
QString CameraComponent::name(void) const |
||||
{ |
||||
return _name; |
||||
} |
||||
|
||||
QString CameraComponent::description(void) const |
||||
{ |
||||
return tr("The Camera is used to setup the camera modes and hardware configuration to use it."); |
||||
} |
||||
|
||||
QString CameraComponent::iconResource(void) const |
||||
{ |
||||
return "/qmlimages/CameraComponentIcon.png"; |
||||
} |
||||
|
||||
bool CameraComponent::requiresSetup(void) const |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
bool CameraComponent::setupComplete(void) const |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
QStringList CameraComponent::setupCompleteChangedTriggerList(void) const |
||||
{ |
||||
return QStringList(); |
||||
} |
||||
|
||||
QUrl CameraComponent::setupSource(void) const |
||||
{ |
||||
return QUrl::fromUserInput("qrc:/qml/CameraComponent.qml"); |
||||
} |
||||
|
||||
QUrl CameraComponent::summaryQmlSource(void) const |
||||
{ |
||||
return QUrl::fromUserInput("qrc:/qml/CameraComponentSummary.qml"); |
||||
} |
||||
|
||||
QString CameraComponent::prerequisiteSetup(void) const |
||||
{ |
||||
return QString(); |
||||
} |
@ -0,0 +1,60 @@
@@ -0,0 +1,60 @@
|
||||
/*=====================================================================
|
||||
|
||||
QGroundControl Open Source Ground Control Station |
||||
|
||||
(c) 2009 - 2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||
|
||||
This file is part of the QGROUNDCONTROL project |
||||
|
||||
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
======================================================================*/ |
||||
|
||||
#ifndef CameraComponent_H |
||||
#define CameraComponent_H |
||||
|
||||
#include "VehicleComponent.h" |
||||
|
||||
/// @file
|
||||
/// @brief The Camera VehicleComponent is used to setup the camera modes and hardware
|
||||
/// configuration to use it.
|
||||
/// @author Gus Grubba <mavlink@grubba.com>
|
||||
|
||||
class CameraComponent : public VehicleComponent |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
CameraComponent (Vehicle* vehicle, AutoPilotPlugin* autopilot, QObject* parent = NULL); |
||||
|
||||
// Virtuals from VehicleComponent
|
||||
QStringList setupCompleteChangedTriggerList (void) const; |
||||
|
||||
// Virtuals from VehicleComponent
|
||||
QString name (void) const final; |
||||
QString description (void) const final; |
||||
QString iconResource (void) const final; |
||||
bool requiresSetup (void) const final; |
||||
bool setupComplete (void) const final; |
||||
QUrl setupSource (void) const final; |
||||
QUrl summaryQmlSource (void) const final; |
||||
QString prerequisiteSetup (void) const final; |
||||
bool allowSetupWhileArmed (void) const final { return false; } |
||||
|
||||
private: |
||||
const QString _name; |
||||
QVariantList _summaryItems; |
||||
}; |
||||
|
||||
#endif |
@ -0,0 +1,326 @@
@@ -0,0 +1,326 @@
|
||||
/*===================================================================== |
||||
|
||||
QGroundControl Open Source Ground Control Station |
||||
|
||||
(c) 2009 - 2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> |
||||
|
||||
This file is part of the QGROUNDCONTROL project |
||||
|
||||
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. |
||||
|
||||
======================================================================*/ |
||||
|
||||
import QtQuick 2.5 |
||||
import QtQuick.Controls 1.2 |
||||
import QtQuick.Controls.Styles 1.2 |
||||
import QtQuick.Layouts 1.2 |
||||
import QtGraphicalEffects 1.0 |
||||
|
||||
import QGroundControl 1.0 |
||||
import QGroundControl.FactSystem 1.0 |
||||
import QGroundControl.FactControls 1.0 |
||||
import QGroundControl.Palette 1.0 |
||||
import QGroundControl.Controls 1.0 |
||||
import QGroundControl.ScreenTools 1.0 |
||||
|
||||
|
||||
QGCView { |
||||
id: _cameraView |
||||
viewPanel: panel |
||||
anchors.fill: parent |
||||
|
||||
FactPanelController { id: controller; factPanel: panel } |
||||
|
||||
QGCPalette { id: palette; colorGroupEnabled: enabled } |
||||
|
||||
property real _margins: ScreenTools.defaultFontPixelHeight |
||||
property real _middleRowWidth: ScreenTools.defaultFontPixelWidth * 22 |
||||
property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 18 |
||||
|
||||
property Fact _camTriggerMode: controller.getParameterFact(-1, "TRIG_MODE") |
||||
|
||||
property bool _hasFacts: false |
||||
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() { |
||||
var values = [] |
||||
for(var i = 0; i < 6; i++) { |
||||
if(_auxChannels[i]) { |
||||
values.push((i+1).toString()) |
||||
} |
||||
} |
||||
var auxFact = controller.getParameterFact(-1, "TRIG_PINS") |
||||
auxFact.value = parseInt(values) |
||||
console.log(values) |
||||
} |
||||
|
||||
Component.onCompleted: { |
||||
_hasFacts = _camTriggerMode.value > 0 |
||||
if(_hasFacts) { |
||||
clearAuxArray() |
||||
var auxFact = controller.getParameterFact(-1, "TRIG_PINS") |
||||
var values = auxFact.value.toString() |
||||
console.log(values) |
||||
for(var i = 0; i < values.length; i++) { |
||||
var b = parseInt(values[i]) - 1 |
||||
if(b >= 0 && b < 6) { |
||||
console.log(b) |
||||
_auxChannels[b] = 1 |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
QGCViewPanel { |
||||
id: panel |
||||
anchors.fill: parent |
||||
Item { |
||||
id: applyAndRestart |
||||
visible: false |
||||
anchors.top: parent.top |
||||
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: { |
||||
QGroundControl.multiVehicleManager.activeVehicle.rebootVehicle() |
||||
applyAndRestart.visible = false |
||||
_rebooting = true |
||||
} |
||||
} |
||||
} |
||||
QGCFlickable { |
||||
clip: true |
||||
anchors.top: applyAndRestart.visible ? applyAndRestart.bottom : parent.top |
||||
anchors.bottom: parent.bottom |
||||
anchors.horizontalCenter: parent.horizontalCenter |
||||
width: mainCol.width |
||||
contentHeight: mainCol.height |
||||
contentWidth: mainCol.width |
||||
flickableDirection: Flickable.VerticalFlick |
||||
Column { |
||||
id: mainCol |
||||
spacing: _margins |
||||
/* |
||||
**** Camera Trigger **** |
||||
*/ |
||||
QGCLabel { |
||||
text: qsTr("Camera Trigger Settings") |
||||
font.weight: Font.DemiBold |
||||
} |
||||
Rectangle { |
||||
id: camTrigRect |
||||
color: palette.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: palette.text |
||||
height: ScreenTools.defaultFontPixelWidth * 10 |
||||
width: ScreenTools.defaultFontPixelWidth * 20 |
||||
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 { |
||||
visible: !controller.fixedWing |
||||
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 { |
||||
QGCLabel { |
||||
text: qsTr("Time Interval") |
||||
width: _middleRowWidth |
||||
anchors.baseline: timeIntervalField.baseline |
||||
color: palette.text |
||||
} |
||||
FactTextField { |
||||
id: timeIntervalField |
||||
fact: _hasFacts ? controller.getParameterFact(-1, "TRIG_INTERVAL") : null |
||||
showUnits: true |
||||
width: _editFieldWidth |
||||
enabled: _hasFacts && _camTriggerMode.value === 2 |
||||
} |
||||
} |
||||
Row { |
||||
QGCLabel { |
||||
text: qsTr("Distance Interval") |
||||
width: _middleRowWidth |
||||
anchors.baseline: trigDistField.baseline |
||||
color: palette.text |
||||
} |
||||
FactTextField { |
||||
id: trigDistField |
||||
fact: _hasFacts ? controller.getParameterFact(-1, "TRIG_DISTANCE") : null |
||||
showUnits: true |
||||
width: _editFieldWidth |
||||
enabled: _hasFacts && _camTriggerMode.value === 3 |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
/* |
||||
**** Camera Hardware **** |
||||
*/ |
||||
Item { width: 1; height: _margins * 0.5; } |
||||
QGCLabel { |
||||
text: qsTr("Hardware Settings") |
||||
font.weight: Font.DemiBold |
||||
visible: _hasFacts |
||||
} |
||||
Rectangle { |
||||
color: palette.windowShade |
||||
width: camTrigRect.width |
||||
height: camHardwareRow.height + _margins * 2 |
||||
visible: _hasFacts |
||||
Row { |
||||
id: camHardwareRow |
||||
spacing: _margins |
||||
anchors.verticalCenter: parent.verticalCenter |
||||
|
||||
property Fact _camTriggerPol: controller.getParameterFact(-1, "TRIG_POLARITY") |
||||
|
||||
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: palette.text |
||||
anchors.horizontalCenter: parent.horizontalCenter |
||||
} |
||||
Rectangle { |
||||
id: auxPin |
||||
width: ScreenTools.defaultFontPixelWidth * 2 |
||||
height: ScreenTools.defaultFontPixelWidth * 2 |
||||
border.color: palette.text |
||||
color: _auxChannels[model.index] ? "green" : palette.windowShadeDark |
||||
MouseArea { |
||||
anchors.fill: parent |
||||
onClicked: { |
||||
_auxChannels[model.index] = 1 - _auxChannels[model.index] |
||||
auxPin.color = _auxChannels[model.index] ? "green" : palette.windowShadeDark |
||||
console.log(model.index + " " + _auxChannels[model.index]) |
||||
setAuxPins() |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
Item { width: _margins * 0.5; height: 1; } |
||||
Column { |
||||
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: _hasFacts && camHardwareRow._camTriggerPol.value === 0 |
||||
exclusiveGroup: polarityGroup |
||||
text: "Low (0V)" |
||||
onClicked: _camTriggerPol.value = 0 |
||||
} |
||||
QGCRadioButton { |
||||
checked: _hasFacts && camHardwareRow._camTriggerPol.value > 0 |
||||
exclusiveGroup: polarityGroup |
||||
text: "High (3.3V)" |
||||
onClicked: _camTriggerPol.value = 1 |
||||
} |
||||
} |
||||
} |
||||
Item { width: 1; height: _margins; } |
||||
Row { |
||||
QGCLabel { |
||||
text: qsTr("Trigger Period") |
||||
width: _middleRowWidth |
||||
anchors.baseline: trigPeriodField.baseline |
||||
color: palette.text |
||||
} |
||||
FactTextField { |
||||
id: trigPeriodField |
||||
fact: controller.getParameterFact(-1, "TRIG_ACT_TIME") |
||||
showUnits: true |
||||
width: _editFieldWidth |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
|
||||
import QtQuick 2.2 |
||||
import QtQuick.Controls 1.2 |
||||
|
||||
import QGroundControl.FactSystem 1.0 |
||||
import QGroundControl.FactControls 1.0 |
||||
import QGroundControl.Controls 1.0 |
||||
import QGroundControl.Palette 1.0 |
||||
|
||||
FactPanel { |
||||
id: panel |
||||
anchors.fill: parent |
||||
color: qgcPal.windowShadeDark |
||||
|
||||
QGCPalette { id: qgcPal; colorGroupEnabled: enabled } |
||||
FactPanelController { id: controller; factPanel: panel } |
||||
|
||||
property Fact _camTriggerMode: controller.getParameterFact(-1, "TRIG_MODE") |
||||
|
||||
Column { |
||||
anchors.fill: parent |
||||
anchors.margins: 8 |
||||
|
||||
VehicleSummaryRow { |
||||
labelText: qsTr("Camera Trigger Mode:") |
||||
valueText: _camTriggerMode ? _camTriggerMode.enumStringValue : "" |
||||
} |
||||
|
||||
} |
||||
} |
After Width: | Height: | Size: 5.8 KiB |
Loading…
Reference in new issue