Commit 3a37fd25 authored by dogmaphobic's avatar dogmaphobic

Merge remote-tracking branch 'mavlink/master' into videoWork

* mavlink/master:
  Missed qDebug. Sorry for the commit deluge...
  Reducing PIP size on Android a bit. It was kind of big...
  Revert "Start logging on heartbeat instead of connect"
  Doc fix for getting gstreamer in to android build
  Adjustments to Telemetry Data
  Remove removed Widget
  Fixed Style for switch
  Fix opening DockWidget views
  Do not use the text() of the Action to show a DockWidget
  Translate the names of the Views
  Declare the Static Const Char on the .cpp file
  Do not let the Fullscreen/Normal be completely unselected
  Do not dynamic_cast QObject, use qobject_cast, it's faster.
  Support correct parameter set for APM
parents 0818cfe4 b2471b00
<RCC> <RCC>
<qresource prefix="/unittest"> <qresource prefix="/unittest">
<file alias="MockLink.params">src/comm/MockLink.params</file> <file alias="PX4MockLink.params">src/comm/PX4MockLink.params</file>
<file alias="APMArduCopterMockLink.params">src/comm/APMArduCopterMockLink.params</file>
<file alias="APMArduPlaneMockLink.params">src/comm/APMArduPlaneMockLink.params</file>
<file alias="FactSystemTest.qml">src/FactSystem/FactSystemTest.qml</file> <file alias="FactSystemTest.qml">src/FactSystem/FactSystemTest.qml</file>
</qresource> </qresource>
<qresource prefix="/qml"> <qresource prefix="/qml">
......
...@@ -75,6 +75,8 @@ Item { ...@@ -75,6 +75,8 @@ Item {
property var _flightVideo: null property var _flightVideo: null
property var _savedZoomLevel: 0 property var _savedZoomLevel: 0
property real _pipSize: ScreenTools.isAndroid ? ScreenTools.defaultFontPixelSize * (8) : ScreenTools.defaultFontPixelSize * (9)
FlightDisplayViewController { id: _controller } FlightDisplayViewController { id: _controller }
MissionController { MissionController {
...@@ -125,8 +127,8 @@ Item { ...@@ -125,8 +127,8 @@ Item {
anchors.margins: ScreenTools.defaultFontPixelHeight anchors.margins: ScreenTools.defaultFontPixelHeight
anchors.left: parent.left anchors.left: parent.left
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: ScreenTools.defaultFontPixelSize * (9) height: _pipSize
width: ScreenTools.defaultFontPixelSize * (9) * (16/9) width: _pipSize * (16/9)
color: "#000010" color: "#000010"
border.width: 4 border.width: 4
radius: 4 radius: 4
......
...@@ -87,7 +87,6 @@ Item { ...@@ -87,7 +87,6 @@ Item {
altitude: _altitudeWGS84 altitude: _altitudeWGS84
groundSpeed: _groundSpeed groundSpeed: _groundSpeed
airSpeed: _airSpeed airSpeed: _airSpeed
climbRate: _climbRate
isSatellite: _mainIsMap ? _flightMap ? _flightMap.isSatelliteMap : true : true isSatellite: _mainIsMap ? _flightMap ? _flightMap.isSatelliteMap : true : true
z: QGroundControl.zOrderWidgets z: QGroundControl.zOrderWidgets
} }
...@@ -97,7 +96,7 @@ Item { ...@@ -97,7 +96,7 @@ Item {
id: toolColumn id: toolColumn
anchors.margins: ScreenTools.defaultFontPixelHeight anchors.margins: ScreenTools.defaultFontPixelHeight
anchors.left: parent.left anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter anchors.top: parent.top
spacing: ScreenTools.defaultFontPixelHeight spacing: ScreenTools.defaultFontPixelHeight
//-- Map Center Control //-- Map Center Control
......
...@@ -42,7 +42,6 @@ Item { ...@@ -42,7 +42,6 @@ Item {
property real altitude: 0 property real altitude: 0
property real groundSpeed: 0 property real groundSpeed: 0
property real airSpeed: 0 property real airSpeed: 0
property real climbRate: 0
property real size: ScreenTools.defaultFontPixelSize * (10) property real size: ScreenTools.defaultFontPixelSize * (10)
property bool isSatellite: false property bool isSatellite: false
property bool active: false property bool active: false
...@@ -78,24 +77,21 @@ Item { ...@@ -78,24 +77,21 @@ Item {
color: isSatellite ? Qt.rgba(0,0,0,0.25) : Qt.rgba(1,1,1,0.25) color: isSatellite ? Qt.rgba(0,0,0,0.25) : Qt.rgba(1,1,1,0.25)
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
} }
Row { QGCLabel {
width: root.size * 0.8 text: "Altitude"
anchors.horizontalCenter: parent.horizontalCenter font.pixelSize: ScreenTools.defaultFontPixelSize * 0.75
QGCLabel { width: parent.width
text: "H" height: ScreenTools.defaultFontPixelHeight * 0.5
font.pixelSize: ScreenTools.defaultFontPixelSize * 1.25 color: isSatellite ? "black" : "white"
width: parent.width * 0.45 horizontalAlignment: TextEdit.AlignHCenter
color: isSatellite ? "black" : "white" }
horizontalAlignment: TextEdit.AlignHCenter QGCLabel {
} text: altitude < 10000 ? altitude.toFixed(1) : altitude.toFixed(0)
QGCLabel { font.pixelSize: ScreenTools.defaultFontPixelSize * 2.5
text: altitude.toFixed(1) font.weight: Font.DemiBold
font.pixelSize: ScreenTools.defaultFontPixelSize * 1.25 width: parent.width
font.weight: Font.DemiBold color: isSatellite ? "black" : "white"
width: parent.width * 0.549 horizontalAlignment: TextEdit.AlignHCenter
color: isSatellite ? "black" : "white"
horizontalAlignment: TextEdit.AlignHCenter
}
} }
//-- Ground Speed //-- Ground Speed
Rectangle { Rectangle {
...@@ -103,25 +99,25 @@ Item { ...@@ -103,25 +99,25 @@ Item {
width: parent.width * 0.9 width: parent.width * 0.9
color: isSatellite ? Qt.rgba(0,0,0,0.25) : Qt.rgba(1,1,1,0.25) color: isSatellite ? Qt.rgba(0,0,0,0.25) : Qt.rgba(1,1,1,0.25)
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
visible: airSpeed <= 0
} }
Row { QGCLabel {
width: root.size * 0.8 text: "Ground Speed"
anchors.horizontalCenter: parent.horizontalCenter font.pixelSize: ScreenTools.defaultFontPixelSize * 0.75
QGCLabel { width: parent.width
text: "GS" height: ScreenTools.defaultFontPixelHeight * 0.75
font.pixelSize: ScreenTools.defaultFontPixelSize * 0.75 color: isSatellite ? "black" : "white"
width: parent.width * 0.45 horizontalAlignment: TextEdit.AlignHCenter
color: isSatellite ? "black" : "white" visible: airSpeed <= 0
horizontalAlignment: TextEdit.AlignHCenter }
} QGCLabel {
QGCLabel { text: groundSpeed.toFixed(1)
text: groundSpeed.toFixed(1) font.pixelSize: ScreenTools.defaultFontPixelSize * 1.25
font.pixelSize: ScreenTools.defaultFontPixelSize * 0.75 font.weight: Font.DemiBold
font.weight: Font.DemiBold width: parent.width
width: parent.width * 0.549 color: isSatellite ? "black" : "white"
color: isSatellite ? "black" : "white" horizontalAlignment: TextEdit.AlignHCenter
horizontalAlignment: TextEdit.AlignHCenter visible: airSpeed <= 0
}
} }
//-- Air Speed //-- Air Speed
Rectangle { Rectangle {
...@@ -131,51 +127,23 @@ Item { ...@@ -131,51 +127,23 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
visible: airSpeed > 0 visible: airSpeed > 0
} }
Row { QGCLabel {
width: root.size * 0.8 text: "Air Speed"
anchors.horizontalCenter: parent.horizontalCenter font.pixelSize: ScreenTools.defaultFontPixelSize * 0.75
width: parent.width
height: ScreenTools.defaultFontPixelHeight * 0.75
color: isSatellite ? "black" : "white"
visible: airSpeed > 0 visible: airSpeed > 0
QGCLabel { horizontalAlignment: TextEdit.AlignHCenter
text: "AS"
font.pixelSize: ScreenTools.defaultFontPixelSize * 0.75
width: parent.width * 0.45
color: isSatellite ? "black" : "white"
horizontalAlignment: TextEdit.AlignHCenter
}
QGCLabel {
text: airSpeed.toFixed(1)
font.pixelSize: ScreenTools.defaultFontPixelSize * 0.75
font.weight: Font.DemiBold
width: parent.width * 0.549
color: isSatellite ? "black" : "white"
horizontalAlignment: TextEdit.AlignHCenter
}
} }
//-- Climb Rate QGCLabel {
Rectangle { text: airSpeed.toFixed(1)
height: 1 font.pixelSize: ScreenTools.defaultFontPixelSize * 1.25
width: parent.width * 0.9 font.weight: Font.DemiBold
color: isSatellite ? Qt.rgba(0,0,0,0.25) : Qt.rgba(1,1,1,0.25) width: parent.width
anchors.horizontalCenter: parent.horizontalCenter color: isSatellite ? "black" : "white"
} visible: airSpeed > 0
Row { horizontalAlignment: TextEdit.AlignHCenter
width: root.size * 0.8
anchors.horizontalCenter: parent.horizontalCenter
QGCLabel {
text: "VS"
font.pixelSize: ScreenTools.defaultFontPixelSize * 0.75
width: parent.width * 0.45
color: isSatellite ? "black" : "white"
horizontalAlignment: TextEdit.AlignHCenter
}
QGCLabel {
text: climbRate.toFixed(1)
font.pixelSize: ScreenTools.defaultFontPixelSize * 0.75
font.weight: Font.DemiBold
width: parent.width * 0.549
color: isSatellite ? "black" : "white"
horizontalAlignment: TextEdit.AlignHCenter
}
} }
//-- Compass //-- Compass
Rectangle { Rectangle {
......
...@@ -60,7 +60,16 @@ TODO: Binaries found in http://gstreamer.freedesktop.org/data/pkg/ios ...@@ -60,7 +60,16 @@ TODO: Binaries found in http://gstreamer.freedesktop.org/data/pkg/ios
### Android ### Android
Binaries found in http://gstreamer.freedesktop.org/data/pkg/android Binaries found in http://gstreamer.freedesktop.org/data/pkg/android
Download the [gstreamer-1.0-android-armv7-1.5.2.tar.bz2](http://gstreamer.freedesktop.org/data/pkg/android/1.5.2/gstreamer-1.0-android-armv7-1.5.2.tar.bz2) archive (assuming you want the ARM V7 platform) and extract it to the root qgroundcontrol directory (the same directory qgroundcontrol.pro is located). That's where the build system will look for it. Download the [gstreamer-1.0-android-armv7-1.5.2.tar.bz2](http://gstreamer.freedesktop.org/data/pkg/android/1.5.2/gstreamer-1.0-android-armv7-1.5.2.tar.bz2) archive (assuming you want the ARM V7 platform).
Create a directory named "gstreamer-1.0-android-armv7-1.5.2" under the root qgroundcontrol directory (the same directory qgroundcontrol.pro is located). Extract the gstreamer tar file under this directory. That's where the build system will look for it. Make sure your archive tool doesn't create any additional top level directories. The structure after extracting the archive should look like this:
qgroundcontrol
├── gstreamer-1.0-android-armv7-1.5.2
│   ├── etc
│   ├── include
│   ├── lib
│   └── share
### Windows ### Windows
......
This diff is collapsed.
This diff is collapsed.
...@@ -187,6 +187,13 @@ void MAVLinkProtocol::_linkStatusChanged(LinkInterface* link, bool connected) ...@@ -187,6 +187,13 @@ void MAVLinkProtocol::_linkStatusChanged(LinkInterface* link, bool connected)
// Use the same shared pointer as LinkManager // Use the same shared pointer as LinkManager
_connectedLinks.append(LinkManager::instance()->sharedPointerForLink(link)); _connectedLinks.append(LinkManager::instance()->sharedPointerForLink(link));
#ifndef __mobile__
if (_connectedLinks.count() == 1) {
// This is the first link, we need to start logging
_startLogging();
}
#endif
// Send command to start MAVLink // Send command to start MAVLink
// XXX hacky but safe // XXX hacky but safe
// Start NSH // Start NSH
...@@ -346,11 +353,6 @@ void MAVLinkProtocol::receiveBytes(LinkInterface* link, QByteArray b) ...@@ -346,11 +353,6 @@ void MAVLinkProtocol::receiveBytes(LinkInterface* link, QByteArray b)
#endif #endif
if (message.msgid == MAVLINK_MSG_ID_HEARTBEAT) { if (message.msgid == MAVLINK_MSG_ID_HEARTBEAT) {
#ifndef __mobile__
// Start logging on first heartbeat
_startLogging();
#endif
// Notify the vehicle manager of the heartbeat. This will create/update vehicles as needed. // Notify the vehicle manager of the heartbeat. This will create/update vehicles as needed.
mavlink_heartbeat_t heartbeat; mavlink_heartbeat_t heartbeat;
mavlink_msg_heartbeat_decode(&message, &heartbeat); mavlink_msg_heartbeat_decode(&message, &heartbeat);
...@@ -644,20 +646,20 @@ bool MAVLinkProtocol::_closeLogFile(void) ...@@ -644,20 +646,20 @@ bool MAVLinkProtocol::_closeLogFile(void)
void MAVLinkProtocol::_startLogging(void) void MAVLinkProtocol::_startLogging(void)
{ {
if (!_tempLogFile.isOpen()) { Q_ASSERT(!_tempLogFile.isOpen());
if (!_logSuspendReplay) {
if (!_tempLogFile.open()) {
emit protocolStatusMessage(tr("MAVLink Protocol"), tr("Opening Flight Data file for writing failed. "
"Unable to write to %1. Please choose a different file location.").arg(_tempLogFile.fileName()));
_closeLogFile();
_logSuspendError = true;
return;
}
qDebug() << "Temp log" << _tempLogFile.fileName();
_logSuspendError = false; if (!_logSuspendReplay) {
if (!_tempLogFile.open()) {
emit protocolStatusMessage(tr("MAVLink Protocol"), tr("Opening Flight Data file for writing failed. "
"Unable to write to %1. Please choose a different file location.").arg(_tempLogFile.fileName()));
_closeLogFile();
_logSuspendError = true;
return;
} }
qDebug() << "Temp log" << _tempLogFile.fileName();
_logSuspendError = false;
} }
} }
......
...@@ -72,6 +72,7 @@ float MockLink::_vehicleLongitude = -122.08794f; ...@@ -72,6 +72,7 @@ float MockLink::_vehicleLongitude = -122.08794f;
float MockLink::_vehicleAltitude = 2.5f; float MockLink::_vehicleAltitude = 2.5f;
const char* MockConfiguration::_firmwareTypeKey = "FirmwareType"; const char* MockConfiguration::_firmwareTypeKey = "FirmwareType";
const char* MockConfiguration::_vehicleTypeKey = "VehicleType";
const char* MockConfiguration::_sendStatusTextKey = "SendStatusText"; const char* MockConfiguration::_sendStatusTextKey = "SendStatusText";
MockLink::MockLink(MockConfiguration* config) MockLink::MockLink(MockConfiguration* config)
...@@ -85,6 +86,7 @@ MockLink::MockLink(MockConfiguration* config) ...@@ -85,6 +86,7 @@ MockLink::MockLink(MockConfiguration* config)
, _mavBaseMode(MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_CUSTOM_MODE_ENABLED) , _mavBaseMode(MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_CUSTOM_MODE_ENABLED)
, _mavState(MAV_STATE_STANDBY) , _mavState(MAV_STATE_STANDBY)
, _firmwareType(MAV_AUTOPILOT_PX4) , _firmwareType(MAV_AUTOPILOT_PX4)
, _vehicleType(MAV_TYPE_QUADROTOR)
, _fileServer(NULL) , _fileServer(NULL)
, _sendStatusText(false) , _sendStatusText(false)
, _apmSendHomePositionOnEmptyList(false) , _apmSendHomePositionOnEmptyList(false)
...@@ -93,6 +95,7 @@ MockLink::MockLink(MockConfiguration* config) ...@@ -93,6 +95,7 @@ MockLink::MockLink(MockConfiguration* config)
_config = config; _config = config;
if (_config) { if (_config) {
_firmwareType = config->firmwareType(); _firmwareType = config->firmwareType();
_vehicleType = config->vehicleType();
_sendStatusText = config->sendStatusText(); _sendStatusText = config->sendStatusText();
} }
...@@ -113,7 +116,6 @@ MockLink::MockLink(MockConfiguration* config) ...@@ -113,7 +116,6 @@ MockLink::MockLink(MockConfiguration* config)
MockLink::~MockLink(void) MockLink::~MockLink(void)
{ {
qDebug() << "MockLink destructor";
_disconnect(); _disconnect();
} }
...@@ -200,7 +202,18 @@ void MockLink::_run50HzTasks(void) ...@@ -200,7 +202,18 @@ void MockLink::_run50HzTasks(void)
void MockLink::_loadParams(void) void MockLink::_loadParams(void)
{ {
QFile paramFile(":/unittest/MockLink.params"); QFile paramFile;
if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) {
if (_vehicleType == MAV_TYPE_FIXED_WING) {
paramFile.setFileName(":/unittest/APMArduPlaneMockLink.params");
} else {
paramFile.setFileName(":/unittest/APMArduCopterMockLink.params");
}
} else {
paramFile.setFileName(":/unittest/PX4MockLink.params");
}
bool success = paramFile.open(QFile::ReadOnly); bool success = paramFile.open(QFile::ReadOnly);
Q_UNUSED(success); Q_UNUSED(success);
...@@ -234,11 +247,21 @@ void MockLink::_loadParams(void) ...@@ -234,11 +247,21 @@ void MockLink::_loadParams(void)
case MAV_PARAM_TYPE_INT32: case MAV_PARAM_TYPE_INT32:
paramValue = QVariant(valStr.toInt()); paramValue = QVariant(valStr.toInt());
break; break;
case MAV_PARAM_TYPE_UINT16:
paramValue = QVariant((quint16)valStr.toUInt());
break;
case MAV_PARAM_TYPE_INT16:
paramValue = QVariant((qint16)valStr.toInt());
break;
case MAV_PARAM_TYPE_UINT8:
paramValue = QVariant((quint8)valStr.toUInt());
break;
case MAV_PARAM_TYPE_INT8: case MAV_PARAM_TYPE_INT8:
paramValue = QVariant((unsigned char)valStr.toUInt()); paramValue = QVariant((qint8)valStr.toUInt());
break; break;
default: default:
Q_ASSERT(false); qCritical() << "Unknown type" << paramType;
paramValue = QVariant(valStr.toInt());
break; break;
} }
...@@ -405,24 +428,38 @@ void MockLink::_setParamFloatUnionIntoMap(int componentId, const QString& paramN ...@@ -405,24 +428,38 @@ void MockLink::_setParamFloatUnionIntoMap(int componentId, const QString& paramN
QVariant paramVariant; QVariant paramVariant;
switch (paramType) { switch (paramType) {
case MAV_PARAM_TYPE_INT8: case MAV_PARAM_TYPE_REAL32:
paramVariant = QVariant::fromValue(valueUnion.param_int8); paramVariant = QVariant::fromValue(valueUnion.param_float);
break; break;
case MAV_PARAM_TYPE_INT32: case MAV_PARAM_TYPE_UINT32:
paramVariant = QVariant::fromValue(valueUnion.param_int32); paramVariant = QVariant::fromValue(valueUnion.param_uint32);
break; break;
case MAV_PARAM_TYPE_UINT32: case MAV_PARAM_TYPE_INT32:
paramVariant = QVariant::fromValue(valueUnion.param_uint32); paramVariant = QVariant::fromValue(valueUnion.param_int32);
break; break;
case MAV_PARAM_TYPE_REAL32: case MAV_PARAM_TYPE_UINT16:
paramVariant = QVariant::fromValue(valueUnion.param_float); paramVariant = QVariant::fromValue(valueUnion.param_uint16);
break; break;
default: case MAV_PARAM_TYPE_INT16:
qCritical() << "Invalid parameter type" << paramType; paramVariant = QVariant::fromValue(valueUnion.param_int16);
break;
case MAV_PARAM_TYPE_UINT8:
paramVariant = QVariant::fromValue(valueUnion.param_uint8);
break;
case MAV_PARAM_TYPE_INT8:
paramVariant = QVariant::fromValue(valueUnion.param_int8);
break;
default:
qCritical() << "Invalid parameter type" << paramType;
paramVariant = QVariant::fromValue(valueUnion.param_int32);
break;
} }
qCDebug(MockLinkLog) << "_setParamFloatUnionIntoMap" << paramName << paramVariant; qCDebug(MockLinkLog) << "_setParamFloatUnionIntoMap" << paramName << paramVariant;
...@@ -442,36 +479,65 @@ float MockLink::_floatUnionForParam(int componentId, const QString& paramName) ...@@ -442,36 +479,65 @@ float MockLink::_floatUnionForParam(int componentId, const QString& paramName)
QVariant paramVar = _mapParamName2Value[componentId][paramName]; QVariant paramVar = _mapParamName2Value[componentId][paramName];
switch (paramType) { switch (paramType) {
case MAV_PARAM_TYPE_INT8: case MAV_PARAM_TYPE_REAL32:
if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) { valueUnion.param_float = paramVar.toFloat();
valueUnion.param_float = (unsigned char)paramVar.toChar().toLatin1(); break;
} else {
valueUnion.param_int8 = (unsigned char)paramVar.toChar().toLatin1();
}
break;
case MAV_PARAM_TYPE_INT32: case MAV_PARAM_TYPE_UINT32:
if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) { if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) {
valueUnion.param_float = paramVar.toInt(); valueUnion.param_float = paramVar.toUInt();
} else { } else {
valueUnion.param_int32 = paramVar.toInt(); valueUnion.param_uint32 = paramVar.toUInt();
} }
break; break;
case MAV_PARAM_TYPE_UINT32: case MAV_PARAM_TYPE_INT32:
if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) { if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) {
valueUnion.param_float = paramVar.toUInt(); valueUnion.param_float = paramVar.toInt();
} else { } else {
valueUnion.param_uint32 = paramVar.toUInt(); valueUnion.param_int32 = paramVar.toInt();
} }
break; break;
case MAV_PARAM_TYPE_REAL32: case MAV_PARAM_TYPE_UINT16:
valueUnion.param_float = paramVar.toFloat(); if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) {
break; valueUnion.param_float = paramVar.toUInt();
} else {
valueUnion.param_uint16 = paramVar.toUInt();
}
break;
default: case MAV_PARAM_TYPE_INT16:
qCritical() << "Invalid parameter type" << paramType; if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) {
valueUnion.param_float = paramVar.toInt();
} else {
valueUnion.param_int16 = paramVar.toInt();
}
break;
case MAV_PARAM_TYPE_UINT8:
if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) {
valueUnion.param_float = paramVar.toUInt();
} else {
valueUnion.param_uint8 = paramVar.toUInt();
}
break;
case MAV_PARAM_TYPE_INT8:
if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) {
valueUnion.param_float = (unsigned char)paramVar.toChar().toLatin1();
} else {
valueUnion.param_int8 = (unsigned char)paramVar.toChar().toLatin1();
}
break;
default:
if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) {
valueUnion.param_float = paramVar.toInt();
} else {
valueUnion.param_int32 = paramVar.toInt();
}
qCritical() << "Invalid parameter type" << paramType;
} }
return valueUnion.param_float; return valueUnion.param_float;
...@@ -801,6 +867,7 @@ void MockLink::_sendStatusTextMessages(void) ...@@ -801,6 +867,7 @@ void MockLink::_sendStatusTextMessages(void)
MockConfiguration::MockConfiguration(const QString& name) MockConfiguration::MockConfiguration(const QString& name)
: LinkConfiguration(name) : LinkConfiguration(name)
, _firmwareType(MAV_AUTOPILOT_PX4) , _firmwareType(MAV_AUTOPILOT_PX4)
, _vehicleType(MAV_TYPE_QUADROTOR)
, _sendStatusText(false) , _sendStatusText(false)
{ {
...@@ -810,6 +877,7 @@ MockConfiguration::MockConfiguration(MockConfiguration* source) ...@@ -810,6 +877,7 @@ MockConfiguration::MockConfiguration(MockConfiguration* source)
: LinkConfiguration(source) : LinkConfiguration(source)
{ {
_firmwareType = source->_firmwareType; _firmwareType = source->_firmwareType;
_vehicleType = source->_vehicleType;
_sendStatusText = source->_sendStatusText; _sendStatusText = source->_sendStatusText;
} }
...@@ -824,6 +892,7 @@ void MockConfiguration::copyFrom(LinkConfiguration *source) ...@@ -824,6 +892,7 @@ void MockConfiguration::copyFrom(LinkConfiguration *source)
} }
_firmwareType = usource->_firmwareType; _firmwareType = usource->_firmwareType;
_vehicleType = usource->_vehicleType;
_sendStatusText = usource->_sendStatusText; _sendStatusText = usource->_sendStatusText;
} }
...@@ -831,6 +900,7 @@ void MockConfiguration::saveSettings(QSettings& settings, const QString& root) ...@@ -831,6 +900,7 @@ void MockConfiguration::saveSettings(QSettings& settings, const QString& root)
{ {
settings.beginGroup(root); settings.beginGroup(root);
settings.setValue(_firmwareTypeKey, (int)_firmwareType); settings.setValue(_firmwareTypeKey, (int)_firmwareType);
settings.setValue(_vehicleTypeKey, (int)_vehicleType);
settings.setValue(_sendStatusTextKey, _sendStatusText); settings.setValue(_sendStatusTextKey, _sendStatusText);
settings.sync(); settings.sync();
settings.endGroup(); settings.endGroup();
...@@ -840,6 +910,7 @@ void MockConfiguration::loadSettings(QSettings& settings, const QString& root) ...@@ -840,6 +910,7 @@ void MockConfiguration::loadSettings(QSettings& settings, const QString& root)
{ {
settings.beginGroup(root); settings.beginGroup(root);
_firmwareType = (MAV_AUTOPILOT)settings.value(_firmwareTypeKey, (int)MAV_AUTOPILOT_PX4).toInt(); _firmwareType = (MAV_AUTOPILOT)settings.value(_firmwareTypeKey, (int)MAV_AUTOPILOT_PX4).toInt();
_vehicleType = (MAV_TYPE)settings.value(_vehicleTypeKey, (int)MAV_TYPE_QUADROTOR).toInt();
_sendStatusText = settings.value(_sendStatusTextKey, false).toBool(); _sendStatusText = settings.value(_sendStatusTextKey, false).toBool();
settings.endGroup(); settings.endGroup();
} }
......
...@@ -44,6 +44,9 @@ public: ...@@ -44,6 +44,9 @@ public:
MAV_AUTOPILOT firmwareType(void) { return _firmwareType; } MAV_AUTOPILOT firmwareType(void) { return _firmwareType; }
void setFirmwareType(MAV_AUTOPILOT firmwareType) { _firmwareType = firmwareType; } void setFirmwareType(MAV_AUTOPILOT firmwareType) { _firmwareType = firmwareType; }
MAV_TYPE vehicleType(void) { return _vehicleType; }
void setVehicleType(MAV_TYPE vehicleType) { _vehicleType = vehicleType; }
/// @param sendStatusText true: mavlink status text messages will be sent for each severity, as well as voice output info message /// @param sendStatusText true: mavlink status text messages will be sent for each severity, as well as voice output info message
void setSendStatusText(bool sendStatusText) { _sendStatusText = sendStatusText; } void setSendStatusText(bool sendStatusText) { _sendStatusText = sendStatusText; }
bool sendStatusText(void) { return _sendStatusText; } bool sendStatusText(void) { return _sendStatusText; }
...@@ -57,9 +60,11 @@ public: ...@@ -57,9 +60,11 @@ public:
private: private:
MAV_AUTOPILOT _firmwareType; MAV_AUTOPILOT _firmwareType;
MAV_TYPE _vehicleType;
bool _sendStatusText; bool _sendStatusText;
static const char* _firmwareTypeKey; static const char* _firmwareTypeKey;
static const char* _vehicleTypeKey;
static const char* _sendStatusTextKey; static const char* _sendStatusTextKey;
}; };
...@@ -183,8 +188,9 @@ private: ...@@ -183,8 +188,9 @@ private:
uint32_t _mavCustomMode; uint32_t _mavCustomMode;
uint8_t _mavState; uint8_t _mavState;
MockConfiguration* _config; MockConfiguration* _config;
MAV_AUTOPILOT _firmwareType; MAV_AUTOPILOT _firmwareType;
MAV_TYPE _vehicleType;
MockLinkFileServer* _fileServer; MockLinkFileServer* _fileServer;
......
...@@ -84,15 +84,29 @@ This file is part of the QGROUNDCONTROL project ...@@ -84,15 +84,29 @@ This file is part of the QGROUNDCONTROL project
const char* MAIN_SETTINGS_GROUP = "QGC_MAINWINDOW"; const char* MAIN_SETTINGS_GROUP = "QGC_MAINWINDOW";
#ifndef __mobile__ #ifndef __mobile__
const char* MainWindow::_mavlinkDockWidgetName = "MAVLink Inspector"; enum DockWidgetTypes {
const char* MainWindow::_customCommandWidgetName = "Custom Command"; MAVLINK_INSPECTOR,
const char* MainWindow::_filesDockWidgetName = "Onboard Files"; CUSTOM_COMMAND,
const char* MainWindow::_uasStatusDetailsDockWidgetName = "Status Details"; ONBOARD_FILES,
const char* MainWindow::_uasInfoViewDockWidgetName = "Info View"; STATUS_DETAILS,
const char* MainWindow::_hilDockWidgetName = "HIL Config"; INFO_VIEW,
const char* MainWindow::_analyzeDockWidgetName = "Analyze"; HIL_CONFIG,
ANALYZE
const char* MainWindow::_visibleWidgetsKey = "VisibleWidgets"; };
static const char *rgDockWidgetNames[] = {
"MAVLink Inspector",
"Custom Command",
"Onboard Files",
"Status Details",
"Info View",
"HIL Config",
"Analyze"
};
#define ARRAY_SIZE(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0]))
static const char* _visibleWidgetsKey = "VisibleWidgets";
#endif #endif
static MainWindow* _instance = NULL; ///< @brief MainWindow singleton static MainWindow* _instance = NULL; ///< @brief MainWindow singleton
...@@ -318,27 +332,16 @@ void MainWindow::_buildCommonWidgets(void) ...@@ -318,27 +332,16 @@ void MainWindow::_buildCommonWidgets(void)
logPlayer = new QGCMAVLinkLogPlayer(statusBar()); logPlayer = new QGCMAVLinkLogPlayer(statusBar());
statusBar()->addPermanentWidget(logPlayer); statusBar()->addPermanentWidget(logPlayer);
static const char* rgDockWidgetNames[] = { for (int i = 0, end = ARRAY_SIZE(rgDockWidgetNames); i < end; i++) {
_mavlinkDockWidgetName,
_customCommandWidgetName,
_filesDockWidgetName,
_uasStatusDetailsDockWidgetName,
_uasInfoViewDockWidgetName,
_hilDockWidgetName,
_analyzeDockWidgetName,
};
static const size_t cDockWidgetNames = sizeof(rgDockWidgetNames) / sizeof(rgDockWidgetNames[0]);
for (size_t i=0; i<cDockWidgetNames; i++) {
const char* pDockWidgetName = rgDockWidgetNames[i]; const char* pDockWidgetName = rgDockWidgetNames[i];
// Add to menu // Add to menu
QAction* action = new QAction(pDockWidgetName, NULL); QAction* action = new QAction(tr(pDockWidgetName), NULL);
action->setCheckable(true); action->setCheckable(true);
action->setData(pDockWidgetName); action->setData(i);
connect(action, &QAction::triggered, this, &MainWindow::_showDockWidgetAction); connect(action, &QAction::triggered, this, &MainWindow::_showDockWidgetAction);
_ui.menuWidgets->addAction(action); _ui.menuWidgets->addAction(action);
_mapName2Action[pDockWidgetName] = action; _mapName2Action[pDockWidgetName] = action;
} }
} }
...@@ -365,28 +368,35 @@ void MainWindow::_showDockWidget(const QString& name, bool show) ...@@ -365,28 +368,35 @@ void MainWindow::_showDockWidget(const QString& name, bool show)
void MainWindow::_createInnerDockWidget(const QString& widgetName) void MainWindow::_createInnerDockWidget(const QString& widgetName)
{ {
QGCDockWidget* widget = NULL; QGCDockWidget* widget = NULL;
QAction *action = _mapName2Action[widgetName];
if (widgetName == _mavlinkDockWidgetName) {
widget = new QGCMAVLinkInspector(widgetName, _mapName2Action[widgetName], MAVLinkProtocol::instance(),this); switch(action->data().toInt()) {
} else if (widgetName == _customCommandWidgetName) { case MAVLINK_INSPECTOR:
widget = new CustomCommandWidget(widgetName, _mapName2Action[widgetName], this); widget = new QGCMAVLinkInspector(widgetName, action, MAVLinkProtocol::instance(),this);
} else if (widgetName == _filesDockWidgetName) { break;
widget = new QGCUASFileViewMulti(widgetName, _mapName2Action[widgetName], this); case CUSTOM_COMMAND:
} else if (widgetName == _uasStatusDetailsDockWidgetName) { widget = new CustomCommandWidget(widgetName, action, this);
widget = new UASInfoWidget(widgetName, _mapName2Action[widgetName], this); break;
} else if (widgetName == _hilDockWidgetName) { case ONBOARD_FILES:
widget = new HILDockWidget(widgetName, _mapName2Action[widgetName], this); widget = new QGCUASFileViewMulti(widgetName, action, this);
} else if (widgetName == _analyzeDockWidgetName) { break;
widget = new Linecharts(widgetName, _mapName2Action[widgetName], mavlinkDecoder, this); case STATUS_DETAILS:
} else if (widgetName == _uasInfoViewDockWidgetName) { widget = new UASInfoWidget(widgetName, action, this);
QGCTabbedInfoView* pInfoView = new QGCTabbedInfoView(widgetName, _mapName2Action[widgetName], this); break;
pInfoView->addSource(mavlinkDecoder); case HIL_CONFIG:
widget = pInfoView; widget = new HILDockWidget(widgetName, action, this);
} else { break;
qWarning() << "Attempt to create unknown Inner Dock Widget" << widgetName; case ANALYZE:
return; widget = new Linecharts(widgetName, action, mavlinkDecoder, this);
break;
case INFO_VIEW:
widget= new QGCTabbedInfoView(widgetName, action, this);
break;
} }
if(action->data().toInt() == INFO_VIEW) {
qobject_cast<QGCTabbedInfoView*>(widget)->addSource(mavlinkDecoder);
}
_mapName2DockWidget[widgetName] = widget; _mapName2DockWidget[widgetName] = widget;
} }
...@@ -399,19 +409,23 @@ void MainWindow::_hideAllDockWidgets(void) ...@@ -399,19 +409,23 @@ void MainWindow::_hideAllDockWidgets(void)
void MainWindow::_showDockWidgetAction(bool show) void MainWindow::_showDockWidgetAction(bool show)
{ {
QAction* action = dynamic_cast<QAction*>(QObject::sender()); QAction* action = qobject_cast<QAction*>(QObject::sender());
Q_ASSERT(action); Q_ASSERT(action);
_showDockWidget(action->text(), show); _showDockWidget(rgDockWidgetNames[action->data().toInt()], show);
} }
#endif #endif
void MainWindow::fullScreenActionItemCallback(bool) void MainWindow::fullScreenActionItemCallback(bool)
{ {
if (!_ui.actionFullscreen->isChecked())
_ui.actionFullscreen->setChecked(true);
_ui.actionNormal->setChecked(false); _ui.actionNormal->setChecked(false);
} }
void MainWindow::normalActionItemCallback(bool) void MainWindow::normalActionItemCallback(bool)
{ {
if (!_ui.actionNormal->isChecked())
_ui.actionNormal->setChecked(true);
_ui.actionFullscreen->setChecked(false); _ui.actionFullscreen->setChecked(false);
} }
......
...@@ -227,15 +227,6 @@ private: ...@@ -227,15 +227,6 @@ private:
QPointer<QWidget> _missionEditorView; QPointer<QWidget> _missionEditorView;
#ifndef __mobile__ #ifndef __mobile__
// Dock widget names
static const char* _mavlinkDockWidgetName;
static const char* _customCommandWidgetName;
static const char* _filesDockWidgetName;
static const char* _uasStatusDetailsDockWidgetName;
static const char* _uasInfoViewDockWidgetName;
static const char* _hilDockWidgetName;
static const char* _analyzeDockWidgetName;
QMap<QString, QGCDockWidget*> _mapName2DockWidget; QMap<QString, QGCDockWidget*> _mapName2DockWidget;
QMap<QString, QAction*> _mapName2Action; QMap<QString, QAction*> _mapName2Action;
#endif #endif
...@@ -250,8 +241,6 @@ private: ...@@ -250,8 +241,6 @@ private:
void _showDockWidget(const QString &name, bool show); void _showDockWidget(const QString &name, bool show);
void _loadVisibleWidgetsSettings(void); void _loadVisibleWidgetsSettings(void);
void _storeVisibleWidgetsSettings(void); void _storeVisibleWidgetsSettings(void);
static const char* _visibleWidgetsKey;
#endif #endif
bool _autoReconnect; bool _autoReconnect;
......
...@@ -43,11 +43,23 @@ MockLinkConfiguration::MockLinkConfiguration(MockConfiguration *config, QWidget ...@@ -43,11 +43,23 @@ MockLinkConfiguration::MockLinkConfiguration(MockConfiguration *config, QWidget
break; break;
} }
switch (config->vehicleType()) {
case MAV_TYPE_FIXED_WING:
_ui->apmArduPlaneRadio->setChecked(true);
break;
default:
_ui->apmArduCopterRadio->setChecked(true);
break;
}
_ui->sendStatusTextCheckBox->setChecked(config->sendStatusText()); _ui->sendStatusTextCheckBox->setChecked(config->sendStatusText());
connect(_ui->px4Radio, &QRadioButton::clicked, this, &MockLinkConfiguration::_px4RadioClicked); connect(_ui->px4Radio, &QRadioButton::clicked, this, &MockLinkConfiguration::_px4RadioClicked);
connect(_ui->apmRadio, &QRadioButton::clicked, this, &MockLinkConfiguration::_apmRadioClicked); connect(_ui->apmRadio, &QRadioButton::clicked, this, &MockLinkConfiguration::_apmRadioClicked);
connect(_ui->genericRadio, &QRadioButton::clicked, this, &MockLinkConfiguration::_genericRadioClicked); connect(_ui->genericRadio, &QRadioButton::clicked, this, &MockLinkConfiguration::_genericRadioClicked);
connect(_ui->apmArduCopterRadio, &QRadioButton::clicked, this, &MockLinkConfiguration::_apmArduCopterRadioClicked);
connect(_ui->apmArduPlaneRadio, &QRadioButton::clicked, this, &MockLinkConfiguration::_apmArduPlaneRadioClicked);
connect(_ui->genericRadio, &QRadioButton::clicked, this, &MockLinkConfiguration::_genericRadioClicked);
connect(_ui->sendStatusTextCheckBox, &QCheckBox::clicked, this, &MockLinkConfiguration::_sendStatusTextClicked); connect(_ui->sendStatusTextCheckBox, &QCheckBox::clicked, this, &MockLinkConfiguration::_sendStatusTextClicked);
} }
...@@ -77,6 +89,20 @@ void MockLinkConfiguration::_genericRadioClicked(bool checked) ...@@ -77,6 +89,20 @@ void MockLinkConfiguration::_genericRadioClicked(bool checked)
} }
} }
void MockLinkConfiguration::_apmArduCopterRadioClicked(bool checked)
{
if (checked) {
_config->setVehicleType(MAV_TYPE_QUADROTOR);
}
}
void MockLinkConfiguration::_apmArduPlaneRadioClicked(bool checked)
{
if (checked) {
_config->setVehicleType(MAV_TYPE_FIXED_WING);
}
}
void MockLinkConfiguration::_sendStatusTextClicked(bool checked) void MockLinkConfiguration::_sendStatusTextClicked(bool checked)
{ {
_config->setSendStatusText(checked); _config->setSendStatusText(checked);
......
...@@ -44,6 +44,8 @@ private slots: ...@@ -44,6 +44,8 @@ private slots:
void _px4RadioClicked(bool checked); void _px4RadioClicked(bool checked);
void _apmRadioClicked(bool checked); void _apmRadioClicked(bool checked);
void _genericRadioClicked(bool checked); void _genericRadioClicked(bool checked);
void _apmArduCopterRadioClicked(bool checked);
void _apmArduPlaneRadioClicked(bool checked);
void _sendStatusTextClicked(bool checked); void _sendStatusTextClicked(bool checked);
private: private:
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>187</width> <width>238</width>
<height>116</height> <height>188</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
...@@ -42,6 +42,29 @@ ...@@ -42,6 +42,29 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>APM vehicle type</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QRadioButton" name="apmArduCopterRadio">
<property name="text">
<string>ArduCopter</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="apmArduPlaneRadio">
<property name="text">
<string>ArduPlane</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
......
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