Browse Source

Add option to disable video streaming when disarming.

Moved "Grid Lines" out of General Options and into the Video Stream Widget
Made a QGC custom Switch element
QGC4.4
Gus Grubba 7 years ago
parent
commit
e2fc418110
  1. 1
      qgroundcontrol.qrc
  2. 32
      src/FlightMap/Widgets/VideoPageWidget.qml
  3. 30
      src/QmlControls/QGCSwitch.qml
  4. 1
      src/QmlControls/QGroundControl.Controls.qmldir
  5. 7
      src/Settings/Video.SettingsGroup.json
  6. 10
      src/Settings/VideoSettings.cc
  7. 56
      src/Settings/VideoSettings.h
  8. 7
      src/Vehicle/Vehicle.cc
  9. 24
      src/VideoStreaming/VideoReceiver.cc
  10. 3
      src/VideoStreaming/VideoReceiver.h
  11. 10
      src/ui/preferences/GeneralSettings.qml

1
qgroundcontrol.qrc

@ -92,6 +92,7 @@ @@ -92,6 +92,7 @@
<file alias="QGroundControl/Controls/QGCPipable.qml">src/QmlControls/QGCPipable.qml</file>
<file alias="QGroundControl/Controls/QGCRadioButton.qml">src/QmlControls/QGCRadioButton.qml</file>
<file alias="QGroundControl/Controls/QGCSlider.qml">src/QmlControls/QGCSlider.qml</file>
<file alias="QGroundControl/Controls/QGCSwitch.qml">src/QmlControls/QGCSwitch.qml</file>
<file alias="QGroundControl/Controls/QGCTextField.qml">src/QmlControls/QGCTextField.qml</file>
<file alias="QGroundControl/Controls/QGCToolBarButton.qml">src/QmlControls/QGCToolBarButton.qml</file>
<file alias="QGroundControl/Controls/QGCView.qml">src/QmlControls/QGCView.qml</file>

32
src/FlightMap/Widgets/VideoPageWidget.qml

@ -12,7 +12,6 @@ import QtPositioning 5.2 @@ -12,7 +12,6 @@ import QtPositioning 5.2
import QtQuick.Layouts 1.2
import QtQuick.Controls 1.4
import QtQuick.Dialogs 1.2
import QtQuick.Controls.Styles 1.4
import QtGraphicalEffects 1.0
import QGroundControl 1.0
@ -46,12 +45,13 @@ Item { @@ -46,12 +45,13 @@ Item {
columnSpacing: ScreenTools.defaultFontPixelWidth * 2
rowSpacing: ScreenTools.defaultFontPixelHeight
anchors.centerIn: parent
// Enable/Disable Video Streaming
QGCLabel {
text: qsTr("Enable Stream")
font.pointSize: ScreenTools.smallFontPointSize
}
Switch {
enabled: _streamingEnabled && _activeVehicle
QGCSwitch {
enabled: _streamingEnabled
checked: QGroundControl.settingsManager.videoSettings.streamEnabled.rawValue
onClicked: {
if(checked) {
@ -62,19 +62,27 @@ Item { @@ -62,19 +62,27 @@ Item {
_videoReceiver.stop()
}
}
style: SwitchStyle {
groove: Rectangle {
implicitWidth: ScreenTools.defaultFontPixelWidth * 6
implicitHeight: ScreenTools.defaultFontPixelHeight
color: control.checked ? qgcPal.colorGreen : qgcPal.colorGrey
radius: 3
border.color: qgcPal.button
border.width: 1
}
// Grid Lines
QGCLabel {
text: qsTr("Grid Lines")
font.pointSize: ScreenTools.smallFontPointSize
visible: QGroundControl.videoManager.isGStreamer && QGroundControl.settingsManager.videoSettings.gridLines.visible
}
QGCSwitch {
enabled: _streamingEnabled && _activeVehicle
checked: QGroundControl.settingsManager.videoSettings.gridLines.rawValue
visible: QGroundControl.videoManager.isGStreamer && QGroundControl.settingsManager.videoSettings.gridLines.visible
onClicked: {
if(checked) {
QGroundControl.settingsManager.videoSettings.gridLines.rawValue = 1
} else {
QGroundControl.settingsManager.videoSettings.gridLines.rawValue = 0
}
}
}
QGCLabel {
text: qsTr("Stream Recording")
text: _recordingVideo ? qsTr("Stop Recording") : qsTr("Record Stream")
font.pointSize: ScreenTools.smallFontPointSize
visible: QGroundControl.settingsManager.videoSettings.showRecControl.rawValue
}

30
src/QmlControls/QGCSwitch.qml

@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.4
import QGroundControl.Palette 1.0
import QGroundControl.ScreenTools 1.0
Switch {
id: _root
QGCPalette { id:qgcPal; colorGroupEnabled: true }
style: SwitchStyle {
groove: Rectangle {
implicitWidth: ScreenTools.defaultFontPixelWidth * 6
implicitHeight: ScreenTools.defaultFontPixelHeight
color: (control.checked && control.enabled) ? qgcPal.colorGreen : qgcPal.colorGrey
radius: 3
border.color: qgcPal.button
border.width: 1
}
}
}

1
src/QmlControls/QGroundControl.Controls.qmldir

@ -52,6 +52,7 @@ QGCMovableItem 1.0 QGCMovableItem.qml @@ -52,6 +52,7 @@ QGCMovableItem 1.0 QGCMovableItem.qml
QGCPipable 1.0 QGCPipable.qml
QGCRadioButton 1.0 QGCRadioButton.qml
QGCSlider 1.0 QGCSlider.qml
QGCSwitch 1.0 QGCSwitch.qml
QGCTextField 1.0 QGCTextField.qml
QGCToolBarButton 1.0 QGCToolBarButton.qml
QGCView 1.0 QGCView.qml

7
src/Settings/Video.SettingsGroup.json

@ -101,5 +101,12 @@ @@ -101,5 +101,12 @@
"longDescription": "Start/Stop Video Stream.",
"type": "bool",
"defaultValue": true
},
{
"name": "DisableWhenDisarmed",
"shortDescription": "Video Stream Disnabled When Armed",
"longDescription": "Disable Video Stream when disarmed.",
"type": "bool",
"defaultValue": false
}
]

10
src/Settings/VideoSettings.cc

@ -31,6 +31,7 @@ const char* VideoSettings::maxVideoSizeName = "MaxVideoSize"; @@ -31,6 +31,7 @@ const char* VideoSettings::maxVideoSizeName = "MaxVideoSize";
const char* VideoSettings::enableStorageLimitName = "EnableStorageLimit";
const char* VideoSettings::rtspTimeoutName = "RtspTimeout";
const char* VideoSettings::streamEnabledName = "StreamEnabled";
const char* VideoSettings::disableWhenDisarmedName ="DisableWhenDisarmed";
const char* VideoSettings::videoSourceNoVideo = "No Video Available";
const char* VideoSettings::videoDisabled = "Video Stream Disabled";
@ -52,6 +53,7 @@ VideoSettings::VideoSettings(QObject* parent) @@ -52,6 +53,7 @@ VideoSettings::VideoSettings(QObject* parent)
, _enableStorageLimitFact(NULL)
, _rtspTimeoutFact(NULL)
, _streamEnabledFact(NULL)
, _disableWhenDisarmedFact(NULL)
{
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
qmlRegisterUncreatableType<VideoSettings>("QGroundControl.SettingsManager", 1, 0, "VideoSettings", "Reference only");
@ -192,6 +194,14 @@ Fact* VideoSettings::streamEnabled(void) @@ -192,6 +194,14 @@ Fact* VideoSettings::streamEnabled(void)
return _streamEnabledFact;
}
Fact* VideoSettings::disableWhenDisarmed(void)
{
if (!_disableWhenDisarmedFact) {
_disableWhenDisarmedFact = _createSettingsFact(disableWhenDisarmedName);
}
return _disableWhenDisarmedFact;
}
bool VideoSettings::streamConfigured(void)
{
#if !defined(QGC_GST_STREAMING)

56
src/Settings/VideoSettings.h

@ -19,33 +19,35 @@ class VideoSettings : public SettingsGroup @@ -19,33 +19,35 @@ class VideoSettings : public SettingsGroup
public:
VideoSettings(QObject* parent = NULL);
Q_PROPERTY(Fact* videoSource READ videoSource CONSTANT)
Q_PROPERTY(Fact* udpPort READ udpPort CONSTANT)
Q_PROPERTY(Fact* tcpUrl READ tcpUrl CONSTANT)
Q_PROPERTY(Fact* rtspUrl READ rtspUrl CONSTANT)
Q_PROPERTY(Fact* aspectRatio READ aspectRatio CONSTANT)
Q_PROPERTY(Fact* gridLines READ gridLines CONSTANT)
Q_PROPERTY(Fact* showRecControl READ showRecControl CONSTANT)
Q_PROPERTY(Fact* recordingFormat READ recordingFormat CONSTANT)
Q_PROPERTY(Fact* maxVideoSize READ maxVideoSize CONSTANT)
Q_PROPERTY(Fact* enableStorageLimit READ enableStorageLimit CONSTANT)
Q_PROPERTY(Fact* rtspTimeout READ rtspTimeout CONSTANT)
Q_PROPERTY(Fact* streamEnabled READ streamEnabled CONSTANT)
Q_PROPERTY(bool streamConfigured READ streamConfigured NOTIFY streamConfiguredChanged)
Q_PROPERTY(Fact* videoSource READ videoSource CONSTANT)
Q_PROPERTY(Fact* udpPort READ udpPort CONSTANT)
Q_PROPERTY(Fact* tcpUrl READ tcpUrl CONSTANT)
Q_PROPERTY(Fact* rtspUrl READ rtspUrl CONSTANT)
Q_PROPERTY(Fact* aspectRatio READ aspectRatio CONSTANT)
Q_PROPERTY(Fact* gridLines READ gridLines CONSTANT)
Q_PROPERTY(Fact* showRecControl READ showRecControl CONSTANT)
Q_PROPERTY(Fact* recordingFormat READ recordingFormat CONSTANT)
Q_PROPERTY(Fact* maxVideoSize READ maxVideoSize CONSTANT)
Q_PROPERTY(Fact* enableStorageLimit READ enableStorageLimit CONSTANT)
Q_PROPERTY(Fact* rtspTimeout READ rtspTimeout CONSTANT)
Q_PROPERTY(Fact* streamEnabled READ streamEnabled CONSTANT)
Q_PROPERTY(Fact* disableWhenDisarmed READ disableWhenDisarmed CONSTANT)
Q_PROPERTY(bool streamConfigured READ streamConfigured NOTIFY streamConfiguredChanged)
Fact* videoSource (void);
Fact* udpPort (void);
Fact* rtspUrl (void);
Fact* tcpUrl (void);
Fact* aspectRatio (void);
Fact* gridLines (void);
Fact* showRecControl (void);
Fact* recordingFormat (void);
Fact* maxVideoSize (void);
Fact* enableStorageLimit(void);
Fact* rtspTimeout (void);
Fact* streamEnabled (void);
bool streamConfigured (void);
Fact* videoSource (void);
Fact* udpPort (void);
Fact* rtspUrl (void);
Fact* tcpUrl (void);
Fact* aspectRatio (void);
Fact* gridLines (void);
Fact* showRecControl (void);
Fact* recordingFormat (void);
Fact* maxVideoSize (void);
Fact* enableStorageLimit (void);
Fact* rtspTimeout (void);
Fact* streamEnabled (void);
Fact* disableWhenDisarmed (void);
bool streamConfigured (void);
static const char* videoSettingsGroupName;
@ -61,6 +63,7 @@ public: @@ -61,6 +63,7 @@ public:
static const char* enableStorageLimitName;
static const char* rtspTimeoutName;
static const char* streamEnabledName;
static const char* disableWhenDisarmedName;
static const char* videoSourceNoVideo;
static const char* videoDisabled;
@ -87,6 +90,7 @@ private: @@ -87,6 +90,7 @@ private:
SettingsFact* _enableStorageLimitFact;
SettingsFact* _rtspTimeoutFact;
SettingsFact* _streamEnabledFact;
SettingsFact* _disableWhenDisarmedFact;
};
#endif

7
src/Vehicle/Vehicle.cc

@ -33,6 +33,8 @@ @@ -33,6 +33,8 @@
#include "QGCCorePlugin.h"
#include "ADSBVehicle.h"
#include "QGCCameraManager.h"
#include "VideoReceiver.h"
#include "VideoManager.h"
QGC_LOGGING_CATEGORY(VehicleLog, "VehicleLog")
@ -1121,6 +1123,11 @@ void Vehicle::_handleHeartbeat(mavlink_message_t& message) @@ -1121,6 +1123,11 @@ void Vehicle::_handleHeartbeat(mavlink_message_t& message)
_clearCameraTriggerPoints();
} else {
_mapTrajectoryStop();
// Also handle Video Streaming
if(_settingsManager->videoSettings()->disableWhenDisarmed()->rawValue().toBool()) {
_settingsManager->videoSettings()->streamEnabled()->setRawValue(false);
qgcApp()->toolbox()->videoManager()->videoReceiver()->stop();
}
}
}

24
src/VideoStreaming/VideoReceiver.cc

@ -67,8 +67,10 @@ VideoReceiver::VideoReceiver(QObject* parent) @@ -67,8 +67,10 @@ VideoReceiver::VideoReceiver(QObject* parent)
, _videoSurface(NULL)
, _videoRunning(false)
, _showFullScreen(false)
, _videoSettings(NULL)
{
_videoSurface = new VideoSurface;
_videoSurface = new VideoSurface;
_videoSettings = qgcApp()->toolbox()->settingsManager()->videoSettings();
#if defined(QGC_GST_STREAMING)
_setVideoSink(_videoSurface->videoSink());
_timer.setSingleShot(true);
@ -147,7 +149,7 @@ VideoReceiver::_connected() @@ -147,7 +149,7 @@ VideoReceiver::_connected()
_timer.stop();
_socket->deleteLater();
_socket = NULL;
if(qgcApp()->toolbox()->settingsManager()->videoSettings()->streamEnabled()->rawValue().toBool()) {
if(_videoSettings->streamEnabled()->rawValue().toBool()) {
_serverPresent = true;
start();
}
@ -163,7 +165,7 @@ VideoReceiver::_socketError(QAbstractSocket::SocketError socketError) @@ -163,7 +165,7 @@ VideoReceiver::_socketError(QAbstractSocket::SocketError socketError)
_socket->deleteLater();
_socket = NULL;
//-- Try again in 5 seconds
if(qgcApp()->toolbox()->settingsManager()->videoSettings()->streamEnabled()->rawValue().toBool()) {
if(_videoSettings->streamEnabled()->rawValue().toBool()) {
_timer.start(5000);
}
}
@ -179,7 +181,7 @@ VideoReceiver::_timeout() @@ -179,7 +181,7 @@ VideoReceiver::_timeout()
delete _socket;
_socket = NULL;
}
if(qgcApp()->toolbox()->settingsManager()->videoSettings()->streamEnabled()->rawValue().toBool()) {
if(_videoSettings->streamEnabled()->rawValue().toBool()) {
//-- RTSP will try to connect to the server. If it cannot connect,
// it will simply give up and never try again. Instead, we keep
// attempting a connection on this timer. Once a connection is
@ -208,8 +210,8 @@ VideoReceiver::_timeout() @@ -208,8 +210,8 @@ VideoReceiver::_timeout()
void
VideoReceiver::start()
{
if(!qgcApp()->toolbox()->settingsManager()->videoSettings()->streamEnabled()->rawValue().toBool() ||
!qgcApp()->toolbox()->settingsManager()->videoSettings()->streamConfigured()) {
if(!_videoSettings->streamEnabled()->rawValue().toBool() ||
!_videoSettings->streamConfigured()) {
qCDebug(VideoReceiverLog) << "start() but not enabled/configured";
return;
}
@ -560,7 +562,7 @@ void @@ -560,7 +562,7 @@ void
VideoReceiver::_cleanupOldVideos()
{
//-- Only perform cleanup if storage limit is enabled
if(qgcApp()->toolbox()->settingsManager()->videoSettings()->enableStorageLimit()->rawValue().toBool()) {
if(_videoSettings->enableStorageLimit()->rawValue().toBool()) {
QString savePath = qgcApp()->toolbox()->settingsManager()->appSettings()->videoSavePath();
QDir videoDir = QDir(savePath);
videoDir.setFilter(QDir::Files | QDir::Readable | QDir::NoSymLinks | QDir::Writable);
@ -576,7 +578,7 @@ VideoReceiver::_cleanupOldVideos() @@ -576,7 +578,7 @@ VideoReceiver::_cleanupOldVideos()
if(!vidList.isEmpty()) {
uint64_t total = 0;
//-- Settings are stored using MB
uint64_t maxSize = (qgcApp()->toolbox()->settingsManager()->videoSettings()->maxVideoSize()->rawValue().toUInt() * 1024 * 1024);
uint64_t maxSize = (_videoSettings->maxVideoSize()->rawValue().toUInt() * 1024 * 1024);
//-- Compute total used storage
for(int i = 0; i < vidList.size(); i++) {
total += vidList[i].size();
@ -624,7 +626,7 @@ VideoReceiver::startRecording(void) @@ -624,7 +626,7 @@ VideoReceiver::startRecording(void)
return;
}
uint32_t muxIdx = qgcApp()->toolbox()->settingsManager()->videoSettings()->recordingFormat()->rawValue().toUInt();
uint32_t muxIdx = _videoSettings->recordingFormat()->rawValue().toUInt();
if(muxIdx >= NUM_MUXES) {
qgcApp()->showMessage(tr("Invalid video format defined."));
return;
@ -813,7 +815,7 @@ VideoReceiver::_updateTimer() @@ -813,7 +815,7 @@ VideoReceiver::_updateTimer()
if(_videoRunning) {
uint32_t timeout = 1;
if(qgcApp()->toolbox() && qgcApp()->toolbox()->settingsManager()) {
timeout = qgcApp()->toolbox()->settingsManager()->videoSettings()->rtspTimeout()->rawValue().toUInt();
timeout = _videoSettings->rtspTimeout()->rawValue().toUInt();
}
time_t elapsed = 0;
time_t lastFrame = _videoSurface->lastFrame();
@ -824,7 +826,7 @@ VideoReceiver::_updateTimer() @@ -824,7 +826,7 @@ VideoReceiver::_updateTimer()
stop();
}
} else {
if(!running() && !_uri.isEmpty() && qgcApp()->toolbox()->settingsManager()->videoSettings()->streamEnabled()->rawValue().toBool()) {
if(!running() && !_uri.isEmpty() && _videoSettings->streamEnabled()->rawValue().toBool()) {
start();
}
}

3
src/VideoStreaming/VideoReceiver.h

@ -30,6 +30,8 @@ @@ -30,6 +30,8 @@
Q_DECLARE_LOGGING_CATEGORY(VideoReceiverLog)
class VideoSettings;
class VideoReceiver : public QObject
{
Q_OBJECT
@ -137,6 +139,7 @@ private: @@ -137,6 +139,7 @@ private:
VideoSurface* _videoSurface;
bool _videoRunning;
bool _showFullScreen;
VideoSettings* _videoSettings;
};
#endif // VIDEORECEIVER_H

10
src/ui/preferences/GeneralSettings.qml

@ -37,7 +37,7 @@ QGCView { @@ -37,7 +37,7 @@ QGCView {
property Fact _appFontPointSize: QGroundControl.settingsManager.appSettings.appFontPointSize
property Fact _userBrandImageIndoor: QGroundControl.settingsManager.brandImageSettings.userBrandImageIndoor
property Fact _userBrandImageOutdoor: QGroundControl.settingsManager.brandImageSettings.userBrandImageOutdoor
property real _labelWidth: ScreenTools.defaultFontPixelWidth * 15
property real _labelWidth: ScreenTools.defaultFontPixelWidth * 20
property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 30
property Fact _mapProvider: QGroundControl.settingsManager.flightMapSettings.mapProvider
property Fact _mapType: QGroundControl.settingsManager.flightMapSettings.mapType
@ -590,13 +590,13 @@ QGCView { @@ -590,13 +590,13 @@ QGCView {
spacing: ScreenTools.defaultFontPixelWidth
visible: QGroundControl.videoManager.isGStreamer && videoSource.currentIndex && videoSource.currentIndex < 3 && QGroundControl.settingsManager.videoSettings.gridLines.visible
QGCLabel {
text: qsTr("Grid Lines:")
text: qsTr("Disable When Disarmed:")
width: _labelWidth
anchors.verticalCenter: parent.verticalCenter
}
FactComboBox {
width: _editFieldWidth
fact: QGroundControl.settingsManager.videoSettings.gridLines
FactCheckBox {
text: ""
fact: QGroundControl.settingsManager.videoSettings.disableWhenDisarmed
anchors.verticalCenter: parent.verticalCenter
}
}

Loading…
Cancel
Save