Commit f69b32b3 authored by Matej Frančeškin's avatar Matej Frančeškin

Merge branch 'master' into pr-taisync-android

parents 28272aa6 27289773
Subproject commit 90d9b285e01fe8bfa3b4e8868ca71c5537d43302 Subproject commit c847642263deefa584691eebade8b29a25264442
...@@ -195,6 +195,7 @@ ...@@ -195,6 +195,7 @@
<file alias="counter-clockwise-arrow.svg">resources/counter-clockwise-arrow.svg</file> <file alias="counter-clockwise-arrow.svg">resources/counter-clockwise-arrow.svg</file>
<file alias="chevron-down.svg">resources/chevron-down.svg</file> <file alias="chevron-down.svg">resources/chevron-down.svg</file>
<file alias="chevron-up.svg">resources/chevron-up.svg</file> <file alias="chevron-up.svg">resources/chevron-up.svg</file>
<file alias="DropArrow.svg">resources/DropArrow.svg</file>
<file alias="gear-black.svg">resources/gear-black.svg</file> <file alias="gear-black.svg">resources/gear-black.svg</file>
<file alias="gear-white.svg">resources/gear-white.svg</file> <file alias="gear-white.svg">resources/gear-white.svg</file>
<file alias="helicoptericon.svg">resources/helicoptericon.svg</file> <file alias="helicoptericon.svg">resources/helicoptericon.svg</file>
......
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="255px" height="255px" viewBox="0 0 255 255" style="enable-background:new 0 0 255 255;" xml:space="preserve">
<g>
<g id="arrow-drop-down">
<polygon points="0,63.75 127.5,191.25 255,63.75 "/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -27,9 +27,10 @@ public: ...@@ -27,9 +27,10 @@ public:
QGCCameraManager(Vehicle* vehicle); QGCCameraManager(Vehicle* vehicle);
virtual ~QGCCameraManager(); virtual ~QGCCameraManager();
Q_PROPERTY(QmlObjectListModel* cameras READ cameras NOTIFY camerasChanged) Q_PROPERTY(QmlObjectListModel* cameras READ cameras NOTIFY camerasChanged)
Q_PROPERTY(QStringList cameraLabels READ cameraLabels NOTIFY cameraLabelsChanged) Q_PROPERTY(QStringList cameraLabels READ cameraLabels NOTIFY cameraLabelsChanged)
Q_PROPERTY(int currentCamera READ currentCamera WRITE setCurrentCamera NOTIFY currentCameraChanged) Q_PROPERTY(QGCCameraControl* currentCameraInstance READ currentCameraInstance NOTIFY currentCameraChanged)
Q_PROPERTY(int currentCamera READ currentCamera WRITE setCurrentCamera NOTIFY currentCameraChanged)
//-- Return a list of cameras provided by this vehicle //-- Return a list of cameras provided by this vehicle
virtual QmlObjectListModel* cameras () { return &_cameras; } virtual QmlObjectListModel* cameras () { return &_cameras; }
...@@ -37,13 +38,17 @@ public: ...@@ -37,13 +38,17 @@ public:
virtual QStringList cameraLabels () { return _cameraLabels; } virtual QStringList cameraLabels () { return _cameraLabels; }
//-- Current selected camera //-- Current selected camera
virtual int currentCamera () { return _currentCamera; } virtual int currentCamera () { return _currentCamera; }
virtual QGCCameraControl* currentCameraInstance();
//-- Set current camera //-- Set current camera
virtual void setCurrentCamera (int sel); virtual void setCurrentCamera (int sel);
//-- Current stream
virtual QGCVideoStreamInfo* currentStreamInstance();
signals: signals:
void camerasChanged (); void camerasChanged ();
void cameraLabelsChanged (); void cameraLabelsChanged ();
void currentCameraChanged (); void currentCameraChanged ();
void streamChanged ();
protected slots: protected slots:
virtual void _vehicleReady (bool ready); virtual void _vehicleReady (bool ready);
...@@ -51,6 +56,8 @@ protected slots: ...@@ -51,6 +56,8 @@ protected slots:
virtual void _activeJoystickChanged (Joystick* joystick); virtual void _activeJoystickChanged (Joystick* joystick);
virtual void _stepZoom (int direction); virtual void _stepZoom (int direction);
virtual void _stepCamera (int direction); virtual void _stepCamera (int direction);
virtual void _stepStream (int direction);
virtual void _cameraTimeout ();
protected: protected:
virtual QGCCameraControl* _findCamera (int id); virtual QGCCameraControl* _findCamera (int id);
...@@ -62,16 +69,29 @@ protected: ...@@ -62,16 +69,29 @@ protected:
virtual void _handleParamAck (const mavlink_message_t& message); virtual void _handleParamAck (const mavlink_message_t& message);
virtual void _handleParamValue (const mavlink_message_t& message); virtual void _handleParamValue (const mavlink_message_t& message);
virtual void _handleCaptureStatus (const mavlink_message_t& message); virtual void _handleCaptureStatus (const mavlink_message_t& message);
virtual void _handleVideoStreamInfo (const mavlink_message_t& message);
virtual void _handleVideoStreamStatus(const mavlink_message_t& message);
protected: protected:
class CameraStruct : public QObject {
public:
CameraStruct(QObject* parent);
QTime lastHeartbeat;
bool infoReceived = false;
bool gaveUp = false;
int tryCount = 0;
};
Vehicle* _vehicle = nullptr; Vehicle* _vehicle = nullptr;
Joystick* _activeJoystick = nullptr; Joystick* _activeJoystick = nullptr;
bool _vehicleReadyState = false; bool _vehicleReadyState = false;
int _currentTask = 0; int _currentTask = 0;
QmlObjectListModel _cameras; QmlObjectListModel _cameras;
QStringList _cameraLabels; QStringList _cameraLabels;
QMap<int, bool> _cameraInfoRequested;
int _currentCamera = 0; int _currentCamera = 0;
QTime _lastZoomChange; QTime _lastZoomChange;
QTime _lastCameraChange; QTime _lastCameraChange;
QTimer _cameraTimer;
QMap<int, CameraStruct*> _cameraInfoRequest;
}; };
...@@ -27,6 +27,7 @@ Fact::Fact(QObject* parent) ...@@ -27,6 +27,7 @@ Fact::Fact(QObject* parent)
, _sendValueChangedSignals (true) , _sendValueChangedSignals (true)
, _deferredValueChangeSignal(false) , _deferredValueChangeSignal(false)
, _valueSliderModel (nullptr) , _valueSliderModel (nullptr)
, _ignoreQGCRebootRequired (false)
{ {
FactMetaData* metaData = new FactMetaData(_type, this); FactMetaData* metaData = new FactMetaData(_type, this);
setMetaData(metaData); setMetaData(metaData);
...@@ -44,6 +45,7 @@ Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObjec ...@@ -44,6 +45,7 @@ Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObjec
, _sendValueChangedSignals (true) , _sendValueChangedSignals (true)
, _deferredValueChangeSignal(false) , _deferredValueChangeSignal(false)
, _valueSliderModel (nullptr) , _valueSliderModel (nullptr)
, _ignoreQGCRebootRequired (false)
{ {
FactMetaData* metaData = new FactMetaData(_type, this); FactMetaData* metaData = new FactMetaData(_type, this);
setMetaData(metaData); setMetaData(metaData);
...@@ -61,6 +63,7 @@ Fact::Fact(const QString& settingsGroup, FactMetaData* metaData, QObject* parent ...@@ -61,6 +63,7 @@ Fact::Fact(const QString& settingsGroup, FactMetaData* metaData, QObject* parent
, _sendValueChangedSignals (true) , _sendValueChangedSignals (true)
, _deferredValueChangeSignal(false) , _deferredValueChangeSignal(false)
, _valueSliderModel (nullptr) , _valueSliderModel (nullptr)
, _ignoreQGCRebootRequired (false)
{ {
qgcApp()->toolbox()->corePlugin()->adjustSettingMetaData(settingsGroup, *metaData); qgcApp()->toolbox()->corePlugin()->adjustSettingMetaData(settingsGroup, *metaData);
setMetaData(metaData, true /* setDefaultFromMetaData */); setMetaData(metaData, true /* setDefaultFromMetaData */);
...@@ -90,7 +93,8 @@ const Fact& Fact::operator=(const Fact& other) ...@@ -90,7 +93,8 @@ const Fact& Fact::operator=(const Fact& other)
_type = other._type; _type = other._type;
_sendValueChangedSignals = other._sendValueChangedSignals; _sendValueChangedSignals = other._sendValueChangedSignals;
_deferredValueChangeSignal = other._deferredValueChangeSignal; _deferredValueChangeSignal = other._deferredValueChangeSignal;
_valueSliderModel = nullptr; _valueSliderModel = nullptr;
_ignoreQGCRebootRequired = other._ignoreQGCRebootRequired;
if (_metaData && other._metaData) { if (_metaData && other._metaData) {
*_metaData = *other._metaData; *_metaData = *other._metaData;
} else { } else {
...@@ -615,7 +619,9 @@ bool Fact::vehicleRebootRequired(void) const ...@@ -615,7 +619,9 @@ bool Fact::vehicleRebootRequired(void) const
bool Fact::qgcRebootRequired(void) const bool Fact::qgcRebootRequired(void) const
{ {
if (_metaData) { if (_ignoreQGCRebootRequired) {
return false;
} else if (_metaData) {
return _metaData->qgcRebootRequired(); return _metaData->qgcRebootRequired();
} else { } else {
qWarning() << kMissingMetadata << name(); qWarning() << kMissingMetadata << name();
...@@ -743,3 +749,8 @@ void Fact::_checkForRebootMessaging(void) ...@@ -743,3 +749,8 @@ void Fact::_checkForRebootMessaging(void)
} }
} }
} }
void Fact::_setIgnoreQGCRebootRequired(bool ignore)
{
_ignoreQGCRebootRequired = ignore;
}
...@@ -129,6 +129,10 @@ public: ...@@ -129,6 +129,10 @@ public:
bool writeOnly (void) const; bool writeOnly (void) const;
bool volatileValue (void) const; bool volatileValue (void) const;
// Internal hack to allow changes to fact which do not signal reboot. Currently used by font point size
// code in ScreenTools.qml to set initial sizing at first boot.
Q_INVOKABLE void _setIgnoreQGCRebootRequired(bool ignore);
Q_INVOKABLE FactValueSliderListModel* valueSliderModel(void); Q_INVOKABLE FactValueSliderListModel* valueSliderModel(void);
/// Returns the values as a string with full 18 digit precision if float/double. /// Returns the values as a string with full 18 digit precision if float/double.
...@@ -208,6 +212,7 @@ protected: ...@@ -208,6 +212,7 @@ protected:
bool _sendValueChangedSignals; bool _sendValueChangedSignals;
bool _deferredValueChangeSignal; bool _deferredValueChangeSignal;
FactValueSliderListModel* _valueSliderModel; FactValueSliderListModel* _valueSliderModel;
bool _ignoreQGCRebootRequired;
}; };
#endif #endif
...@@ -228,13 +228,6 @@ bool APMFirmwarePlugin::setFlightMode(const QString& flightMode, uint8_t* base_m ...@@ -228,13 +228,6 @@ bool APMFirmwarePlugin::setFlightMode(const QString& flightMode, uint8_t* base_m
return found; return found;
} }
int APMFirmwarePlugin::manualControlReservedButtonCount(void)
{
// We don't know whether the firmware is going to used any of these buttons.
// So reserve them all.
return -1;
}
void APMFirmwarePlugin::_handleIncomingParamValue(Vehicle* vehicle, mavlink_message_t* message) void APMFirmwarePlugin::_handleIncomingParamValue(Vehicle* vehicle, mavlink_message_t* message)
{ {
Q_UNUSED(vehicle); Q_UNUSED(vehicle);
......
...@@ -90,7 +90,6 @@ public: ...@@ -90,7 +90,6 @@ public:
void pauseVehicle (Vehicle* vehicle) override; void pauseVehicle (Vehicle* vehicle) override;
void guidedModeRTL (Vehicle* vehicle) override; void guidedModeRTL (Vehicle* vehicle) override;
void guidedModeChangeAltitude (Vehicle* vehicle, double altitudeChange) override; void guidedModeChangeAltitude (Vehicle* vehicle, double altitudeChange) override;
int manualControlReservedButtonCount(void) override;
bool adjustIncomingMavlinkMessage (Vehicle* vehicle, mavlink_message_t* message) override; bool adjustIncomingMavlinkMessage (Vehicle* vehicle, mavlink_message_t* message) override;
void adjustOutgoingMavlinkMessage (Vehicle* vehicle, LinkInterface* outgoingLink, mavlink_message_t* message) override; void adjustOutgoingMavlinkMessage (Vehicle* vehicle, LinkInterface* outgoingLink, mavlink_message_t* message) override;
virtual void initializeStreamRates (Vehicle* vehicle); virtual void initializeStreamRates (Vehicle* vehicle);
......
...@@ -164,11 +164,6 @@ int ArduSubFirmwarePlugin::remapParamNameHigestMinorVersionNumber(int majorVersi ...@@ -164,11 +164,6 @@ int ArduSubFirmwarePlugin::remapParamNameHigestMinorVersionNumber(int majorVersi
return majorVersionNumber == 3 ? 6 : Vehicle::versionNotSetValue; return majorVersionNumber == 3 ? 6 : Vehicle::versionNotSetValue;
} }
int ArduSubFirmwarePlugin::manualControlReservedButtonCount(void)
{
return 0;
}
void ArduSubFirmwarePlugin::initializeStreamRates(Vehicle* vehicle) { void ArduSubFirmwarePlugin::initializeStreamRates(Vehicle* vehicle) {
vehicle->requestDataStream(MAV_DATA_STREAM_RAW_SENSORS, 2); vehicle->requestDataStream(MAV_DATA_STREAM_RAW_SENSORS, 2);
vehicle->requestDataStream(MAV_DATA_STREAM_EXTENDED_STATUS, 2); vehicle->requestDataStream(MAV_DATA_STREAM_EXTENDED_STATUS, 2);
......
...@@ -110,9 +110,6 @@ public: ...@@ -110,9 +110,6 @@ public:
QList<MAV_CMD> supportedMissionCommands(void) final; QList<MAV_CMD> supportedMissionCommands(void) final;
// Overrides from FirmwarePlugin
int manualControlReservedButtonCount(void) final;
int defaultJoystickTXMode(void) final { return 3; } int defaultJoystickTXMode(void) final { return 3; }
void initializeStreamRates(Vehicle* vehicle) override final; void initializeStreamRates(Vehicle* vehicle) override final;
......
...@@ -115,13 +115,6 @@ bool FirmwarePlugin::setFlightMode(const QString& flightMode, uint8_t* base_mode ...@@ -115,13 +115,6 @@ bool FirmwarePlugin::setFlightMode(const QString& flightMode, uint8_t* base_mode
return false; return false;
} }
int FirmwarePlugin::manualControlReservedButtonCount(void)
{
// We don't know whether the firmware is going to used any of these buttons.
// So reserve them all.
return -1;
}
int FirmwarePlugin::defaultJoystickTXMode(void) int FirmwarePlugin::defaultJoystickTXMode(void)
{ {
return 2; return 2;
......
...@@ -146,14 +146,6 @@ public: ...@@ -146,14 +146,6 @@ public:
/// @param altitudeChange If > 0, go up by amount specified, if < 0, go down by amount specified /// @param altitudeChange If > 0, go up by amount specified, if < 0, go down by amount specified
virtual void guidedModeChangeAltitude(Vehicle* vehicle, double altitudeChange); virtual void guidedModeChangeAltitude(Vehicle* vehicle, double altitudeChange);
/// FIXME: This isn't quite correct being here. All code for Joystick suvehicleTypepport is currently firmware specific
/// not just this. I'm going to try to change that. If not, this will need to be removed.
/// Returns the number of buttons which are reserved for firmware use in the MANUAL_CONTROL mavlink
/// message. For example PX4 Flight Stack reserves the first 8 buttons to simulate rc switches.
/// The remainder can be assigned to Vehicle actions.
/// @return -1: reserver all buttons, >0 number of buttons to reserve
virtual int manualControlReservedButtonCount(void);
/// Default tx mode to apply to joystick axes /// Default tx mode to apply to joystick axes
/// TX modes are as outlined here: http://www.rc-airplane-world.com/rc-transmitter-modes.html /// TX modes are as outlined here: http://www.rc-airplane-world.com/rc-transmitter-modes.html
virtual int defaultJoystickTXMode(void); virtual int defaultJoystickTXMode(void);
......
...@@ -225,11 +225,6 @@ bool PX4FirmwarePlugin::setFlightMode(const QString& flightMode, uint8_t* base_m ...@@ -225,11 +225,6 @@ bool PX4FirmwarePlugin::setFlightMode(const QString& flightMode, uint8_t* base_m
return found; return found;
} }
int PX4FirmwarePlugin::manualControlReservedButtonCount(void)
{
return 0; // 0 buttons reserved for rc switch simulation
}
bool PX4FirmwarePlugin::isCapable(const Vehicle *vehicle, FirmwareCapabilities capabilities) bool PX4FirmwarePlugin::isCapable(const Vehicle *vehicle, FirmwareCapabilities capabilities)
{ {
int available = SetFlightModeCapability | PauseVehicleCapability | GuidedModeCapability; int available = SetFlightModeCapability | PauseVehicleCapability | GuidedModeCapability;
......
...@@ -52,7 +52,6 @@ public: ...@@ -52,7 +52,6 @@ public:
double minimumTakeoffAltitude (Vehicle* vehicle) override; double minimumTakeoffAltitude (Vehicle* vehicle) override;
void startMission (Vehicle* vehicle) override; void startMission (Vehicle* vehicle) override;
bool isGuidedMode (const Vehicle* vehicle) const override; bool isGuidedMode (const Vehicle* vehicle) const override;
int manualControlReservedButtonCount(void) override;
void initializeVehicle (Vehicle* vehicle) override; void initializeVehicle (Vehicle* vehicle) override;
bool sendHomePositionToVehicle (void) override; bool sendHomePositionToVehicle (void) override;
void addMetaDataToFact (QObject* parameterMetaData, Fact* fact, MAV_TYPE vehicleType) override; void addMetaDataToFact (QObject* parameterMetaData, Fact* fact, MAV_TYPE vehicleType) override;
......
...@@ -415,6 +415,20 @@ Set to 2 to use heading from motion capture</short_desc> ...@@ -415,6 +415,20 @@ Set to 2 to use heading from motion capture</short_desc>
<value code="1">Active high</value> <value code="1">Active high</value>
</values> </values>
</parameter> </parameter>
<parameter default="1500" name="TRIG_PWM_NEUTRAL" type="INT32">
<short_desc>PWM neutral output on trigger pin</short_desc>
<min>1000</min>
<max>2000</max>
<unit>us</unit>
<reboot_required>true</reboot_required>
</parameter>
<parameter default="1900" name="TRIG_PWM_SHOOT" type="INT32">
<short_desc>PWM output to trigger shot</short_desc>
<min>1000</min>
<max>2000</max>
<unit>us</unit>
<reboot_required>true</reboot_required>
</parameter>
</group> </group>
<group name="Circuit Breaker"> <group name="Circuit Breaker">
<parameter category="Developer" default="0" name="CBRK_AIRSPD_CHK" type="INT32"> <parameter category="Developer" default="0" name="CBRK_AIRSPD_CHK" type="INT32">
...@@ -7633,7 +7647,7 @@ to takeoff is reached</short_desc> ...@@ -7633,7 +7647,7 @@ to takeoff is reached</short_desc>
<max>1000</max> <max>1000</max>
<reboot_required>true</reboot_required> <reboot_required>true</reboot_required>
</parameter> </parameter>
<parameter default="1" name="SDLOG_MISSION" type="INT32"> <parameter default="0" name="SDLOG_MISSION" type="INT32">
<short_desc>Mission Log</short_desc> <short_desc>Mission Log</short_desc>
<long_desc>If enabled, a small additional "mission" log file will be written to the SD card. The log contains just those messages that are useful for tasks like generating flight statistics and geotagging. The different modes can be used to further reduce the logged data (and thus the log file size). For example, choose geotagging mode to only log data required for geotagging. Note that the normal/full log is still created, and contains all the data in the mission log (and more).</long_desc> <long_desc>If enabled, a small additional "mission" log file will be written to the SD card. The log contains just those messages that are useful for tasks like generating flight statistics and geotagging. The different modes can be used to further reduce the logged data (and thus the log file size). For example, choose geotagging mode to only log data required for geotagging. Note that the normal/full log is still created, and contains all the data in the mission log (and more).</long_desc>
<reboot_required>true</reboot_required> <reboot_required>true</reboot_required>
...@@ -8248,6 +8262,21 @@ is less than 50% of this value</short_desc> ...@@ -8248,6 +8262,21 @@ is less than 50% of this value</short_desc>
<long_desc>This parameter defines a rotational offset in degrees around the Z (Yaw) axis. It allows the user to fine tune the board offset in the event of misalignment.</long_desc> <long_desc>This parameter defines a rotational offset in degrees around the Z (Yaw) axis. It allows the user to fine tune the board offset in the event of misalignment.</long_desc>
<unit>deg</unit> <unit>deg</unit>
</parameter> </parameter>
<parameter default="0" name="SENS_CM8JL65_CFG" type="INT32">
<short_desc>Serial Configuration for Lanbao PSK-CM8JL65-CC5</short_desc>
<long_desc>Configure on which serial port to run Lanbao PSK-CM8JL65-CC5.</long_desc>
<reboot_required>true</reboot_required>
<values>
<value code="0">Disabled</value>
<value code="6">UART 6</value>
<value code="101">TELEM 1</value>
<value code="102">TELEM 2</value>
<value code="103">TELEM 3</value>
<value code="104">TELEM/SERIAL 4</value>
<value code="201">GPS 1</value>
<value code="202">GPS 2</value>
</values>
</parameter>
<parameter default="0" name="SENS_EN_BATT" type="INT32"> <parameter default="0" name="SENS_EN_BATT" type="INT32">
<short_desc>SMBUS Smart battery driver (BQ40Z50)</short_desc> <short_desc>SMBUS Smart battery driver (BQ40Z50)</short_desc>
<boolean /> <boolean />
...@@ -8341,13 +8370,6 @@ is less than 50% of this value</short_desc> ...@@ -8341,13 +8370,6 @@ is less than 50% of this value</short_desc>
<unit>C</unit> <unit>C</unit>
<decimal>3</decimal> <decimal>3</decimal>
</parameter> </parameter>
<parameter default="0.0" name="SENS_IMU_TEMP_FF" type="FLOAT">
<short_desc>IMU heater controller feedforward value</short_desc>
<min>0</min>
<max>1.0</max>
<unit>microseconds</unit>
<decimal>3</decimal>
</parameter>
<parameter default="0.025" name="SENS_IMU_TEMP_I" type="FLOAT"> <parameter default="0.025" name="SENS_IMU_TEMP_I" type="FLOAT">
<short_desc>IMU heater controller integrator gain value</short_desc> <short_desc>IMU heater controller integrator gain value</short_desc>
<min>0</min> <min>0</min>
...@@ -8355,10 +8377,10 @@ is less than 50% of this value</short_desc> ...@@ -8355,10 +8377,10 @@ is less than 50% of this value</short_desc>
<unit>microseconds/C</unit> <unit>microseconds/C</unit>
<decimal>3</decimal> <decimal>3</decimal>
</parameter> </parameter>
<parameter default="0.25" name="SENS_IMU_TEMP_P" type="FLOAT"> <parameter default="1.0" name="SENS_IMU_TEMP_P" type="FLOAT">
<short_desc>IMU heater controller proportional gain value</short_desc> <short_desc>IMU heater controller proportional gain value</short_desc>
<min>0</min> <min>0</min>
<max>1.0</max> <max>2.0</max>
<unit>microseconds/C</unit> <unit>microseconds/C</unit>
<decimal>3</decimal> <decimal>3</decimal>
</parameter> </parameter>
......
...@@ -408,7 +408,7 @@ FlightMap { ...@@ -408,7 +408,7 @@ FlightMap {
id: orbitCenterIndicator id: orbitCenterIndicator
anchorPoint.x: sourceItem.anchorPointX anchorPoint.x: sourceItem.anchorPointX
anchorPoint.y: sourceItem.anchorPointY anchorPoint.y: sourceItem.anchorPointY
coordinate: _activeVehicle ? _activeVehicle.orbitMapCircle.center : undefined coordinate: _activeVehicle ? _activeVehicle.orbitMapCircle.center : QtPositioning.coordinate()
visible: orbitTelemetryCircle.visible visible: orbitTelemetryCircle.visible
sourceItem: MissionItemIndexLabel { sourceItem: MissionItemIndexLabel {
......
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
****************************************************************************/ ****************************************************************************/
import QtQuick 2.3 import QtQuick 2.11
import QtQuick.Controls 1.2 import QtQuick.Controls 2.4
import QGroundControl 1.0 import QGroundControl 1.0
import QGroundControl.FlightDisplay 1.0 import QGroundControl.FlightDisplay 1.0
...@@ -28,6 +28,11 @@ Item { ...@@ -28,6 +28,11 @@ Item {
property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
property var _dynamicCameras: _activeVehicle ? _activeVehicle.dynamicCameras : null property var _dynamicCameras: _activeVehicle ? _activeVehicle.dynamicCameras : null
property bool _connected: _activeVehicle ? !_activeVehicle.connectionLost : false property bool _connected: _activeVehicle ? !_activeVehicle.connectionLost : false
property int _curCameraIndex: _dynamicCameras ? _dynamicCameras.currentCamera : 0
property bool _isCamera: _dynamicCameras ? _dynamicCameras.cameras.count > 0 : false
property var _camera: _isCamera ? _dynamicCameras.cameras.get(_curCameraIndex) : null
property bool _hasZoom: _camera && _camera.hasZoom
property int _fitMode: QGroundControl.settingsManager.videoSettings.videoFit.rawValue
Rectangle { Rectangle {
id: noVideo id: noVideo
anchors.fill: parent anchors.fill: parent
...@@ -51,10 +56,26 @@ Item { ...@@ -51,10 +56,26 @@ Item {
anchors.fill: parent anchors.fill: parent
color: "black" color: "black"
visible: _videoReceiver && _videoReceiver.videoRunning visible: _videoReceiver && _videoReceiver.videoRunning
function getWidth() {
//-- Fit Width or Stretch
if(_fitMode === 0 || _fitMode === 2) {
return parent.width
}
//-- Fit Height
return _ar != 0.0 ? parent.height * _ar : parent.width
}
function getHeight() {
//-- Fit Height or Stretch
if(_fitMode === 1 || _fitMode === 2) {
return parent.height
}
//-- Fit Width
return _ar != 0.0 ? parent.width * (1 / _ar) : parent.height
}
QGCVideoBackground { QGCVideoBackground {
id: videoContent id: videoContent
height: parent.height height: parent.getHeight()
width: _ar != 0.0 ? height * _ar : parent.width width: parent.getWidth()
anchors.centerIn: parent anchors.centerIn: parent
receiver: _videoReceiver receiver: _videoReceiver
display: _videoReceiver && _videoReceiver.videoSurface display: _videoReceiver && _videoReceiver.videoSurface
...@@ -104,5 +125,25 @@ Item { ...@@ -104,5 +125,25 @@ Item {
QGroundControl.videoManager.fullScreen = !QGroundControl.videoManager.fullScreen QGroundControl.videoManager.fullScreen = !QGroundControl.videoManager.fullScreen
} }
} }
PinchArea {
id: pinchZoom
enabled: _hasZoom
anchors.fill: parent
onPinchStarted: pinchZoom.zoom = 0
onPinchUpdated: {
if(_hasZoom) {
var z = 0
if(pinch.scale < 1) {
z = Math.round(pinch.scale * -10)
} else {
z = Math.round(pinch.scale)
}
if(pinchZoom.zoom != z) {
_camera.stepZoom(z)
}
}
}
property int zoom: 0
}
} }
} }
This diff is collapsed.
...@@ -35,18 +35,15 @@ public: ...@@ -35,18 +35,15 @@ public:
VideoManager (QGCApplication* app, QGCToolbox* toolbox); VideoManager (QGCApplication* app, QGCToolbox* toolbox);
~VideoManager (); ~VideoManager ();
Q_PROPERTY(bool hasVideo READ hasVideo NOTIFY hasVideoChanged) Q_PROPERTY(bool hasVideo READ hasVideo NOTIFY hasVideoChanged)
Q_PROPERTY(bool isGStreamer READ isGStreamer NOTIFY isGStreamerChanged) Q_PROPERTY(bool isGStreamer READ isGStreamer NOTIFY isGStreamerChanged)
Q_PROPERTY(bool isAutoStream READ isAutoStream NOTIFY isAutoStreamChanged) Q_PROPERTY(bool isTaisync READ isTaisync WRITE setIsTaisync NOTIFY isTaisyncChanged)
Q_PROPERTY(bool isTaisync READ isTaisync WRITE setIsTaisync NOTIFY isTaisyncChanged) Q_PROPERTY(QString videoSourceID READ videoSourceID NOTIFY videoSourceIDChanged)
Q_PROPERTY(QString videoSourceID READ videoSourceID NOTIFY videoSourceIDChanged) Q_PROPERTY(bool uvcEnabled READ uvcEnabled CONSTANT)
Q_PROPERTY(bool uvcEnabled READ uvcEnabled CONSTANT) Q_PROPERTY(bool fullScreen READ fullScreen WRITE setfullScreen NOTIFY fullScreenChanged)
Q_PROPERTY(bool fullScreen READ fullScreen WRITE setfullScreen NOTIFY fullScreenChanged) Q_PROPERTY(VideoReceiver* videoReceiver READ videoReceiver CONSTANT)
Q_PROPERTY(VideoReceiver* videoReceiver READ videoReceiver CONSTANT) Q_PROPERTY(double aspectRatio READ aspectRatio NOTIFY aspectRatioChanged)
Q_PROPERTY(double aspectRatio READ aspectRatio NOTIFY streamInfoChanged) Q_PROPERTY(bool autoStreamConfigured READ autoStreamConfigured NOTIFY autoStreamConfiguredChanged)
Q_PROPERTY(bool hasZoom READ hasZoom NOTIFY streamInfoChanged)
Q_PROPERTY(int streamCount READ streamCount NOTIFY streamCountChanged)
Q_PROPERTY(int currentStream READ currentStream WRITE setCurrentStream NOTIFY currentStreamChanged)
bool hasVideo (); bool hasVideo ();
bool isGStreamer (); bool isGStreamer ();
...@@ -54,11 +51,8 @@ public: ...@@ -54,11 +51,8 @@ public:
bool isTaisync () { return _isTaisync; } bool isTaisync () { return _isTaisync; }
bool fullScreen () { return _fullScreen; } bool fullScreen () { return _fullScreen; }
QString videoSourceID () { return _videoSourceID; } QString videoSourceID () { return _videoSourceID; }
QString autoURL () { return QString(_streamInfo.uri); }
double aspectRatio (); double aspectRatio ();
bool hasZoom () { return _streamInfo.flags & VIDEO_STREAM_HAS_BASIC_ZOOM; } bool autoStreamConfigured();
int currentStream () { return _currentStream; }
int streamCount () { return _streamInfo.count; }
VideoReceiver* videoReceiver () { return _videoReceiver; } VideoReceiver* videoReceiver () { return _videoReceiver; }
...@@ -70,15 +64,12 @@ public: ...@@ -70,15 +64,12 @@ public:
void setfullScreen (bool f) { _fullScreen = f; emit fullScreenChanged(); } void setfullScreen (bool f) { _fullScreen = f; emit fullScreenChanged(); }
void setIsTaisync (bool t) { _isTaisync = t; emit isTaisyncChanged(); } void setIsTaisync (bool t) { _isTaisync = t; emit isTaisyncChanged(); }
void setCurrentStream (int stream);
// Override from QGCTool // Override from QGCTool
void setToolbox (QGCToolbox *toolbox); void setToolbox (QGCToolbox *toolbox);
Q_INVOKABLE void startVideo () { _videoReceiver->start(); } Q_INVOKABLE void startVideo () { _videoReceiver->start(); }
Q_INVOKABLE void stopVideo () { _videoReceiver->stop(); } Q_INVOKABLE void stopVideo () { _videoReceiver->stop(); }
Q_INVOKABLE void stepZoom (int direction);
Q_INVOKABLE void stepStream (int direction);
signals: signals:
void hasVideoChanged (); void hasVideoChanged ();
...@@ -86,10 +77,9 @@ signals: ...@@ -86,10 +77,9 @@ signals:
void videoSourceIDChanged (); void videoSourceIDChanged ();
void fullScreenChanged (); void fullScreenChanged ();
void isAutoStreamChanged (); void isAutoStreamChanged ();
void streamInfoChanged ();
void isTaisyncChanged (); void isTaisyncChanged ();
void currentStreamChanged (); void aspectRatioChanged ();
void streamCountChanged (); void autoStreamConfiguredChanged();
private slots: private slots:
void _videoSourceChanged (); void _videoSourceChanged ();
...@@ -97,14 +87,12 @@ private slots: ...@@ -97,14 +87,12 @@ private slots:
void _rtspUrlChanged (); void _rtspUrlChanged ();
void _tcpUrlChanged (); void _tcpUrlChanged ();
void _updateUVC (); void _updateUVC ();
void _streamInfoChanged ();
void _setActiveVehicle (Vehicle* vehicle); void _setActiveVehicle (Vehicle* vehicle);
void _activeJoystickChanged (Joystick* joystick); void _aspectRatioChanged ();
void _vehicleMessageReceived (const mavlink_message_t& message); void _restartVideo ();
private: private:
void _updateSettings (); void _updateSettings ();
void _restartVideo ();
private: private:
bool _isTaisync = false; bool _isTaisync = false;
...@@ -113,13 +101,6 @@ private: ...@@ -113,13 +101,6 @@ private:
QString _videoSourceID; QString _videoSourceID;
bool _fullScreen = false; bool _fullScreen = false;
Vehicle* _activeVehicle = nullptr; Vehicle* _activeVehicle = nullptr;
Joystick* _activeJoystick = nullptr;
mavlink_video_stream_information_t _streamInfo;
bool _hasAutoStream = false;
uint8_t _videoStreamCompID = 0;
int _currentStream = 1;
QTime _lastZoomChange;
QTime _lastStreamChange;
}; };
#endif #endif
...@@ -7,10 +7,10 @@ ...@@ -7,10 +7,10 @@
* *
****************************************************************************/ ****************************************************************************/
import QtQuick 2.4 import QtQuick 2.11
import QtPositioning 5.2 import QtPositioning 5.2
import QtQuick.Layouts 1.2 import QtQuick.Layouts 1.2
import QtQuick.Controls 1.4 import QtQuick.Controls 2.4
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
...@@ -54,13 +54,14 @@ Item { ...@@ -54,13 +54,14 @@ Item {
} }
// Enable/Disable Video Streaming // Enable/Disable Video Streaming
QGCLabel { QGCLabel {
text: qsTr("Enable Stream") text: qsTr("Enable Stream")
font.pointSize: ScreenTools.smallFontPointSize font.pointSize: ScreenTools.smallFontPointSize
} }
QGCSwitch { QGCSwitch {
id: enableSwitch id: enableSwitch
enabled: _streamingEnabled enabled: _streamingEnabled
checked: QGroundControl.settingsManager.videoSettings.streamEnabled.rawValue checked: QGroundControl.settingsManager.videoSettings.streamEnabled.rawValue
Layout.alignment: Qt.AlignHCenter
onClicked: { onClicked: {
if(checked) { if(checked) {
QGroundControl.settingsManager.videoSettings.streamEnabled.rawValue = 1 QGroundControl.settingsManager.videoSettings.streamEnabled.rawValue = 1
...@@ -73,14 +74,15 @@ Item { ...@@ -73,14 +74,15 @@ Item {
} }
// Grid Lines // Grid Lines
QGCLabel { QGCLabel {
text: qsTr("Grid Lines") text: qsTr("Grid Lines")
font.pointSize: ScreenTools.smallFontPointSize font.pointSize: ScreenTools.smallFontPointSize
visible: QGroundControl.videoManager.isGStreamer && QGroundControl.settingsManager.videoSettings.gridLines.visible visible: QGroundControl.videoManager.isGStreamer && QGroundControl.settingsManager.videoSettings.gridLines.visible
} }
QGCSwitch { QGCSwitch {
enabled: _streamingEnabled && _activeVehicle enabled: _streamingEnabled && _activeVehicle
checked: QGroundControl.settingsManager.videoSettings.gridLines.rawValue checked: QGroundControl.settingsManager.videoSettings.gridLines.rawValue
visible: QGroundControl.videoManager.isGStreamer && QGroundControl.settingsManager.videoSettings.gridLines.visible visible: QGroundControl.videoManager.isGStreamer && QGroundControl.settingsManager.videoSettings.gridLines.visible
Layout.alignment: Qt.AlignHCenter
onClicked: { onClicked: {
if(checked) { if(checked) {
QGroundControl.settingsManager.videoSettings.gridLines.rawValue = 1 QGroundControl.settingsManager.videoSettings.gridLines.rawValue = 1
...@@ -89,6 +91,17 @@ Item { ...@@ -89,6 +91,17 @@ Item {
} }
} }
} }
//-- Video Fit
QGCLabel {
text: qsTr("Video Screen Fit")
font.pointSize: ScreenTools.smallFontPointSize
}
FactComboBox {
fact: QGroundControl.settingsManager.videoSettings.videoFit
indexModel: false
Layout.alignment: Qt.AlignHCenter
}
//-- Video Recording
QGCLabel { QGCLabel {
text: _recordingVideo ? qsTr("Stop Recording") : qsTr("Record Stream") text: _recordingVideo ? qsTr("Stop Recording") : qsTr("Record Stream")
font.pointSize: ScreenTools.smallFontPointSize font.pointSize: ScreenTools.smallFontPointSize
......
...@@ -516,12 +516,6 @@ void Joystick::run(void) ...@@ -516,12 +516,6 @@ void Joystick::run(void)
// Set up button pressed information // Set up button pressed information
// We only send the buttons the firmwware has reserved
int reservedButtonCount = _activeVehicle->manualControlReservedButtonCount();
if (reservedButtonCount == -1) {
reservedButtonCount = _totalButtonCount;
}
quint16 newButtonBits = 0; // New set of button which are down quint16 newButtonBits = 0; // New set of button which are down
quint16 buttonPressedBits = 0; // Buttons pressed for manualControl signal quint16 buttonPressedBits = 0; // Buttons pressed for manualControl signal
...@@ -536,12 +530,9 @@ void Joystick::run(void) ...@@ -536,12 +530,9 @@ void Joystick::run(void)
// Button was up last time through, but is now down which indicates a button press // Button was up last time through, but is now down which indicates a button press
qCDebug(JoystickLog) << "button triggered" << buttonIndex; qCDebug(JoystickLog) << "button triggered" << buttonIndex;
if (buttonIndex >= reservedButtonCount) { QString buttonAction =_rgButtonActions[buttonIndex];
// Button is above firmware reserved set if (!buttonAction.isEmpty()) {
QString buttonAction =_rgButtonActions[buttonIndex]; _buttonAction(buttonAction);
if (!buttonAction.isEmpty()) {
_buttonAction(buttonAction);
}
} }
} }
...@@ -554,6 +545,7 @@ void Joystick::run(void) ...@@ -554,6 +545,7 @@ void Joystick::run(void)
qCDebug(JoystickValuesLog) << "name:roll:pitch:yaw:throttle" << name() << roll << -pitch << yaw << throttle; qCDebug(JoystickValuesLog) << "name:roll:pitch:yaw:throttle" << name() << roll << -pitch << yaw << throttle;
// NOTE: The buttonPressedBits going to MANUAL_CONTROL are currently used by ArduSub.
emit manualControl(roll, -pitch, yaw, throttle, buttonPressedBits, _activeVehicle->joystickMode()); emit manualControl(roll, -pitch, yaw, throttle, buttonPressedBits, _activeVehicle->joystickMode());
} }
......
...@@ -153,7 +153,7 @@ ...@@ -153,7 +153,7 @@
"param1": { "param1": {
"label": "Abort Alt", "label": "Abort Alt",
"units": "m", "units": "m",
"default": 25.0, "default": 0,
"decimalPlaces": 2 "decimalPlaces": 2
}, },
"param4": { "param4": {
......
...@@ -32,22 +32,32 @@ Rectangle { ...@@ -32,22 +32,32 @@ Rectangle {
property string _altModeAboveTerrainHelpText: qsTr("Altitude above terrain\nActual AMSL altitude: %1 %2").arg(missionItem.amslAltAboveTerrain.valueString).arg(missionItem.amslAltAboveTerrain.units) property string _altModeAboveTerrainHelpText: qsTr("Altitude above terrain\nActual AMSL altitude: %1 %2").arg(missionItem.amslAltAboveTerrain.valueString).arg(missionItem.amslAltAboveTerrain.units)
property string _altModeTerrainFrameHelpText: qsTr("Using terrain reference frame") property string _altModeTerrainFrameHelpText: qsTr("Using terrain reference frame")
readonly property string _altModeRelativeExtraUnits: qsTr(" (Rel)")
readonly property string _altModeAbsoluteExtraUnits: qsTr(" (AMSL)")
readonly property string _altModeAboveTerrainExtraUnits: qsTr(" (Abv Terr)")
readonly property string _altModeTerrainFrameExtraUnits: qsTr(" (TerrF)")
function updateAltitudeModeText() { function updateAltitudeModeText() {
if (missionItem.altitudeMode === _altModeRelative) { if (missionItem.altitudeMode === _altModeRelative) {
altModeLabel.text = qsTr("Altitude") altModeLabel.text = qsTr("Altitude")
altModeHelp.text = _altModeRelativeHelpText altModeHelp.text = _altModeRelativeHelpText
altField.extraUnits = _altModeRelativeExtraUnits
} else if (missionItem.altitudeMode === _altModeAbsolute) { } else if (missionItem.altitudeMode === _altModeAbsolute) {
altModeLabel.text = qsTr("Above Mean Sea Level") altModeLabel.text = qsTr("Above Mean Sea Level")
altModeHelp.text = _altModeAbsoluteHelpText altModeHelp.text = _altModeAbsoluteHelpText
altField.extraUnits = _altModeAbsoluteExtraUnits
} else if (missionItem.altitudeMode === _altModeAboveTerrain) { } else if (missionItem.altitudeMode === _altModeAboveTerrain) {
altModeLabel.text = qsTr("Above Terrain") altModeLabel.text = qsTr("Above Terrain")
altModeHelp.text = Qt.binding(function() { return _altModeAboveTerrainHelpText }) altModeHelp.text = Qt.binding(function() { return _altModeAboveTerrainHelpText })
altField.extraUnits = _altModeAboveTerrainExtraUnits
} else if (missionItem.altitudeMode === _altModeTerrainFrame) { } else if (missionItem.altitudeMode === _altModeTerrainFrame) {
altModeLabel.text = qsTr("Terrain Frame") altModeLabel.text = qsTr("Terrain Frame")
altModeHelp.text = _altModeTerrainFrameHelpText altModeHelp.text = _altModeTerrainFrameHelpText
altField.extraUnits = _altModeTerrainFrameExtraUnits
} else { } else {
altModeLabel.text = qsTr("Internal Error") altModeLabel.text = qsTr("Internal Error")
altModeHelp.text = "" altModeHelp.text = ""
altField.extraUnits = ""
} }
} }
...@@ -130,11 +140,11 @@ Rectangle { ...@@ -130,11 +140,11 @@ Rectangle {
id: altHamburger id: altHamburger
anchors.leftMargin: ScreenTools.defaultFontPixelWidth / 4 anchors.leftMargin: ScreenTools.defaultFontPixelWidth / 4
anchors.left: altModeLabel.right anchors.left: altModeLabel.right
anchors.top: altModeLabel.top anchors.verticalCenter: altModeLabel.verticalCenter
width: height width: ScreenTools.defaultFontPixelHeight / 2
height: altModeLabel.height height: width
sourceSize.height: height sourceSize.height: height
source: "qrc:/qmlimages/Hamburger.svg" source: "/res/DropArrow.svg"
color: qgcPal.text color: qgcPal.text
} }
...@@ -166,6 +176,7 @@ Rectangle { ...@@ -166,6 +176,7 @@ Rectangle {
checkable: true checkable: true
checked: missionItem.altitudeMode === _altModeAboveTerrain checked: missionItem.altitudeMode === _altModeAboveTerrain
onTriggered: missionItem.altitudeMode = _altModeAboveTerrain onTriggered: missionItem.altitudeMode = _altModeAboveTerrain
visible: missionItem.specifiesCoordinate
} }
MenuItem { MenuItem {
...@@ -179,15 +190,21 @@ Rectangle { ...@@ -179,15 +190,21 @@ Rectangle {
} }
FactTextField { FactTextField {
fact: missionItem.altitude id: altField
fact: missionItem.altitude
unitsLabel: fact.units + extraUnits
anchors.left: parent.left
anchors.right: parent.right
property string extraUnits
} }
QGCLabel { QGCLabel {
id: altModeHelp id: altModeHelp
anchors.left: parent.left wrapMode: Text.WordWrap
anchors.right: parent.right font.pointSize: ScreenTools.smallFontPointSize
wrapMode: Text.WordWrap anchors.left: parent.left
font.pointSize: ScreenTools.smallFontPointSize anchors.right: parent.right
} }
} }
} }
......
...@@ -414,6 +414,7 @@ void QGCApplication::_initCommon(void) ...@@ -414,6 +414,7 @@ void QGCApplication::_initCommon(void)
qmlRegisterUncreatableType<ParameterManager> (kQGCVehicle, 1, 0, "ParameterManager", kRefOnly); qmlRegisterUncreatableType<ParameterManager> (kQGCVehicle, 1, 0, "ParameterManager", kRefOnly);
qmlRegisterUncreatableType<QGCCameraManager> (kQGCVehicle, 1, 0, "QGCCameraManager", kRefOnly); qmlRegisterUncreatableType<QGCCameraManager> (kQGCVehicle, 1, 0, "QGCCameraManager", kRefOnly);
qmlRegisterUncreatableType<QGCCameraControl> (kQGCVehicle, 1, 0, "QGCCameraControl", kRefOnly); qmlRegisterUncreatableType<QGCCameraControl> (kQGCVehicle, 1, 0, "QGCCameraControl", kRefOnly);
qmlRegisterUncreatableType<QGCVideoStreamInfo> (kQGCVehicle, 1, 0, "QGCVideoStreamInfo", kRefOnly);
qmlRegisterUncreatableType<LinkInterface> (kQGCVehicle, 1, 0, "LinkInterface", kRefOnly); qmlRegisterUncreatableType<LinkInterface> (kQGCVehicle, 1, 0, "LinkInterface", kRefOnly);
qmlRegisterUncreatableType<MissionController> (kQGCControllers, 1, 0, "MissionController", kRefOnly); qmlRegisterUncreatableType<MissionController> (kQGCControllers, 1, 0, "MissionController", kRefOnly);
qmlRegisterUncreatableType<GeoFenceController> (kQGCControllers, 1, 0, "GeoFenceController", kRefOnly); qmlRegisterUncreatableType<GeoFenceController> (kQGCControllers, 1, 0, "GeoFenceController", kRefOnly);
......
...@@ -181,7 +181,9 @@ Item { ...@@ -181,7 +181,9 @@ Item {
} else { } else {
baseSize = _defaultFont.font.pointSize; baseSize = _defaultFont.font.pointSize;
} }
_appFontPointSizeFact._setIgnoreQGCRebootRequired(true)
_appFontPointSizeFact.value = baseSize _appFontPointSizeFact.value = baseSize
_appFontPointSizeFact._setIgnoreQGCRebootRequired(false)
//-- Release build doesn't get signal //-- Release build doesn't get signal
if(!ScreenToolsController.isDebug) if(!ScreenToolsController.isDebug)
_screenTools._setBasePointSize(baseSize); _screenTools._setBasePointSize(baseSize);
......
...@@ -65,7 +65,7 @@ Rectangle { ...@@ -65,7 +65,7 @@ Rectangle {
QGCLabel { QGCLabel {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
text: title text: title
font.pointSize: ScreenTools.smallFontPointSize font.pointSize: ScreenTools.mobile ? ScreenTools.smallFontPointSize : ScreenTools.defaultFontPointSize
} }
Rectangle { Rectangle {
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
const char* VideoSettings::videoSourceNoVideo = "No Video Available"; const char* VideoSettings::videoSourceNoVideo = "No Video Available";
const char* VideoSettings::videoDisabled = "Video Stream Disabled"; const char* VideoSettings::videoDisabled = "Video Stream Disabled";
const char* VideoSettings::videoSourceAuto = "Automatic Video Stream";
const char* VideoSettings::videoSourceRTSP = "RTSP Video Stream"; const char* VideoSettings::videoSourceRTSP = "RTSP Video Stream";
const char* VideoSettings::videoSourceUDP = "UDP Video Stream"; const char* VideoSettings::videoSourceUDP = "UDP Video Stream";
const char* VideoSettings::videoSourceTCP = "TCP-MPEG2 Video Stream"; const char* VideoSettings::videoSourceTCP = "TCP-MPEG2 Video Stream";
...@@ -35,7 +34,6 @@ DECLARE_SETTINGGROUP(Video, "Video") ...@@ -35,7 +34,6 @@ DECLARE_SETTINGGROUP(Video, "Video")
// Setup enum values for videoSource settings into meta data // Setup enum values for videoSource settings into meta data
QStringList videoSourceList; QStringList videoSourceList;
#ifdef QGC_GST_STREAMING #ifdef QGC_GST_STREAMING
videoSourceList.append(videoSourceAuto);
videoSourceList.append(videoSourceRTSP); videoSourceList.append(videoSourceRTSP);
#ifndef NO_UDP_VIDEO #ifndef NO_UDP_VIDEO
videoSourceList.append(videoSourceUDP); videoSourceList.append(videoSourceUDP);
...@@ -133,10 +131,16 @@ bool VideoSettings::streamConfigured(void) ...@@ -133,10 +131,16 @@ bool VideoSettings::streamConfigured(void)
#if !defined(QGC_GST_STREAMING) #if !defined(QGC_GST_STREAMING)
return false; return false;
#endif #endif
//-- First, check if it's disabled
QString vSource = videoSource()->rawValue().toString(); QString vSource = videoSource()->rawValue().toString();
if(vSource == videoSourceNoVideo || vSource == videoDisabled) { if(vSource == videoSourceNoVideo || vSource == videoDisabled) {
return false; return false;
} }
//-- Check if it's autoconfigured
if(qgcApp()->toolbox()->videoManager()->autoStreamConfigured()) {
qCDebug(VideoManagerLog) << "Stream auto configured";
return true;
}
//-- If UDP, check if port is set //-- If UDP, check if port is set
if(vSource == videoSourceUDP) { if(vSource == videoSourceUDP) {
qCDebug(VideoManagerLog) << "Testing configuration for UDP Stream:" << udpPort()->rawValue().toInt(); qCDebug(VideoManagerLog) << "Testing configuration for UDP Stream:" << udpPort()->rawValue().toInt();
...@@ -157,11 +161,6 @@ bool VideoSettings::streamConfigured(void) ...@@ -157,11 +161,6 @@ bool VideoSettings::streamConfigured(void)
qCDebug(VideoManagerLog) << "Testing configuration for MPEG-TS Stream:" << udpPort()->rawValue().toInt(); qCDebug(VideoManagerLog) << "Testing configuration for MPEG-TS Stream:" << udpPort()->rawValue().toInt();
return udpPort()->rawValue().toInt() != 0; return udpPort()->rawValue().toInt() != 0;
} }
//-- If Auto, check for received URL
if(vSource == videoSourceAuto) {
qCDebug(VideoManagerLog) << "Testing configuration for Auto Stream:" << qgcApp()->toolbox()->videoManager()->autoURL();
return !qgcApp()->toolbox()->videoManager()->autoURL().isEmpty();
}
return false; return false;
} }
......
...@@ -36,14 +36,12 @@ public: ...@@ -36,14 +36,12 @@ public:
DEFINE_SETTINGFACT(disableWhenDisarmed) DEFINE_SETTINGFACT(disableWhenDisarmed)
Q_PROPERTY(bool streamConfigured READ streamConfigured NOTIFY streamConfiguredChanged) Q_PROPERTY(bool streamConfigured READ streamConfigured NOTIFY streamConfiguredChanged)
Q_PROPERTY(QString autoVideoSource READ autoVideoSource CONSTANT)
Q_PROPERTY(QString rtspVideoSource READ rtspVideoSource CONSTANT) Q_PROPERTY(QString rtspVideoSource READ rtspVideoSource CONSTANT)
Q_PROPERTY(QString udpVideoSource READ udpVideoSource CONSTANT) Q_PROPERTY(QString udpVideoSource READ udpVideoSource CONSTANT)
Q_PROPERTY(QString tcpVideoSource READ tcpVideoSource CONSTANT) Q_PROPERTY(QString tcpVideoSource READ tcpVideoSource CONSTANT)
Q_PROPERTY(QString mpegtsVideoSource READ mpegtsVideoSource CONSTANT) Q_PROPERTY(QString mpegtsVideoSource READ mpegtsVideoSource CONSTANT)
bool streamConfigured (); bool streamConfigured ();
QString autoVideoSource () { return videoSourceAuto; }
QString rtspVideoSource () { return videoSourceRTSP; } QString rtspVideoSource () { return videoSourceRTSP; }
QString udpVideoSource () { return videoSourceUDP; } QString udpVideoSource () { return videoSourceUDP; }
QString tcpVideoSource () { return videoSourceTCP; } QString tcpVideoSource () { return videoSourceTCP; }
...@@ -53,7 +51,6 @@ public: ...@@ -53,7 +51,6 @@ public:
static const char* videoDisabled; static const char* videoDisabled;
static const char* videoSourceUDP; static const char* videoSourceUDP;
static const char* videoSourceRTSP; static const char* videoSourceRTSP;
static const char* videoSourceAuto;
static const char* videoSourceTCP; static const char* videoSourceTCP;
static const char* videoSourceMPEGTS; static const char* videoSourceMPEGTS;
......
...@@ -2214,11 +2214,6 @@ void Vehicle::resetMessages() ...@@ -2214,11 +2214,6 @@ void Vehicle::resetMessages()
} }
} }
int Vehicle::manualControlReservedButtonCount(void)
{
return _firmwarePlugin->manualControlReservedButtonCount();
}
void Vehicle::_loadSettings(void) void Vehicle::_loadSettings(void)
{ {
if (!_active) { if (!_active) {
......
...@@ -691,12 +691,6 @@ public: ...@@ -691,12 +691,6 @@ public:
/// Resets link status counters /// Resets link status counters
Q_INVOKABLE void resetCounters (); Q_INVOKABLE void resetCounters ();
/// Returns the number of buttons which are reserved for firmware use in the MANUAL_CONTROL mavlink
/// message. For example PX4 Flight Stack reserves the first 8 buttons to simulate rc switches.
/// The remainder can be assigned to Vehicle actions.
/// @return -1: reserver all buttons, >0 number of buttons to reserve
Q_PROPERTY(int manualControlReservedButtonCount READ manualControlReservedButtonCount CONSTANT)
// Called when the message drop-down is invoked to clear current count // Called when the message drop-down is invoked to clear current count
Q_INVOKABLE void resetMessages(); Q_INVOKABLE void resetMessages();
...@@ -821,8 +815,6 @@ public: ...@@ -821,8 +815,6 @@ public:
/// Provides access to the Firmware Plugin for this Vehicle /// Provides access to the Firmware Plugin for this Vehicle
FirmwarePlugin* firmwarePlugin(void) { return _firmwarePlugin; } FirmwarePlugin* firmwarePlugin(void) { return _firmwarePlugin; }
int manualControlReservedButtonCount(void);
MissionManager* missionManager(void) { return _missionManager; } MissionManager* missionManager(void) { return _missionManager; }
GeoFenceManager* geoFenceManager(void) { return _geoFenceManager; } GeoFenceManager* geoFenceManager(void) { return _geoFenceManager; }
RallyPointManager* rallyPointManager(void) { return _rallyPointManager; } RallyPointManager* rallyPointManager(void) { return _rallyPointManager; }
......
...@@ -74,6 +74,7 @@ public: ...@@ -74,6 +74,7 @@ public:
static const int boardIDTAPV1 = 64; ///< TAP V1 board, as from USB PID static const int boardIDTAPV1 = 64; ///< TAP V1 board, as from USB PID
static const int boardIDASCV1 = 65; ///< ASC V1 board, as from USB PID static const int boardIDASCV1 = 65; ///< ASC V1 board, as from USB PID
static const int boardIDCrazyflie2 = 12; ///< Crazyflie 2.0 board, as from USB PID static const int boardIDCrazyflie2 = 12; ///< Crazyflie 2.0 board, as from USB PID
static const int boardIDOmnibusF4SD = 42; ///< Omnibus F4 SD, as from USB PID
static const int boardIDNXPHliteV3 = 28; ///< NXPHliteV3 board, as from USB PID static const int boardIDNXPHliteV3 = 28; ///< NXPHliteV3 board, as from USB PID
/// Simulated board id for V3 which is a V2 board which supports larger flash space /// Simulated board id for V3 which is a V2 board which supports larger flash space
......
...@@ -262,6 +262,12 @@ void FirmwareUpgradeController::_initFirmwareHash() ...@@ -262,6 +262,12 @@ void FirmwareUpgradeController::_initFirmwareHash()
{ AutoPilotStackPX4, DeveloperFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Firmware/master/crazyflie_default.px4"}, { AutoPilotStackPX4, DeveloperFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Firmware/master/crazyflie_default.px4"},
}; };
FirmwareToUrlElement_t rgOmnibusF4SDFirmwareArray[] = {
{ AutoPilotStackPX4, StableFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Firmware/stable/omnibus_f4sd_default.px4"},
{ AutoPilotStackPX4, BetaFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Firmware/beta/omnibus_f4sd_default.px4"},
{ AutoPilotStackPX4, DeveloperFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Firmware/master/omnibus_f4sd_default.px4"},
};
/////////////////////////////// px4flow firmwares /////////////////////////////////////// /////////////////////////////// px4flow firmwares ///////////////////////////////////////
FirmwareToUrlElement_t rgPX4FLowFirmwareArray[] = { FirmwareToUrlElement_t rgPX4FLowFirmwareArray[] = {
{ PX4FlowPX4, StableFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Flow/master/px4flow.px4" }, { PX4FlowPX4, StableFirmware, DefaultVehicleFirmware, "http://px4-travis.s3.amazonaws.com/Flow/master/px4flow.px4" },
...@@ -447,6 +453,12 @@ void FirmwareUpgradeController::_initFirmwareHash() ...@@ -447,6 +453,12 @@ void FirmwareUpgradeController::_initFirmwareHash()
_rgCrazyflie2Firmware.insert(FirmwareIdentifier(element.stackType, element.firmwareType, element.vehicleType), element.url); _rgCrazyflie2Firmware.insert(FirmwareIdentifier(element.stackType, element.firmwareType, element.vehicleType), element.url);
} }
size = sizeof(rgOmnibusF4SDFirmwareArray)/sizeof(rgOmnibusF4SDFirmwareArray[0]);
for (int i = 0; i < size; i++) {
const FirmwareToUrlElement_t& element = rgOmnibusF4SDFirmwareArray[i];
_rgOmnibusF4SDFirmware.insert(FirmwareIdentifier(element.stackType, element.firmwareType, element.vehicleType), element.url);
}
size = sizeof(rgPX4FLowFirmwareArray)/sizeof(rgPX4FLowFirmwareArray[0]); size = sizeof(rgPX4FLowFirmwareArray)/sizeof(rgPX4FLowFirmwareArray[0]);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
const FirmwareToUrlElement_t& element = rgPX4FLowFirmwareArray[i]; const FirmwareToUrlElement_t& element = rgPX4FLowFirmwareArray[i];
...@@ -514,6 +526,9 @@ QHash<FirmwareUpgradeController::FirmwareIdentifier, QString>* FirmwareUpgradeCo ...@@ -514,6 +526,9 @@ QHash<FirmwareUpgradeController::FirmwareIdentifier, QString>* FirmwareUpgradeCo
case Bootloader::boardIDCrazyflie2: case Bootloader::boardIDCrazyflie2:
rgFirmware = &_rgCrazyflie2Firmware; rgFirmware = &_rgCrazyflie2Firmware;
break; break;
case Bootloader::boardIDOmnibusF4SD:
rgFirmware = &_rgOmnibusF4SDFirmware;
break;
case Bootloader::boardIDNXPHliteV3: case Bootloader::boardIDNXPHliteV3:
rgFirmware = &_rgNXPHliteV3Firmware; rgFirmware = &_rgNXPHliteV3Firmware;
break; break;
......
...@@ -211,6 +211,7 @@ private: ...@@ -211,6 +211,7 @@ private:
QHash<FirmwareIdentifier, QString> _rgTAPV1Firmware; QHash<FirmwareIdentifier, QString> _rgTAPV1Firmware;
QHash<FirmwareIdentifier, QString> _rgASCV1Firmware; QHash<FirmwareIdentifier, QString> _rgASCV1Firmware;
QHash<FirmwareIdentifier, QString> _rgCrazyflie2Firmware; QHash<FirmwareIdentifier, QString> _rgCrazyflie2Firmware;
QHash<FirmwareIdentifier, QString> _rgOmnibusF4SDFirmware;
QHash<FirmwareIdentifier, QString> _rgNXPHliteV3Firmware; QHash<FirmwareIdentifier, QString> _rgNXPHliteV3Firmware;
QHash<FirmwareIdentifier, QString> _rgPX4FLowFirmware; QHash<FirmwareIdentifier, QString> _rgPX4FLowFirmware;
QHash<FirmwareIdentifier, QString> _rg3DRRadioFirmware; QHash<FirmwareIdentifier, QString> _rg3DRRadioFirmware;
......
...@@ -620,20 +620,13 @@ SetupPage { ...@@ -620,20 +620,13 @@ SetupPage {
width: parent.width width: parent.width
spacing: ScreenTools.defaultFontPixelHeight / 3 spacing: ScreenTools.defaultFontPixelHeight / 3
QGCLabel {
visible: _activeVehicle.manualControlReservedButtonCount != 0
text: qsTr("Buttons 0-%1 reserved for firmware use").arg(reservedButtonCount)
property int reservedButtonCount: _activeVehicle.manualControlReservedButtonCount == -1 ? _activeJoystick.totalButtonCount : _activeVehicle.manualControlReservedButtonCount
}
Repeater { Repeater {
id: buttonActionRepeater id: buttonActionRepeater
model: _activeJoystick ? Math.min(_activeJoystick.totalButtonCount, _maxButtons) : 0 model: _activeJoystick ? Math.min(_activeJoystick.totalButtonCount, _maxButtons) : 0
Row { Row {
spacing: ScreenTools.defaultFontPixelWidth spacing: ScreenTools.defaultFontPixelWidth
visible: (_activeVehicle.manualControlReservedButtonCount == -1 ? false : modelData >= _activeVehicle.manualControlReservedButtonCount) && !_activeVehicle.supportsJSButton visible: !_activeVehicle.supportsJSButton
property bool pressed property bool pressed
......
...@@ -472,7 +472,7 @@ VideoReceiver::start() ...@@ -472,7 +472,7 @@ VideoReceiver::start()
void void
VideoReceiver::stop() VideoReceiver::stop()
{ {
if(qgcApp()->runningUnitTests()) { if(qgcApp() && qgcApp()->runningUnitTests()) {
return; return;
} }
#if defined(QGC_GST_STREAMING) #if defined(QGC_GST_STREAMING)
......
...@@ -18,6 +18,10 @@ ...@@ -18,6 +18,10 @@
#include "VideoReceiver.h" #include "VideoReceiver.h"
#include "QGCLoggingCategory.h" #include "QGCLoggingCategory.h"
#if !defined(__mobile__)
#include "QGCQmlWidgetHolder.h"
#endif
#include <QtQml> #include <QtQml>
#include <QQmlEngine> #include <QQmlEngine>
...@@ -324,3 +328,17 @@ QString QGCCorePlugin::stableVersionCheckFileUrl(void) const ...@@ -324,3 +328,17 @@ QString QGCCorePlugin::stableVersionCheckFileUrl(void) const
return QString("https://s3-us-west-2.amazonaws.com/qgroundcontrol/latest/QGC.version.txt"); return QString("https://s3-us-west-2.amazonaws.com/qgroundcontrol/latest/QGC.version.txt");
#endif #endif
} }
#if !defined(__mobile__)
QGCQmlWidgetHolder* QGCCorePlugin::createMainQmlWidgetHolder(QLayout *mainLayout, QWidget* parent)
{
QGCQmlWidgetHolder* pMainQmlWidgetHolder = new QGCQmlWidgetHolder(QString(), nullptr, parent);
mainLayout->addWidget(pMainQmlWidgetHolder);
pMainQmlWidgetHolder->setVisible(true);
QQmlEngine::setObjectOwnership(parent, QQmlEngine::CppOwnership);
pMainQmlWidgetHolder->setContextPropertyObject("controller", parent);
pMainQmlWidgetHolder->setContextPropertyObject("debugMessageModel", AppMessages::getModel());
pMainQmlWidgetHolder->setSource(QUrl::fromUserInput("qrc:qml/MainWindowHybrid.qml"));
return pMainQmlWidgetHolder;
}
#endif
...@@ -34,6 +34,12 @@ class QmlObjectListModel; ...@@ -34,6 +34,12 @@ class QmlObjectListModel;
class VideoReceiver; class VideoReceiver;
class PlanMasterController; class PlanMasterController;
#if !defined(__mobile__)
class QLayout;
class QMainWindow;
class QGCQmlWidgetHolder;
#endif
class QGCCorePlugin : public QGCTool class QGCCorePlugin : public QGCTool
{ {
Q_OBJECT Q_OBJECT
...@@ -102,6 +108,11 @@ public: ...@@ -102,6 +108,11 @@ public:
/// Allows the plugin to override the creation of the root (native) window. /// Allows the plugin to override the creation of the root (native) window.
virtual QQmlApplicationEngine* createRootWindow(QObject* parent); virtual QQmlApplicationEngine* createRootWindow(QObject* parent);
/// Allows the plugin to have a chance to initialize the creation of the root (non native) window.
#if !defined(__mobile__)
virtual QGCQmlWidgetHolder* createMainQmlWidgetHolder(QLayout* mainLayout, QWidget *parent);
#endif
/// Allows the plugin to override the creation of VideoReceiver. /// Allows the plugin to override the creation of VideoReceiver.
virtual VideoReceiver* createVideoReceiver(QObject* parent); virtual VideoReceiver* createVideoReceiver(QObject* parent);
......
...@@ -84,7 +84,7 @@ static const char *rgDockWidgetNames[] = { ...@@ -84,7 +84,7 @@ static const char *rgDockWidgetNames[] = {
static const char* _visibleWidgetsKey = "VisibleWidgets"; static const char* _visibleWidgetsKey = "VisibleWidgets";
#endif #endif
static MainWindow* _instance = NULL; ///< @brief MainWindow singleton static MainWindow* _instance = nullptr; ///< @brief MainWindow singleton
MainWindow* MainWindow::_create() MainWindow* MainWindow::_create()
{ {
...@@ -106,10 +106,10 @@ void MainWindow::deleteInstance(void) ...@@ -106,10 +106,10 @@ void MainWindow::deleteInstance(void)
/// by MainWindow::_create method. Hence no other code should have access to /// by MainWindow::_create method. Hence no other code should have access to
/// constructor. /// constructor.
MainWindow::MainWindow() MainWindow::MainWindow()
: _mavlinkDecoder (NULL) : _mavlinkDecoder (nullptr)
, _lowPowerMode (false) , _lowPowerMode (false)
, _showStatusBar (false) , _showStatusBar (false)
, _mainQmlWidgetHolder (NULL) , _mainQmlWidgetHolder (nullptr)
, _forceClose (false) , _forceClose (false)
{ {
_instance = this; _instance = this;
...@@ -138,21 +138,15 @@ MainWindow::MainWindow() ...@@ -138,21 +138,15 @@ MainWindow::MainWindow()
_centralLayout->setContentsMargins(0, 0, 0, 0); _centralLayout->setContentsMargins(0, 0, 0, 0);
centralWidget()->setLayout(_centralLayout); centralWidget()->setLayout(_centralLayout);
_mainQmlWidgetHolder = new QGCQmlWidgetHolder(QString(), NULL, this); //-- Allow plugin to initialize main QML Widget
_centralLayout->addWidget(_mainQmlWidgetHolder); _mainQmlWidgetHolder = qgcApp()->toolbox()->corePlugin()->createMainQmlWidgetHolder(_centralLayout, this);
_mainQmlWidgetHolder->setVisible(true);
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
_mainQmlWidgetHolder->setContextPropertyObject("controller", this);
_mainQmlWidgetHolder->setContextPropertyObject("debugMessageModel", AppMessages::getModel());
_mainQmlWidgetHolder->setSource(QUrl::fromUserInput("qrc:qml/MainWindowHybrid.qml"));
// Image provider // Image provider
QQuickImageProvider* pImgProvider = dynamic_cast<QQuickImageProvider*>(qgcApp()->toolbox()->imageProvider()); QQuickImageProvider* pImgProvider = dynamic_cast<QQuickImageProvider*>(qgcApp()->toolbox()->imageProvider());
_mainQmlWidgetHolder->getEngine()->addImageProvider(QStringLiteral("QGCImages"), pImgProvider); _mainQmlWidgetHolder->getEngine()->addImageProvider(QStringLiteral("QGCImages"), pImgProvider);
// Set dock options // Set dock options
setDockOptions(0); setDockOptions(nullptr);
// Setup corners // Setup corners
setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea); setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
...@@ -162,7 +156,7 @@ MainWindow::MainWindow() ...@@ -162,7 +156,7 @@ MainWindow::MainWindow()
#endif #endif
#ifdef UNITTEST_BUILD #ifdef UNITTEST_BUILD
QAction* qmlTestAction = new QAction("Test QML palette and controls", NULL); QAction* qmlTestAction = new QAction("Test QML palette and controls", nullptr);
connect(qmlTestAction, &QAction::triggered, this, &MainWindow::_showQmlTestWidget); connect(qmlTestAction, &QAction::triggered, this, &MainWindow::_showQmlTestWidget);
_ui.menuWidgets->addAction(qmlTestAction); _ui.menuWidgets->addAction(qmlTestAction);
#endif #endif
...@@ -246,14 +240,14 @@ MainWindow::~MainWindow() ...@@ -246,14 +240,14 @@ MainWindow::~MainWindow()
_mavlinkDecoder->finish(); _mavlinkDecoder->finish();
_mavlinkDecoder->wait(1000); _mavlinkDecoder->wait(1000);
_mavlinkDecoder->deleteLater(); _mavlinkDecoder->deleteLater();
_mavlinkDecoder = NULL; _mavlinkDecoder = nullptr;
} }
// This needs to happen before we get into the QWidget dtor // This needs to happen before we get into the QWidget dtor
// otherwise the QML engine reads freed data and tries to // otherwise the QML engine reads freed data and tries to
// destroy MainWindow a second time. // destroy MainWindow a second time.
delete _mainQmlWidgetHolder; delete _mainQmlWidgetHolder;
_instance = NULL; _instance = nullptr;
} }
QString MainWindow::_getWindowGeometryKey() QString MainWindow::_getWindowGeometryKey()
...@@ -315,7 +309,7 @@ void MainWindow::_showDockWidget(const QString& name, bool show) ...@@ -315,7 +309,7 @@ void MainWindow::_showDockWidget(const QString& name, bool show)
/// Creates the specified inner dock widget and adds to the QDockWidget /// Creates the specified inner dock widget and adds to the QDockWidget
bool MainWindow::_createInnerDockWidget(const QString& widgetName) bool MainWindow::_createInnerDockWidget(const QString& widgetName)
{ {
QGCDockWidget* widget = NULL; QGCDockWidget* widget = nullptr;
QAction *action = _mapName2Action[widgetName]; QAction *action = _mapName2Action[widgetName];
if(action) { if(action) {
switch(action->data().toInt()) { switch(action->data().toInt()) {
...@@ -339,7 +333,7 @@ bool MainWindow::_createInnerDockWidget(const QString& widgetName) ...@@ -339,7 +333,7 @@ bool MainWindow::_createInnerDockWidget(const QString& widgetName)
_mapName2DockWidget[widgetName] = widget; _mapName2DockWidget[widgetName] = widget;
} }
} }
return widget != NULL; return widget != nullptr;
} }
void MainWindow::_hideAllDockWidgets(void) void MainWindow::_hideAllDockWidgets(void)
...@@ -510,7 +504,7 @@ void MainWindow::_storeVisibleWidgetsSettings(void) ...@@ -510,7 +504,7 @@ void MainWindow::_storeVisibleWidgetsSettings(void)
QObject* MainWindow::rootQmlObject(void) QObject* MainWindow::rootQmlObject(void)
{ {
return _mainQmlWidgetHolder->getRootObject(); return _mainQmlWidgetHolder ? _mainQmlWidgetHolder->getRootObject() : nullptr;
} }
void MainWindow::_showAdvancedUIChanged(bool advanced) void MainWindow::_showAdvancedUIChanged(bool advanced)
......
...@@ -47,7 +47,6 @@ QGCView { ...@@ -47,7 +47,6 @@ QGCView {
property string _videoSource: QGroundControl.settingsManager.videoSettings.videoSource.value property string _videoSource: QGroundControl.settingsManager.videoSettings.videoSource.value
property bool _isGst: QGroundControl.videoManager.isGStreamer property bool _isGst: QGroundControl.videoManager.isGStreamer
property bool _isAutoStream: QGroundControl.videoManager.isAutoStream
property bool _isUDP: _isGst && _videoSource === QGroundControl.settingsManager.videoSettings.udpVideoSource property bool _isUDP: _isGst && _videoSource === QGroundControl.settingsManager.videoSettings.udpVideoSource
property bool _isRTSP: _isGst && _videoSource === QGroundControl.settingsManager.videoSettings.rtspVideoSource property bool _isRTSP: _isGst && _videoSource === QGroundControl.settingsManager.videoSettings.rtspVideoSource
property bool _isTCP: _isGst && _videoSource === QGroundControl.settingsManager.videoSettings.tcpVideoSource property bool _isTCP: _isGst && _videoSource === QGroundControl.settingsManager.videoSettings.tcpVideoSource
...@@ -691,7 +690,7 @@ QGCView { ...@@ -691,7 +690,7 @@ QGCView {
QGCLabel { QGCLabel {
id: videoSectionLabel id: videoSectionLabel
text: qsTr("Video") text: qsTr("Video")
visible: QGroundControl.settingsManager.videoSettings.visible visible: QGroundControl.settingsManager.videoSettings.visible && !QGroundControl.videoManager.autoStreamConfigured
} }
Rectangle { Rectangle {
Layout.preferredWidth: videoGrid.width + (_margins * 2) Layout.preferredWidth: videoGrid.width + (_margins * 2)
...@@ -751,12 +750,12 @@ QGCView { ...@@ -751,12 +750,12 @@ QGCView {
} }
QGCLabel { QGCLabel {
text: qsTr("Aspect Ratio") text: qsTr("Aspect Ratio")
visible: !_isAutoStream && _isGst && QGroundControl.settingsManager.videoSettings.aspectRatio.visible visible: _isGst && QGroundControl.settingsManager.videoSettings.aspectRatio.visible
} }
FactTextField { FactTextField {
Layout.preferredWidth: _comboFieldWidth Layout.preferredWidth: _comboFieldWidth
fact: QGroundControl.settingsManager.videoSettings.aspectRatio fact: QGroundControl.settingsManager.videoSettings.aspectRatio
visible: !_isAutoStream && _isGst && QGroundControl.settingsManager.videoSettings.aspectRatio.visible visible: _isGst && QGroundControl.settingsManager.videoSettings.aspectRatio.visible
} }
QGCLabel { QGCLabel {
...@@ -776,10 +775,10 @@ QGCView { ...@@ -776,10 +775,10 @@ QGCView {
QGCLabel { QGCLabel {
id: videoRecSectionLabel id: videoRecSectionLabel
text: qsTr("Video Recording") text: qsTr("Video Recording")
visible: QGroundControl.settingsManager.videoSettings.visible && _isGst visible: (QGroundControl.settingsManager.videoSettings.visible && _isGst) || QGroundControl.videoManager.autoStreamConfigured
} }
Rectangle { Rectangle {
Layout.preferredWidth: videoRecCol.width + (_margins * 2) Layout.preferredWidth: videoRecCol.width + (_margins * 2)
Layout.preferredHeight: videoRecCol.height + (_margins * 2) Layout.preferredHeight: videoRecCol.height + (_margins * 2)
Layout.fillWidth: true Layout.fillWidth: true
color: qgcPal.windowShade color: qgcPal.windowShade
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment