diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc index 4e47d692f72de93637af6afd0fa948cdc7775e99..2cb154812fea4e4d94ede72d88816e8648d0f2d3 100644 --- a/src/Vehicle/Vehicle.cc +++ b/src/Vehicle/Vehicle.cc @@ -29,6 +29,7 @@ #include "MissionCommandTree.h" #include "QGroundControlQmlGlobal.h" #include "SettingsManager.h" +#include "QGCQGeoCoordinate.h" QGC_LOGGING_CATEGORY(VehicleLog, "VehicleLog") @@ -316,6 +317,10 @@ void Vehicle::_commonInit(void) _missionManager = new MissionManager(this); connect(_missionManager, &MissionManager::error, this, &Vehicle::_missionManagerError); connect(_missionManager, &MissionManager::newMissionItemsAvailable, this, &Vehicle::_missionLoadComplete); + connect(_missionManager, &MissionManager::newMissionItemsAvailable, this, &Vehicle::_clearCameraTriggerPoints); + connect(_missionManager, &MissionManager::newMissionItemsAvailable, this, &Vehicle::_clearTrajectoryPoints); + connect(_missionManager, &MissionManager::sendComplete, this, &Vehicle::_clearCameraTriggerPoints); + connect(_missionManager, &MissionManager::sendComplete, this, &Vehicle::_clearTrajectoryPoints); _parameterManager = new ParameterManager(this); connect(_parameterManager, &ParameterManager::parametersReadyChanged, this, &Vehicle::_parametersReady); @@ -584,6 +589,13 @@ void Vehicle::_mavlinkMessageReceived(LinkInterface* link, mavlink_message_t mes break; case MAVLINK_MSG_ID_SCALED_PRESSURE3: _handleScaledPressure3(message); + break; + case MAVLINK_MSG_ID_CAMERA_FEEDBACK: + _handleCameraFeedback(message); + break; + + case MAVLINK_MSG_ID_CAMERA_IMAGE_CAPTURED: + _handleCameraImageCaptured(message); break; case MAVLINK_MSG_ID_SERIAL_CONTROL: @@ -605,6 +617,31 @@ void Vehicle::_mavlinkMessageReceived(LinkInterface* link, mavlink_message_t mes _uas->receiveMessage(message); } + +void Vehicle::_handleCameraFeedback(const mavlink_message_t& message) +{ + mavlink_camera_feedback_t feedback; + + mavlink_msg_camera_feedback_decode(&message, &feedback); + + QGeoCoordinate imageCoordinate((double)feedback.lat / qPow(10.0, 7.0), (double)feedback.lng / qPow(10.0, 7.0), feedback.alt_msl); + qCDebug(VehicleLog) << "_handleCameraFeedback coord:index" << imageCoordinate << feedback.img_idx; + _cameraTriggerPoints.append(new QGCQGeoCoordinate(imageCoordinate, this)); +} + +void Vehicle::_handleCameraImageCaptured(const mavlink_message_t& message) +{ + mavlink_camera_image_captured_t feedback; + + mavlink_msg_camera_image_captured_decode(&message, &feedback); + + QGeoCoordinate imageCoordinate((double)feedback.lat / qPow(10.0, 7.0), (double)feedback.lon / qPow(10.0, 7.0), feedback.alt); + qCDebug(VehicleLog) << "_handleCameraFeedback coord:index" << imageCoordinate << feedback.image_index << feedback.capture_result; + if (feedback.capture_result == 1) { + _cameraTriggerPoints.append(new QGCQGeoCoordinate(imageCoordinate, this)); + } +} + void Vehicle::_handleVfrHud(mavlink_message_t& message) { mavlink_vfr_hud_t vfrHud; @@ -945,6 +982,7 @@ void Vehicle::_handleHeartbeat(mavlink_message_t& message) // We are transitioning to the armed state, begin tracking trajectory points for the map if (_armed) { _mapTrajectoryStart(); + _clearCameraTriggerPoints(); } else { _mapTrajectoryStop(); } @@ -1277,7 +1315,6 @@ void Vehicle::_handleTextMessage(int newCount) } UASMessageHandler* pMh = qgcApp()->toolbox()->uasMessageHandler(); - Q_ASSERT(pMh); MessageType_t type = newCount ? _currentMessageType : MessageNone; int errorCount = _currentErrorCount; int warnCount = _currentWarningCount; @@ -1622,10 +1659,20 @@ void Vehicle::_addNewMapTrajectoryPoint(void) _mapTrajectoryLastCoordinate = _coordinate; } +void Vehicle::_clearTrajectoryPoints(void) +{ + _mapTrajectoryList.clearAndDeleteContents(); +} + +void Vehicle::_clearCameraTriggerPoints(void) +{ + _cameraTriggerPoints.clearAndDeleteContents(); +} + void Vehicle::_mapTrajectoryStart(void) { _mapTrajectoryHaveFirstCoordinate = false; - _mapTrajectoryList.clear(); + _clearTrajectoryPoints(); _mapTrajectoryTimer.start(); _flightDistanceFact.setRawValue(0); } @@ -1907,11 +1954,6 @@ void Vehicle::_announceArmedChanged(bool armed) _say(QString("%1 %2").arg(_vehicleIdSpeech()).arg(armed ? QStringLiteral("armed") : QStringLiteral("disarmed"))); } -void Vehicle::clearTrajectoryPoints(void) -{ - _mapTrajectoryList.clearAndDeleteContents(); -} - void Vehicle::setFlying(bool flying) { if (armed() && _flying != flying) { diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h index 8cd5e3c7670c407ecf2dfb14368124026fefd5af..0836fd2ad64eb386a55ade185e13b4dc7e14e15b 100644 --- a/src/Vehicle/Vehicle.h +++ b/src/Vehicle/Vehicle.h @@ -246,6 +246,7 @@ public: Q_PROPERTY(QString flightMode READ flightMode WRITE setFlightMode NOTIFY flightModeChanged) Q_PROPERTY(bool hilMode READ hilMode WRITE setHilMode NOTIFY hilModeChanged) Q_PROPERTY(QmlObjectListModel* trajectoryPoints READ trajectoryPoints CONSTANT) + Q_PROPERTY(QmlObjectListModel* cameraTriggerPoints READ cameraTriggerPoints CONSTANT) Q_PROPERTY(float latitude READ latitude NOTIFY coordinateChanged) Q_PROPERTY(float longitude READ longitude NOTIFY coordinateChanged) Q_PROPERTY(bool messageTypeNone READ messageTypeNone NOTIFY messageTypeChanged) @@ -371,8 +372,6 @@ public: Q_INVOKABLE void virtualTabletJoystickValue(double roll, double pitch, double yaw, double thrust); Q_INVOKABLE void disconnectInactiveVehicle(void); - Q_INVOKABLE void clearTrajectoryPoints(void); - /// Command vehicle to return to launch Q_INVOKABLE void guidedModeRTL(void); @@ -524,6 +523,7 @@ public: void setPrearmError(const QString& prearmError); QmlObjectListModel* trajectoryPoints(void) { return &_mapTrajectoryList; } + QmlObjectListModel* cameraTriggerPoints(void) { return &_cameraTriggerPoints; } int flowImageIndex() { return _flowImageIndex; } @@ -791,8 +791,9 @@ private slots: void _geoFenceLoadComplete(void); void _rallyPointLoadComplete(void); void _sendMavCommandAgain(void); - void _activeJoystickChanged(void); + void _clearTrajectoryPoints(void); + void _clearCameraTriggerPoints(void); private: bool _containsLink(LinkInterface* link); @@ -820,6 +821,8 @@ private: void _handleScaledPressure(mavlink_message_t& message); void _handleScaledPressure2(mavlink_message_t& message); void _handleScaledPressure3(mavlink_message_t& message); + void _handleCameraFeedback(const mavlink_message_t& message); + void _handleCameraImageCaptured(const mavlink_message_t& message); void _missionManagerError(int errorCode, const QString& errorMsg); void _geoFenceManagerError(int errorCode, const QString& errorMsg); void _rallyPointManagerError(int errorCode, const QString& errorMsg); @@ -954,6 +957,8 @@ private: bool _mapTrajectoryHaveFirstCoordinate; static const int _mapTrajectoryMsecsBetweenPoints = 1000; + QmlObjectListModel _cameraTriggerPoints; + // Toolbox references FirmwarePluginManager* _firmwarePluginManager; JoystickManager* _joystickManager;