Commit a42225cc authored by Don Gagne's avatar Don Gagne

New offline editing Vehicle support

Includes ability to load params
parent 04f97369
...@@ -273,6 +273,8 @@ ...@@ -273,6 +273,8 @@
<file alias="APMParameterFactMetaData.Sub.3.4.xml">src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.4.xml</file> <file alias="APMParameterFactMetaData.Sub.3.4.xml">src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.4.xml</file>
<file alias="CopterGeoFenceEditor.qml">src/FirmwarePlugin/APM/CopterGeoFenceEditor.qml</file> <file alias="CopterGeoFenceEditor.qml">src/FirmwarePlugin/APM/CopterGeoFenceEditor.qml</file>
<file alias="PlaneGeoFenceEditor.qml">src/FirmwarePlugin/APM/PlaneGeoFenceEditor.qml</file> <file alias="PlaneGeoFenceEditor.qml">src/FirmwarePlugin/APM/PlaneGeoFenceEditor.qml</file>
<file alias="Copter.OfflineEditing.params">src/FirmwarePlugin/APM/Copter3.4.OfflineEditing.params</file>
<file alias="Plane.OfflineEditing.params">src/FirmwarePlugin/APM/Plane3.7.OfflineEditing.params</file>
</qresource> </qresource>
<qresource prefix="/FirmwarePlugin"> <qresource prefix="/FirmwarePlugin">
<file alias="GeoFenceEditor.qml">src/FirmwarePlugin/GeoFenceEditor.qml</file> <file alias="GeoFenceEditor.qml">src/FirmwarePlugin/GeoFenceEditor.qml</file>
......
...@@ -39,7 +39,7 @@ const char* ParameterLoader::_cachedMetaDataFilePrefix = "ParameterFactMetaData" ...@@ -39,7 +39,7 @@ const char* ParameterLoader::_cachedMetaDataFilePrefix = "ParameterFactMetaData"
ParameterLoader::ParameterLoader(Vehicle* vehicle) ParameterLoader::ParameterLoader(Vehicle* vehicle)
: QObject(vehicle) : QObject(vehicle)
, _vehicle(vehicle) , _vehicle(vehicle)
, _mavlink(qgcApp()->toolbox()->mavlinkProtocol()) , _mavlink(NULL)
, _parametersReady(false) , _parametersReady(false)
, _initialLoadComplete(false) , _initialLoadComplete(false)
, _waitingForDefaultComponent(false) , _waitingForDefaultComponent(false)
...@@ -53,8 +53,12 @@ ParameterLoader::ParameterLoader(Vehicle* vehicle) ...@@ -53,8 +53,12 @@ ParameterLoader::ParameterLoader(Vehicle* vehicle)
, _initialRequestRetryCount(0) , _initialRequestRetryCount(0)
, _totalParamCount(0) , _totalParamCount(0)
{ {
Q_ASSERT(_vehicle); if (_vehicle->isOfflineEditingVehicle()) {
Q_ASSERT(_mavlink); _loadOfflineEditingParams();
return;
}
_mavlink = qgcApp()->toolbox()->mavlinkProtocol();
// We signal this to ouselves in order to start timer on our thread // We signal this to ouselves in order to start timer on our thread
connect(this, &ParameterLoader::restartWaitingParamTimer, this, &ParameterLoader::_restartWaitingParamTimer); connect(this, &ParameterLoader::restartWaitingParamTimer, this, &ParameterLoader::_restartWaitingParamTimer);
...@@ -1212,3 +1216,71 @@ QString ParameterLoader::_remapParamNameToVersion(const QString& paramName) ...@@ -1212,3 +1216,71 @@ QString ParameterLoader::_remapParamNameToVersion(const QString& paramName)
return mappedParamName; return mappedParamName;
} }
/// The offline editing vehicle can have custom loaded params bolted into it.
void ParameterLoader::_loadOfflineEditingParams(void)
{
QString paramFilename = _vehicle->firmwarePlugin()->offlineEditingParamFile(_vehicle);
if (paramFilename.isEmpty()) {
return;
}
QFile paramFile(paramFilename);
if (!paramFile.open(QFile::ReadOnly)) {
qCWarning(ParameterLoaderLog) << "Unable to open offline editing params file" << paramFilename;
}
QTextStream paramStream(&paramFile);
while (!paramStream.atEnd()) {
QString line = paramStream.readLine();
if (line.startsWith("#")) {
continue;
}
QStringList paramData = line.split("\t");
Q_ASSERT(paramData.count() == 5);
_defaultComponentId = paramData.at(1).toInt();
QString paramName = paramData.at(2);
QString valStr = paramData.at(3);
MAV_PARAM_TYPE paramType = static_cast<MAV_PARAM_TYPE>(paramData.at(4).toUInt());
QVariant paramValue;
switch (paramType) {
case MAV_PARAM_TYPE_REAL32:
paramValue = QVariant(valStr.toFloat());
break;
case MAV_PARAM_TYPE_UINT32:
paramValue = QVariant(valStr.toUInt());
break;
case MAV_PARAM_TYPE_INT32:
paramValue = QVariant(valStr.toInt());
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:
paramValue = QVariant((qint8)valStr.toUInt());
break;
default:
qCritical() << "Unknown type" << paramType;
paramValue = QVariant(valStr.toInt());
break;
}
Fact* fact = new Fact(_defaultComponentId, paramName, _mavTypeToFactType(paramType), this);
_mapParameterName2Variant[_defaultComponentId][paramName] = QVariant::fromValue(fact);
}
_addMetaDataToDefaultComponent();
_parametersReady = true;
_initialLoadComplete = true;
}
...@@ -125,6 +125,7 @@ private: ...@@ -125,6 +125,7 @@ private:
void _tryCacheHashLoad(int uasId, int componentId, QVariant hash_value); void _tryCacheHashLoad(int uasId, int componentId, QVariant hash_value);
void _addMetaDataToDefaultComponent(void); void _addMetaDataToDefaultComponent(void);
QString _remapParamNameToVersion(const QString& paramName); QString _remapParamNameToVersion(const QString& paramName);
void _loadOfflineEditingParams(void);
MAV_PARAM_TYPE _factTypeToMavType(FactMetaData::ValueType_t factType); MAV_PARAM_TYPE _factTypeToMavType(FactMetaData::ValueType_t factType);
FactMetaData::ValueType_t _mavTypeToFactType(MAV_PARAM_TYPE mavType); FactMetaData::ValueType_t _mavTypeToFactType(MAV_PARAM_TYPE mavType);
......
...@@ -31,6 +31,10 @@ APMGeoFenceManager::APMGeoFenceManager(Vehicle* vehicle) ...@@ -31,6 +31,10 @@ APMGeoFenceManager::APMGeoFenceManager(Vehicle* vehicle)
{ {
connect(_vehicle, &Vehicle::mavlinkMessageReceived, this, &APMGeoFenceManager::_mavlinkMessageReceived); connect(_vehicle, &Vehicle::mavlinkMessageReceived, this, &APMGeoFenceManager::_mavlinkMessageReceived);
connect(_vehicle->getParameterLoader(), &ParameterLoader::parametersReady, this, &APMGeoFenceManager::_parametersReady); connect(_vehicle->getParameterLoader(), &ParameterLoader::parametersReady, this, &APMGeoFenceManager::_parametersReady);
if (_vehicle->getParameterLoader()->parametersAreReady()) {
_parametersReady();
}
} }
APMGeoFenceManager::~APMGeoFenceManager() APMGeoFenceManager::~APMGeoFenceManager()
...@@ -40,6 +44,10 @@ APMGeoFenceManager::~APMGeoFenceManager() ...@@ -40,6 +44,10 @@ APMGeoFenceManager::~APMGeoFenceManager()
void APMGeoFenceManager::sendToVehicle(void) void APMGeoFenceManager::sendToVehicle(void)
{ {
if (_vehicle->isOfflineEditingVehicle()) {
return;
}
if (_readTransactionInProgress) { if (_readTransactionInProgress) {
_sendError(InternalError, QStringLiteral("Geo-Fence write attempted while read in progress.")); _sendError(InternalError, QStringLiteral("Geo-Fence write attempted while read in progress."));
return; return;
...@@ -82,6 +90,10 @@ void APMGeoFenceManager::sendToVehicle(void) ...@@ -82,6 +90,10 @@ void APMGeoFenceManager::sendToVehicle(void)
void APMGeoFenceManager::loadFromVehicle(void) void APMGeoFenceManager::loadFromVehicle(void)
{ {
if (_vehicle->isOfflineEditingVehicle()) {
return;
}
_polygon.clear(); _polygon.clear();
if (!_geoFenceSupported()) { if (!_geoFenceSupported()) {
......
...@@ -67,6 +67,7 @@ public: ...@@ -67,6 +67,7 @@ public:
bool multiRotorCoaxialMotors(Vehicle* vehicle) final; bool multiRotorCoaxialMotors(Vehicle* vehicle) final;
bool multiRotorXConfig(Vehicle* vehicle) final; bool multiRotorXConfig(Vehicle* vehicle) final;
QString geoFenceRadiusParam(Vehicle* vehicle) final; QString geoFenceRadiusParam(Vehicle* vehicle) final;
QString offlineEditingParamFile(Vehicle* vehicle) final { Q_UNUSED(vehicle); return QStringLiteral(":/FirmwarePlugin/APM/Copter.OfflineEditing.params"); }
private: private:
static bool _remapParamNameIntialized; static bool _remapParamNameIntialized;
......
...@@ -54,6 +54,9 @@ class ArduPlaneFirmwarePlugin : public APMFirmwarePlugin ...@@ -54,6 +54,9 @@ class ArduPlaneFirmwarePlugin : public APMFirmwarePlugin
public: public:
ArduPlaneFirmwarePlugin(void); ArduPlaneFirmwarePlugin(void);
// Overrides from FirmwarePlugin
QString offlineEditingParamFile(Vehicle* vehicle) final { Q_UNUSED(vehicle); return QStringLiteral(":/FirmwarePlugin/APM/Plane.OfflineEditing.params"); }
}; };
#endif #endif
This diff is collapsed.
...@@ -36,11 +36,6 @@ Column { ...@@ -36,11 +36,6 @@ Column {
color: qgcPal.text color: qgcPal.text
} }
QGCLabel {
text: qsTr("Must be connected to Vehicle to change fence settings.")
visible: !QGroundControl.multiVehicleManager.activeVehicle
}
Repeater { Repeater {
model: geoFenceController.params model: geoFenceController.params
...@@ -80,7 +75,7 @@ Column { ...@@ -80,7 +75,7 @@ Column {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
flightMap: editorMap flightMap: editorMap
polygon: root.polygon polygon: geoFenceController.polygon
sectionLabel: qsTr("Fence Polygon:") sectionLabel: qsTr("Fence Polygon:")
visible: geoFenceController.polygonSupported visible: geoFenceController.polygonSupported
} }
......
This diff is collapsed.
...@@ -218,7 +218,7 @@ Column { ...@@ -218,7 +218,7 @@ Column {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
flightMap: editorMap flightMap: editorMap
polygon: root.polygon polygon: geoFenceController.polygon
sectionLabel: qsTr("Fence Polygon:") sectionLabel: qsTr("Fence Polygon:")
} }
} }
...@@ -216,6 +216,9 @@ public: ...@@ -216,6 +216,9 @@ public:
/// Returns the parameter which holds the fence circle radius if supported. /// Returns the parameter which holds the fence circle radius if supported.
virtual QString geoFenceRadiusParam(Vehicle* vehicle) { Q_UNUSED(vehicle); return QString(); } virtual QString geoFenceRadiusParam(Vehicle* vehicle) { Q_UNUSED(vehicle); return QString(); }
/// Return the resource file which contains the set of params loaded for offline editing.
virtual QString offlineEditingParamFile(Vehicle* vehicle) { Q_UNUSED(vehicle); return QString(); }
}; };
#endif #endif
...@@ -12,7 +12,7 @@ import QGroundControl.FactSystem 1.0 ...@@ -12,7 +12,7 @@ import QGroundControl.FactSystem 1.0
QGCLabel { QGCLabel {
width: availableWidth width: availableWidth
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: qsTr("This vehicle does tno support GeoFence.") text: qsTr("This vehicle does not support GeoFence.")
//property var contoller - controller - Must be passed in from Loader //property var contoller - controller - Must be passed in from Loader
//property real availableWidth - Available width for control - Must be passed in from Loader //property real availableWidth - Available width for control - Must be passed in from Loader
......
...@@ -62,11 +62,11 @@ void GeoFenceController::_signalAll(void) ...@@ -62,11 +62,11 @@ void GeoFenceController::_signalAll(void)
emit editorQmlChanged(editorQml()); emit editorQmlChanged(editorQml());
} }
void GeoFenceController::_activeVehicleBeingRemoved(Vehicle* vehicle) void GeoFenceController::_activeVehicleBeingRemoved(void)
{ {
_clearGeoFence(); _clearGeoFence();
_signalAll(); _signalAll();
vehicle->geoFenceManager()->disconnect(this); _activeVehicle->geoFenceManager()->disconnect(this);
} }
void GeoFenceController::_activeVehicleSet(void) void GeoFenceController::_activeVehicleSet(void)
...@@ -122,23 +122,23 @@ void GeoFenceController::removeAll(void) ...@@ -122,23 +122,23 @@ void GeoFenceController::removeAll(void)
void GeoFenceController::loadFromVehicle(void) void GeoFenceController::loadFromVehicle(void)
{ {
if (_activeVehicle && _activeVehicle->getParameterLoader()->parametersAreReady() && !syncInProgress()) { if (_activeVehicle->getParameterLoader()->parametersAreReady() && !syncInProgress()) {
_activeVehicle->geoFenceManager()->loadFromVehicle(); _activeVehicle->geoFenceManager()->loadFromVehicle();
} else { } else {
qCWarning(GeoFenceControllerLog) << "GeoFenceController::loadFromVehicle call at wrong time" << _activeVehicle << _activeVehicle->getParameterLoader()->parametersAreReady() << syncInProgress(); qCWarning(GeoFenceControllerLog) << "GeoFenceController::loadFromVehicle call at wrong time" << _activeVehicle->getParameterLoader()->parametersAreReady() << syncInProgress();
} }
} }
void GeoFenceController::sendToVehicle(void) void GeoFenceController::sendToVehicle(void)
{ {
if (_activeVehicle && _activeVehicle->getParameterLoader()->parametersAreReady() && !syncInProgress()) { if (_activeVehicle->getParameterLoader()->parametersAreReady() && !syncInProgress()) {
_activeVehicle->geoFenceManager()->setPolygon(polygon()); _activeVehicle->geoFenceManager()->setPolygon(polygon());
_activeVehicle->geoFenceManager()->setBreachReturnPoint(breachReturnPoint()); _activeVehicle->geoFenceManager()->setBreachReturnPoint(breachReturnPoint());
setDirty(false); setDirty(false);
_polygon.setDirty(false); _polygon.setDirty(false);
_activeVehicle->geoFenceManager()->sendToVehicle(); _activeVehicle->geoFenceManager()->sendToVehicle();
} else { } else {
qCWarning(GeoFenceControllerLog) << "GeoFenceController::loadFromVehicle call at wrong time" << _activeVehicle << _activeVehicle->getParameterLoader()->parametersAreReady() << syncInProgress(); qCWarning(GeoFenceControllerLog) << "GeoFenceController::loadFromVehicle call at wrong time" << _activeVehicle->getParameterLoader()->parametersAreReady() << syncInProgress();
} }
} }
...@@ -150,11 +150,7 @@ void GeoFenceController::_clearGeoFence(void) ...@@ -150,11 +150,7 @@ void GeoFenceController::_clearGeoFence(void)
bool GeoFenceController::syncInProgress(void) const bool GeoFenceController::syncInProgress(void) const
{ {
if (_activeVehicle) { return _activeVehicle->geoFenceManager()->inProgress();
return _activeVehicle->geoFenceManager()->inProgress();
} else {
return false;
}
} }
bool GeoFenceController::dirty(void) const bool GeoFenceController::dirty(void) const
...@@ -183,38 +179,22 @@ void GeoFenceController::_polygonDirtyChanged(bool dirty) ...@@ -183,38 +179,22 @@ void GeoFenceController::_polygonDirtyChanged(bool dirty)
bool GeoFenceController::fenceSupported(void) const bool GeoFenceController::fenceSupported(void) const
{ {
if (_activeVehicle) { return _activeVehicle->geoFenceManager()->fenceSupported();
return _activeVehicle->geoFenceManager()->fenceSupported();
} else {
return true;
}
} }
bool GeoFenceController::circleSupported(void) const bool GeoFenceController::circleSupported(void) const
{ {
if (_activeVehicle) { return _activeVehicle->geoFenceManager()->circleSupported();
return _activeVehicle->geoFenceManager()->circleSupported();
} else {
return true;
}
} }
bool GeoFenceController::polygonSupported(void) const bool GeoFenceController::polygonSupported(void) const
{ {
if (_activeVehicle) { return _activeVehicle->geoFenceManager()->polygonSupported();
return _activeVehicle->geoFenceManager()->polygonSupported();
} else {
return true;
}
} }
bool GeoFenceController::breachReturnSupported(void) const bool GeoFenceController::breachReturnSupported(void) const
{ {
if (_activeVehicle) { return _activeVehicle->geoFenceManager()->breachReturnSupported();
return _activeVehicle->geoFenceManager()->breachReturnSupported();
} else {
return true;
}
} }
void GeoFenceController::_setDirty(void) void GeoFenceController::_setDirty(void)
...@@ -231,37 +211,20 @@ void GeoFenceController::_setPolygon(const QList<QGeoCoordinate>& polygon) ...@@ -231,37 +211,20 @@ void GeoFenceController::_setPolygon(const QList<QGeoCoordinate>& polygon)
float GeoFenceController::circleRadius(void) const float GeoFenceController::circleRadius(void) const
{ {
if (_activeVehicle) { return _activeVehicle->geoFenceManager()->circleRadius();
return _activeVehicle->geoFenceManager()->circleRadius();
} else {
return 0.0;
}
} }
QVariantList GeoFenceController::params(void) const QVariantList GeoFenceController::params(void) const
{ {
if (_activeVehicle) { return _activeVehicle->geoFenceManager()->params();
return _activeVehicle->geoFenceManager()->params();
} else {
return QVariantList();
}
} }
QStringList GeoFenceController::paramLabels(void) const QStringList GeoFenceController::paramLabels(void) const
{ {
if (_activeVehicle) { return _activeVehicle->geoFenceManager()->paramLabels();
return _activeVehicle->geoFenceManager()->paramLabels();
} else {
return QStringList();
}
} }
QString GeoFenceController::editorQml(void) const QString GeoFenceController::editorQml(void) const
{ {
if (_activeVehicle) { return _activeVehicle->geoFenceManager()->editorQml();
return _activeVehicle->geoFenceManager()->editorQml();
} else {
// FIXME: Offline editing support
return QString();
}
} }
...@@ -85,7 +85,7 @@ private: ...@@ -85,7 +85,7 @@ private:
void _clearGeoFence(void); void _clearGeoFence(void);
void _signalAll(void); void _signalAll(void);
void _activeVehicleBeingRemoved(Vehicle* vehicle) final; void _activeVehicleBeingRemoved(void) final;
void _activeVehicleSet(void) final; void _activeVehicleSet(void) final;
bool _dirty; bool _dirty;
......
...@@ -174,12 +174,12 @@ void MissionCommandTreeTest::testJsonLoad(void) ...@@ -174,12 +174,12 @@ void MissionCommandTreeTest::testJsonLoad(void)
void MissionCommandTreeTest::testOverride(void) void MissionCommandTreeTest::testOverride(void)
{ {
// Generic/Generic should not have any overrides // Generic/Generic should not have any overrides
Vehicle* vehicle = new Vehicle(MAV_AUTOPILOT_GENERIC, MAV_TYPE_GENERIC); Vehicle* vehicle = new Vehicle(MAV_AUTOPILOT_GENERIC, MAV_TYPE_GENERIC, qgcApp()->toolbox()->firmwarePluginManager());
_checkBaseValues(_commandTree->getUIInfo(vehicle, (MAV_CMD)4), 4); _checkBaseValues(_commandTree->getUIInfo(vehicle, (MAV_CMD)4), 4);
delete vehicle; delete vehicle;
// Generic/FixedWing should have overrides // Generic/FixedWing should have overrides
vehicle = new Vehicle(MAV_AUTOPILOT_GENERIC, MAV_TYPE_FIXED_WING); vehicle = new Vehicle(MAV_AUTOPILOT_GENERIC, MAV_TYPE_FIXED_WING, qgcApp()->toolbox()->firmwarePluginManager());
_checkOverrideValues(_commandTree->getUIInfo(vehicle, (MAV_CMD)4), 4); _checkOverrideValues(_commandTree->getUIInfo(vehicle, (MAV_CMD)4), 4);
delete vehicle; delete vehicle;
} }
...@@ -195,7 +195,7 @@ void MissionCommandTreeTest::testAllTrees(void) ...@@ -195,7 +195,7 @@ void MissionCommandTreeTest::testAllTrees(void)
// This will cause all of the variants of collapsed trees to be built // This will cause all of the variants of collapsed trees to be built
foreach(MAV_AUTOPILOT firmwareType, firmwareList) { foreach(MAV_AUTOPILOT firmwareType, firmwareList) {
foreach (MAV_TYPE vehicleType, vehicleList) { foreach (MAV_TYPE vehicleType, vehicleList) {
Vehicle* vehicle = new Vehicle(firmwareType, vehicleType); Vehicle* vehicle = new Vehicle(firmwareType, vehicleType, qgcApp()->toolbox()->firmwarePluginManager());
qDebug() << firmwareType << vehicleType; qDebug() << firmwareType << vehicleType;
QVERIFY(qgcApp()->toolbox()->missionCommandTree()->getUIInfo(vehicle, MAV_CMD_NAV_WAYPOINT) != NULL); QVERIFY(qgcApp()->toolbox()->missionCommandTree()->getUIInfo(vehicle, MAV_CMD_NAV_WAYPOINT) != NULL);
delete vehicle; delete vehicle;
......
...@@ -1023,17 +1023,17 @@ void MissionController::_itemCommandChanged(void) ...@@ -1023,17 +1023,17 @@ void MissionController::_itemCommandChanged(void)
_recalcWaypointLines(); _recalcWaypointLines();
} }
void MissionController::_activeVehicleBeingRemoved(Vehicle* vehicle) void MissionController::_activeVehicleBeingRemoved(void)
{ {
qCDebug(MissionControllerLog) << "_activeVehicleSet _activeVehicleBeingRemoved"; qCDebug(MissionControllerLog) << "MissionController::_activeVehicleBeingRemoved";
MissionManager* missionManager = vehicle->missionManager(); MissionManager* missionManager = _activeVehicle->missionManager();
disconnect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailableFromVehicle); disconnect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailableFromVehicle);
disconnect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged); disconnect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged);
disconnect(missionManager, &MissionManager::currentItemChanged, this, &MissionController::_currentMissionItemChanged); disconnect(missionManager, &MissionManager::currentItemChanged, this, &MissionController::_currentMissionItemChanged);
disconnect(vehicle, &Vehicle::homePositionAvailableChanged, this, &MissionController::_activeVehicleHomePositionAvailableChanged); disconnect(_activeVehicle, &Vehicle::homePositionAvailableChanged, this, &MissionController::_activeVehicleHomePositionAvailableChanged);
disconnect(vehicle, &Vehicle::homePositionChanged, this, &MissionController::_activeVehicleHomePositionChanged); disconnect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionController::_activeVehicleHomePositionChanged);
// We always remove all items on vehicle change. This leaves a user model hole: // We always remove all items on vehicle change. This leaves a user model hole:
// If the user has unsaved changes in the Plan view they will lose them // If the user has unsaved changes in the Plan view they will lose them
......
...@@ -131,7 +131,7 @@ private: ...@@ -131,7 +131,7 @@ private:
int _nextSequenceNumber(void); int _nextSequenceNumber(void);
// Overrides from PlanElementController // Overrides from PlanElementController
void _activeVehicleBeingRemoved(Vehicle* vehicle) final; void _activeVehicleBeingRemoved(void) final;
void _activeVehicleSet(void) final; void _activeVehicleSet(void) final;
private: private:
......
...@@ -44,6 +44,10 @@ MissionManager::~MissionManager() ...@@ -44,6 +44,10 @@ MissionManager::~MissionManager()
void MissionManager::writeMissionItems(const QList<MissionItem*>& missionItems) void MissionManager::writeMissionItems(const QList<MissionItem*>& missionItems)
{ {
if (_vehicle->isOfflineEditingVehicle()) {
return;
}
if (inProgress()) { if (inProgress()) {
qCDebug(MissionManagerLog) << "writeMissionItems called while transaction in progress"; qCDebug(MissionManagerLog) << "writeMissionItems called while transaction in progress";
return; return;
...@@ -131,6 +135,10 @@ void MissionManager::writeArduPilotGuidedMissionItem(const QGeoCoordinate& gotoC ...@@ -131,6 +135,10 @@ void MissionManager::writeArduPilotGuidedMissionItem(const QGeoCoordinate& gotoC
void MissionManager::requestMissionItems(void) void MissionManager::requestMissionItems(void)
{ {
if (_vehicle->isOfflineEditingVehicle()) {
return;
}
qCDebug(MissionManagerLog) << "requestMissionItems read sequence"; qCDebug(MissionManagerLog) << "requestMissionItems read sequence";
if (inProgress()) { if (inProgress()) {
......
...@@ -9,11 +9,12 @@ ...@@ -9,11 +9,12 @@
#include "PlanElementController.h" #include "PlanElementController.h"
#include "QGCApplication.h" #include "QGCApplication.h"
#include "MultiVehicleManager.h"
PlanElementController::PlanElementController(QObject* parent) PlanElementController::PlanElementController(QObject* parent)
: QObject(parent) : QObject(parent)
, _activeVehicle(NULL)
, _multiVehicleMgr(qgcApp()->toolbox()->multiVehicleManager()) , _multiVehicleMgr(qgcApp()->toolbox()->multiVehicleManager())
, _activeVehicle(_multiVehicleMgr->offlineEditingVehicle())
, _editMode(false) , _editMode(false)
{ {
...@@ -34,16 +35,16 @@ void PlanElementController::start(bool editMode) ...@@ -34,16 +35,16 @@ void PlanElementController::start(bool editMode)
void PlanElementController::_activeVehicleChanged(Vehicle* activeVehicle) void PlanElementController::_activeVehicleChanged(Vehicle* activeVehicle)
{ {
if (_activeVehicle) { if (_activeVehicle) {
Vehicle* vehicleSave = _activeVehicle; _activeVehicleBeingRemoved();
_activeVehicle = NULL; _activeVehicle = NULL;
_activeVehicleBeingRemoved(vehicleSave);
} }
_activeVehicle = activeVehicle; if (activeVehicle) {
_activeVehicle = activeVehicle;
if (_activeVehicle) { } else {
_activeVehicleSet(); _activeVehicle = _multiVehicleMgr->offlineEditingVehicle();
} }
_activeVehicleSet();
// Whenever vehicle changes we need to update syncInProgress // Whenever vehicle changes we need to update syncInProgress
emit syncInProgressChanged(syncInProgress()); emit syncInProgressChanged(syncInProgress());
......
...@@ -52,13 +52,13 @@ signals: ...@@ -52,13 +52,13 @@ signals:
void dirtyChanged (bool dirty); void dirtyChanged (bool dirty);
protected: protected:
Vehicle* _activeVehicle;
MultiVehicleManager* _multiVehicleMgr; MultiVehicleManager* _multiVehicleMgr;
Vehicle* _activeVehicle; ///< Currently active vehicle, can be disconnected offline editing vehicle
bool _editMode; bool _editMode;
/// Called when the current active vehicle has been removed. Derived classes should override /// Called when the current active vehicle is about to be removed. Derived classes should override
/// to implement custom behavior. When this is called _activeVehicle has already been cleared. /// to implement custom behavior.
virtual void _activeVehicleBeingRemoved(Vehicle* removedVehicle) = 0; virtual void _activeVehicleBeingRemoved(void) = 0;
/// Called when a new active vehicle has been set. Derived classes should override /// Called when a new active vehicle has been set. Derived classes should override
/// to implement custom behavior. /// to implement custom behavior.
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "SimpleMissionItemTest.h" #include "SimpleMissionItemTest.h"
#include "SimpleMissionItem.h" #include "SimpleMissionItem.h"
#include "QGCApplication.h"
const SimpleMissionItemTest::ItemInfo_t SimpleMissionItemTest::_rgItemInfo[] = { const SimpleMissionItemTest::ItemInfo_t SimpleMissionItemTest::_rgItemInfo[] = {
{ MAV_CMD_NAV_WAYPOINT, MAV_FRAME_GLOBAL_RELATIVE_ALT }, { MAV_CMD_NAV_WAYPOINT, MAV_FRAME_GLOBAL_RELATIVE_ALT },
...@@ -80,7 +81,7 @@ SimpleMissionItemTest::SimpleMissionItemTest(void) ...@@ -80,7 +81,7 @@ SimpleMissionItemTest::SimpleMissionItemTest(void)
void SimpleMissionItemTest::_testEditorFacts(void) void SimpleMissionItemTest::_testEditorFacts(void)
{ {
Vehicle* vehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_FIXED_WING); Vehicle* vehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_FIXED_WING, qgcApp()->toolbox()->firmwarePluginManager());
for (size_t i=0; i<sizeof(_rgItemInfo)/sizeof(_rgItemInfo[0]); i++) { for (size_t i=0; i<sizeof(_rgItemInfo)/sizeof(_rgItemInfo[0]); i++) {
const ItemInfo_t* info = &_rgItemInfo[i]; const ItemInfo_t* info = &_rgItemInfo[i];
......
...@@ -7,16 +7,13 @@ ...@@ -7,16 +7,13 @@
* *
****************************************************************************/ ****************************************************************************/
/// @file
/// @author Don Gagne <don@thegagnes.com>
#include "MultiVehicleManager.h" #include "MultiVehicleManager.h"
#include "AutoPilotPlugin.h" #include "AutoPilotPlugin.h"
#include "MAVLinkProtocol.h" #include "MAVLinkProtocol.h"
#include "UAS.h" #include "UAS.h"
#include "QGCApplication.h" #include "QGCApplication.h"
#include "FollowMe.h" #include "FollowMe.h"
#include "QGroundControlQmlGlobal.h"
#ifdef __mobile__ #ifdef __mobile__
#include "MobileScreenMgr.h" #include "MobileScreenMgr.h"
...@@ -33,7 +30,7 @@ MultiVehicleManager::MultiVehicleManager(QGCApplication* app) ...@@ -33,7 +30,7 @@ MultiVehicleManager::MultiVehicleManager(QGCApplication* app)
, _activeVehicleAvailable(false) , _activeVehicleAvailable(false)
, _parameterReadyVehicleAvailable(false) , _parameterReadyVehicleAvailable(false)
, _activeVehicle(NULL) , _activeVehicle(NULL)
, _disconnectedVehicle(NULL) , _offlineEditingVehicle(NULL)
, _firmwarePluginManager(NULL) , _firmwarePluginManager(NULL)
, _autopilotPluginManager(NULL) , _autopilotPluginManager(NULL)
, _joystickManager(NULL) , _joystickManager(NULL)
...@@ -50,8 +47,6 @@ MultiVehicleManager::MultiVehicleManager(QGCApplication* app) ...@@ -50,8 +47,6 @@ MultiVehicleManager::MultiVehicleManager(QGCApplication* app)
if (_gcsHeartbeatEnabled) { if (_gcsHeartbeatEnabled) {
_gcsHeartbeatTimer.start(); _gcsHeartbeatTimer.start();
} }
_disconnectedVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, this);
} }
void MultiVehicleManager::setToolbox(QGCToolbox *toolbox) void MultiVehicleManager::setToolbox(QGCToolbox *toolbox)
...@@ -67,6 +62,11 @@ void MultiVehicleManager::setToolbox(QGCToolbox *toolbox) ...@@ -67,6 +62,11 @@ void MultiVehicleManager::setToolbox(QGCToolbox *toolbox)
qmlRegisterUncreatableType<MultiVehicleManager>("QGroundControl.MultiVehicleManager", 1, 0, "MultiVehicleManager", "Reference only"); qmlRegisterUncreatableType<MultiVehicleManager>("QGroundControl.MultiVehicleManager", 1, 0, "MultiVehicleManager", "Reference only");
connect(_mavlinkProtocol, &MAVLinkProtocol::vehicleHeartbeatInfo, this, &MultiVehicleManager::_vehicleHeartbeatInfo); connect(_mavlinkProtocol, &MAVLinkProtocol::vehicleHeartbeatInfo, this, &MultiVehicleManager::_vehicleHeartbeatInfo);
_offlineEditingVehicle = new Vehicle(static_cast<MAV_AUTOPILOT>(QGroundControlQmlGlobal::offlineEditingFirmwareType()->rawValue().toInt()),
static_cast<MAV_TYPE>(QGroundControlQmlGlobal::offlineEditingVehicleType()->rawValue().toInt()),
_firmwarePluginManager,
this);
} }
void MultiVehicleManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicleId, int vehicleMavlinkVersion, int vehicleFirmwareType, int vehicleType) void MultiVehicleManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicleId, int vehicleMavlinkVersion, int vehicleFirmwareType, int vehicleType)
......
...@@ -45,8 +45,8 @@ public: ...@@ -45,8 +45,8 @@ public:
Q_PROPERTY(QmlObjectListModel* vehicles READ vehicles CONSTANT) Q_PROPERTY(QmlObjectListModel* vehicles READ vehicles CONSTANT)
Q_PROPERTY(bool gcsHeartBeatEnabled READ gcsHeartbeatEnabled WRITE setGcsHeartbeatEnabled NOTIFY gcsHeartBeatEnabledChanged) Q_PROPERTY(bool gcsHeartBeatEnabled READ gcsHeartbeatEnabled WRITE setGcsHeartbeatEnabled NOTIFY gcsHeartBeatEnabledChanged)
/// A disconnected vehicle is used to simulate vehicle information while no vehicle is connected. /// A disconnected vehicle used for offline editing. It will match the vehicle type specified in Settings.
Q_PROPERTY(Vehicle* disconnectedVehicle MEMBER _disconnectedVehicle CONSTANT) Q_PROPERTY(Vehicle* offlineEditingVehicle READ offlineEditingVehicle CONSTANT)
// Methods // Methods
...@@ -68,6 +68,8 @@ public: ...@@ -68,6 +68,8 @@ public:
bool gcsHeartbeatEnabled(void) const { return _gcsHeartbeatEnabled; } bool gcsHeartbeatEnabled(void) const { return _gcsHeartbeatEnabled; }
void setGcsHeartbeatEnabled(bool gcsHeartBeatEnabled); void setGcsHeartbeatEnabled(bool gcsHeartBeatEnabled);
Vehicle* offlineEditingVehicle(void) { return _offlineEditingVehicle; }
/// Determines if the link is in use by a Vehicle /// Determines if the link is in use by a Vehicle
/// @param link Link to test against /// @param link Link to test against
/// @param skipVehicle Don't consider this Vehicle as part of the test /// @param skipVehicle Don't consider this Vehicle as part of the test
...@@ -101,7 +103,7 @@ private: ...@@ -101,7 +103,7 @@ private:
bool _activeVehicleAvailable; ///< true: An active vehicle is available bool _activeVehicleAvailable; ///< true: An active vehicle is available
bool _parameterReadyVehicleAvailable; ///< true: An active vehicle with ready parameters is available bool _parameterReadyVehicleAvailable; ///< true: An active vehicle with ready parameters is available
Vehicle* _activeVehicle; ///< Currently active vehicle from a ui perspective Vehicle* _activeVehicle; ///< Currently active vehicle from a ui perspective
Vehicle* _disconnectedVehicle; ///< Disconnected vechicle for FactGroup access Vehicle* _offlineEditingVehicle; ///< Disconnected vechicle used for offline editing
QList<Vehicle*> _vehiclesBeingDeleted; ///< List of Vehicles being deleted in queued phases QList<Vehicle*> _vehiclesBeingDeleted; ///< List of Vehicles being deleted in queued phases
Vehicle* _vehicleBeingSetActive; ///< Vehicle being set active in queued phases Vehicle* _vehicleBeingSetActive; ///< Vehicle being set active in queued phases
......
...@@ -65,7 +65,7 @@ Vehicle::Vehicle(LinkInterface* link, ...@@ -65,7 +65,7 @@ Vehicle::Vehicle(LinkInterface* link,
: FactGroup(_vehicleUIUpdateRateMSecs, ":/json/Vehicle/VehicleFact.json") : FactGroup(_vehicleUIUpdateRateMSecs, ":/json/Vehicle/VehicleFact.json")
, _id(vehicleId) , _id(vehicleId)
, _active(false) , _active(false)
, _disconnectedVehicle(false) , _offlineEditingVehicle(false)
, _firmwareType(firmwareType) , _firmwareType(firmwareType)
, _vehicleType(vehicleType) , _vehicleType(vehicleType)
, _firmwarePlugin(NULL) , _firmwarePlugin(NULL)
...@@ -203,7 +203,7 @@ Vehicle::Vehicle(LinkInterface* link, ...@@ -203,7 +203,7 @@ Vehicle::Vehicle(LinkInterface* link,
connect(_parameterLoader, &ParameterLoader::parametersReady, _autopilotPlugin, &AutoPilotPlugin::_parametersReadyPreChecks); connect(_parameterLoader, &ParameterLoader::parametersReady, _autopilotPlugin, &AutoPilotPlugin::_parametersReadyPreChecks);
connect(_parameterLoader, &ParameterLoader::parameterListProgress, _autopilotPlugin, &AutoPilotPlugin::parameterListProgress); connect(_parameterLoader, &ParameterLoader::parameterListProgress, _autopilotPlugin, &AutoPilotPlugin::parameterListProgress);
// GeoFenceManager needs to access ParameterLoader so make sure to create afters // GeoFenceManager needs to access ParameterLoader so make sure to create after
_geoFenceManager = _firmwarePlugin->newGeoFenceManager(this); _geoFenceManager = _firmwarePlugin->newGeoFenceManager(this);
connect(_geoFenceManager, &GeoFenceManager::error, this, &Vehicle::_geoFenceManagerError); connect(_geoFenceManager, &GeoFenceManager::error, this, &Vehicle::_geoFenceManagerError);
...@@ -254,12 +254,15 @@ Vehicle::Vehicle(LinkInterface* link, ...@@ -254,12 +254,15 @@ Vehicle::Vehicle(LinkInterface* link,
_vibrationFactGroup.setVehicle(this); _vibrationFactGroup.setVehicle(this);
} }
// Disconnected Vehicle // Disconnected Vehicle for offline editing
Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, QObject* parent) Vehicle::Vehicle(MAV_AUTOPILOT firmwareType,
MAV_TYPE vehicleType,
FirmwarePluginManager* firmwarePluginManager,
QObject* parent)
: FactGroup(_vehicleUIUpdateRateMSecs, ":/json/Vehicle/VehicleFact.json", parent) : FactGroup(_vehicleUIUpdateRateMSecs, ":/json/Vehicle/VehicleFact.json", parent)
, _id(0) , _id(0)
, _active(false) , _active(false)
, _disconnectedVehicle(true) , _offlineEditingVehicle(true)
, _firmwareType(firmwareType) , _firmwareType(firmwareType)
, _vehicleType(vehicleType) , _vehicleType(vehicleType)
, _firmwarePlugin(NULL) , _firmwarePlugin(NULL)
...@@ -290,12 +293,14 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, QObject* pare ...@@ -290,12 +293,14 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, QObject* pare
, _connectionLostEnabled(true) , _connectionLostEnabled(true)
, _missionManager(NULL) , _missionManager(NULL)
, _missionManagerInitialRequestComplete(false) , _missionManagerInitialRequestComplete(false)
, _geoFenceManager(NULL)
, _geoFenceManagerInitialRequestComplete(false)
, _parameterLoader(NULL) , _parameterLoader(NULL)
, _armed(false) , _armed(false)
, _base_mode(0) , _base_mode(0)
, _custom_mode(0) , _custom_mode(0)
, _nextSendMessageMultipleIndex(0) , _nextSendMessageMultipleIndex(0)
, _firmwarePluginManager(NULL) , _firmwarePluginManager(firmwarePluginManager)
, _autopilotPluginManager(NULL) , _autopilotPluginManager(NULL)
, _joystickManager(NULL) , _joystickManager(NULL)
, _flowImageIndex(0) , _flowImageIndex(0)
...@@ -322,10 +327,16 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, QObject* pare ...@@ -322,10 +327,16 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, QObject* pare
, _windFactGroup(this) , _windFactGroup(this)
, _vibrationFactGroup(this) , _vibrationFactGroup(this)
{ {
// This is a hack for disconnected vehicle used while unit testing _firmwarePlugin = _firmwarePluginManager->firmwarePluginForAutopilot(_firmwareType, _vehicleType);
if (qgcApp()->toolbox() && qgcApp()->toolbox()->firmwarePluginManager()) {
_firmwarePlugin = qgcApp()->toolbox()->firmwarePluginManager()->firmwarePluginForAutopilot(_firmwareType, _vehicleType); _missionManager = new MissionManager(this);
} connect(_missionManager, &MissionManager::error, this, &Vehicle::_missionManagerError);
_parameterLoader = new ParameterLoader(this);
// GeoFenceManager needs to access ParameterLoader so make sure to create after
_geoFenceManager = _firmwarePlugin->newGeoFenceManager(this);
connect(_geoFenceManager, &GeoFenceManager::error, this, &Vehicle::_geoFenceManagerError);
// Build FactGroup object model // Build FactGroup object model
...@@ -1406,11 +1417,6 @@ void Vehicle::disconnectInactiveVehicle(void) ...@@ -1406,11 +1417,6 @@ void Vehicle::disconnectInactiveVehicle(void)
} }
} }
ParameterLoader* Vehicle::getParameterLoader(void)
{
return _parameterLoader;
}
void Vehicle::_imageReady(UASInterface*) void Vehicle::_imageReady(UASInterface*)
{ {
if(_uas) if(_uas)
...@@ -1829,7 +1835,7 @@ void Vehicle::motorTest(int motor, int percent, int timeoutSecs) ...@@ -1829,7 +1835,7 @@ void Vehicle::motorTest(int motor, int percent, int timeoutSecs)
/// Returns true if the specifed parameter exists from the default component /// Returns true if the specifed parameter exists from the default component
bool Vehicle::parameterExists(int componentId, const QString& name) const bool Vehicle::parameterExists(int componentId, const QString& name) const
{ {
return _autopilotPlugin->parameterExists(componentId, name); return getParameterLoader()->parameterExists(componentId, name);
} }
/// Returns the specified parameter Fact from the default component /// Returns the specified parameter Fact from the default component
...@@ -1837,7 +1843,7 @@ bool Vehicle::parameterExists(int componentId, const QString& name) const ...@@ -1837,7 +1843,7 @@ bool Vehicle::parameterExists(int componentId, const QString& name) const
/// parameterExists. /// parameterExists.
Fact* Vehicle::getParameterFact(int componentId, const QString& name) Fact* Vehicle::getParameterFact(int componentId, const QString& name)
{ {
return _autopilotPlugin->getParameterFact(componentId, name); return getParameterLoader()->getFact(componentId, name);
} }
void Vehicle::_newMissionItemsAvailable(void) void Vehicle::_newMissionItemsAvailable(void)
......
...@@ -216,9 +216,11 @@ public: ...@@ -216,9 +216,11 @@ public:
AutoPilotPluginManager* autopilotPluginManager, AutoPilotPluginManager* autopilotPluginManager,
JoystickManager* joystickManager); JoystickManager* joystickManager);
// The following is used to create a disconnected Vehicle. Disconnected vehicles are used used to access FactGroup information // The following is used to create a disconnected Vehicle for use while offline editing.
// without needing a real connection as well as offline mission planning. Vehicle(MAV_AUTOPILOT firmwareType,
Vehicle(MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, QObject* parent = NULL); MAV_TYPE vehicleType,
FirmwarePluginManager* firmwarePluginManager,
QObject* parent = NULL);
~Vehicle(); ~Vehicle();
...@@ -276,6 +278,7 @@ public: ...@@ -276,6 +278,7 @@ public:
Q_PROPERTY(int motorCount READ motorCount CONSTANT) Q_PROPERTY(int motorCount READ motorCount CONSTANT)
Q_PROPERTY(bool coaxialMotors READ coaxialMotors CONSTANT) Q_PROPERTY(bool coaxialMotors READ coaxialMotors CONSTANT)
Q_PROPERTY(bool xConfigMotors READ xConfigMotors CONSTANT) Q_PROPERTY(bool xConfigMotors READ xConfigMotors CONSTANT)
Q_PROPERTY(bool isOfflineEditingVehicle READ isOfflineEditingVehicle CONSTANT)
/// true: Vehicle is flying, false: Vehicle is on ground /// true: Vehicle is flying, false: Vehicle is on ground
Q_PROPERTY(bool flying READ flying WRITE setFlying NOTIFY flyingChanged) Q_PROPERTY(bool flying READ flying WRITE setFlying NOTIFY flyingChanged)
...@@ -497,32 +500,33 @@ public: ...@@ -497,32 +500,33 @@ public:
MessageError MessageError
} MessageType_t; } MessageType_t;
bool messageTypeNone () { return _currentMessageType == MessageNone; } bool messageTypeNone () { return _currentMessageType == MessageNone; }
bool messageTypeNormal () { return _currentMessageType == MessageNormal; } bool messageTypeNormal () { return _currentMessageType == MessageNormal; }
bool messageTypeWarning () { return _currentMessageType == MessageWarning; } bool messageTypeWarning () { return _currentMessageType == MessageWarning; }
bool messageTypeError () { return _currentMessageType == MessageError; } bool messageTypeError () { return _currentMessageType == MessageError; }
int newMessageCount () { return _currentMessageCount; } int newMessageCount () { return _currentMessageCount; }
int messageCount () { return _messageCount; } int messageCount () { return _messageCount; }
QString formatedMessages (); QString formatedMessages ();
QString formatedMessage () { return _formatedMessage; } QString formatedMessage () { return _formatedMessage; }
QString latestError () { return _latestError; } QString latestError () { return _latestError; }
float latitude () { return _coordinate.latitude(); } float latitude () { return _coordinate.latitude(); }
float longitude () { return _coordinate.longitude(); } float longitude () { return _coordinate.longitude(); }
bool mavPresent () { return _mav != NULL; } bool mavPresent () { return _mav != NULL; }
QString currentState () { return _currentState; } QString currentState () { return _currentState; }
int rcRSSI () { return _rcRSSI; } int rcRSSI () { return _rcRSSI; }
bool px4Firmware () const { return _firmwareType == MAV_AUTOPILOT_PX4; } bool px4Firmware () const { return _firmwareType == MAV_AUTOPILOT_PX4; }
bool apmFirmware () const { return _firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA; } bool apmFirmware () const { return _firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA; }
bool genericFirmware () const { return !px4Firmware() && !apmFirmware(); } bool genericFirmware () const { return !px4Firmware() && !apmFirmware(); }
bool connectionLost () const { return _connectionLost; } bool connectionLost () const { return _connectionLost; }
bool connectionLostEnabled() const { return _connectionLostEnabled; } bool connectionLostEnabled () const { return _connectionLostEnabled; }
uint messagesReceived () { return _messagesReceived; } uint messagesReceived () { return _messagesReceived; }
uint messagesSent () { return _messagesSent; } uint messagesSent () { return _messagesSent; }
uint messagesLost () { return _messagesLost; } uint messagesLost () { return _messagesLost; }
bool flying () const { return _flying; } bool flying () const { return _flying; }
bool guidedMode () const; bool guidedMode () const;
uint8_t baseMode () const { return _base_mode; } uint8_t baseMode () const { return _base_mode; }
uint32_t customMode () const { return _custom_mode; } uint32_t customMode () const { return _custom_mode; }
bool isOfflineEditingVehicle () const { return _offlineEditingVehicle; }
Fact* roll (void) { return &_rollFact; } Fact* roll (void) { return &_rollFact; }
Fact* heading (void) { return &_headingFact; } Fact* heading (void) { return &_headingFact; }
...@@ -540,7 +544,8 @@ public: ...@@ -540,7 +544,8 @@ public:
void setConnectionLostEnabled(bool connectionLostEnabled); void setConnectionLostEnabled(bool connectionLostEnabled);
ParameterLoader* getParameterLoader(void); ParameterLoader* getParameterLoader(void) { return _parameterLoader; }
ParameterLoader* getParameterLoader(void) const { return _parameterLoader; }
static const int cMaxRcChannels = 18; static const int cMaxRcChannels = 18;
...@@ -697,9 +702,9 @@ private: ...@@ -697,9 +702,9 @@ private:
QString _vehicleIdSpeech(void); QString _vehicleIdSpeech(void);
private: private:
int _id; ///< Mavlink system id int _id; ///< Mavlink system id
bool _active; bool _active;
bool _disconnectedVehicle; ///< This Vehicle is a "disconnected" vehicle for ui use when no active vehicle is available bool _offlineEditingVehicle; ///< This Vehicle is a "disconnected" vehicle for ui use while offline editing
MAV_AUTOPILOT _firmwareType; MAV_AUTOPILOT _firmwareType;
MAV_TYPE _vehicleType; MAV_TYPE _vehicleType;
......
...@@ -125,7 +125,7 @@ QGCView { ...@@ -125,7 +125,7 @@ QGCView {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
QGCLabel { QGCLabel {
id: offlineLabel id: offlineLabel
text: qsTr("Offline Mission Editing") text: qsTr("Offline Mission Editing (Requires Restart)")
font.family: ScreenTools.demiboldFontFamily font.family: ScreenTools.demiboldFontFamily
} }
} }
......
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