diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc index e27a0ed7657920a055ad7aa0b75d0e99c9f0d10f..422637e5ab223974eaa81e8f4e09802195ee2dff 100644 --- a/src/Vehicle/Vehicle.cc +++ b/src/Vehicle/Vehicle.cc @@ -57,6 +57,7 @@ const char* Vehicle::_altitudeAMSLFactName = "altitudeAMSL"; const char* Vehicle::_flightDistanceFactName = "flightDistance"; const char* Vehicle::_flightTimeFactName = "flightTime"; const char* Vehicle::_distanceToHomeFactName = "distanceToHome"; +const char* Vehicle::_hobbsFactName = "hobbs"; const char* Vehicle::_gpsFactGroupName = "gps"; const char* Vehicle::_batteryFactGroupName = "battery"; @@ -165,6 +166,7 @@ Vehicle::Vehicle(LinkInterface* link, , _flightDistanceFact (0, _flightDistanceFactName, FactMetaData::valueTypeDouble) , _flightTimeFact (0, _flightTimeFactName, FactMetaData::valueTypeElapsedTimeInSeconds) , _distanceToHomeFact (0, _distanceToHomeFactName, FactMetaData::valueTypeDouble) + , _hobbsFact (0, _hobbsFactName, FactMetaData::valueTypeString) , _gpsFactGroup(this) , _batteryFactGroup(this) , _windFactGroup(this) @@ -183,6 +185,8 @@ Vehicle::Vehicle(LinkInterface* link, connect(this, &Vehicle::flightModeChanged, this, &Vehicle::_handleFlightModeChanged); connect(this, &Vehicle::armedChanged, this, &Vehicle::_announceArmedChanged); + connect(_toolbox->multiVehicleManager(), &MultiVehicleManager::parameterReadyVehicleAvailableChanged, this, &Vehicle::_vehicleParamLoaded); + _uas = new UAS(_mavlink, this, _firmwarePluginManager); connect(_uas, &UAS::imageReady, this, &Vehicle::_imageReady); @@ -337,6 +341,7 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, , _flightDistanceFact (0, _flightDistanceFactName, FactMetaData::valueTypeDouble) , _flightTimeFact (0, _flightTimeFactName, FactMetaData::valueTypeElapsedTimeInSeconds) , _distanceToHomeFact (0, _distanceToHomeFactName, FactMetaData::valueTypeDouble) + , _hobbsFact (0, _hobbsFactName, FactMetaData::valueTypeString) , _gpsFactGroup(this) , _batteryFactGroup(this) , _windFactGroup(this) @@ -352,6 +357,7 @@ void Vehicle::_commonInit(void) connect(this, &Vehicle::coordinateChanged, this, &Vehicle::_updateDistanceToHome); connect(this, &Vehicle::homePositionChanged, this, &Vehicle::_updateDistanceToHome); + connect(this, &Vehicle::hobbsMeterChanged, this, &Vehicle::_updateHobbsMeter); _missionManager = new MissionManager(this); connect(_missionManager, &MissionManager::error, this, &Vehicle::_missionManagerError); @@ -393,6 +399,9 @@ void Vehicle::_commonInit(void) _addFact(&_flightTimeFact, _flightTimeFactName); _addFact(&_distanceToHomeFact, _distanceToHomeFactName); + _hobbsFact.setRawValue(QVariant(QString("0000:00:00"))); + _addFact(&_hobbsFact, _hobbsFactName); + _addFactGroup(&_gpsFactGroup, _gpsFactGroupName); _addFactGroup(&_batteryFactGroup, _batteryFactGroupName); _addFactGroup(&_windFactGroup, _windFactGroupName); @@ -2862,6 +2871,11 @@ void Vehicle::_updateDistanceToHome(void) } } +void Vehicle::_updateHobbsMeter(void) +{ + _hobbsFact.setRawValue(hobbsMeter()); +} + void Vehicle::forceInitialPlanRequestComplete(void) { _initialPlanRequestComplete = true; @@ -2873,6 +2887,35 @@ void Vehicle::sendPlan(QString planFile) PlanMasterController::sendPlanToVehicle(this, planFile); } +QString Vehicle::hobbsMeter() +{ + static const char* HOOBS_HI = "LND_FLIGHT_T_HI"; + static const char* HOOBS_LO = "LND_FLIGHT_T_LO"; + //-- TODO: Does this exist on non PX4? + if (_parameterManager->parameterExists(FactSystem::defaultComponentId, HOOBS_HI) && + _parameterManager->parameterExists(FactSystem::defaultComponentId, HOOBS_LO)) { + Fact* factHi = _parameterManager->getParameter(FactSystem::defaultComponentId, HOOBS_HI); + Fact* factLo = _parameterManager->getParameter(FactSystem::defaultComponentId, HOOBS_LO); + uint64_t hobbsTimeSeconds = ((uint64_t)factHi->rawValue().toUInt() << 32 | (uint64_t)factLo->rawValue().toUInt()) / 1000000; + int hours = hobbsTimeSeconds / 3600; + int minutes = (hobbsTimeSeconds % 3600) / 60; + int seconds = hobbsTimeSeconds % 60; + QString timeStr; + timeStr.sprintf("%04d:%02d:%02d", hours, minutes, seconds); + qCDebug(VehicleLog) << "Hobbs Meter:" << timeStr << "(" << factHi->rawValue().toUInt() << factLo->rawValue().toUInt() << ")"; + return timeStr; + } + return QString("0000:00:00"); +} + +void Vehicle::_vehicleParamLoaded(bool ready) +{ + //-- TODO: This seems silly but can you think of a better + // way to update this? + if(ready) { + emit hobbsMeterChanged(); + } +} //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h index ed55428a64a7a15d0afb0270fc7440273b16fedf..e1ff02c722ecce1dd86430fa5df11bb9dad67cae 100644 --- a/src/Vehicle/Vehicle.h +++ b/src/Vehicle/Vehicle.h @@ -319,6 +319,7 @@ public: Q_PROPERTY(bool initialPlanRequestComplete READ initialPlanRequestComplete NOTIFY initialPlanRequestCompleteChanged) Q_PROPERTY(QVariantList staticCameraList READ staticCameraList CONSTANT) Q_PROPERTY(QGCCameraManager* dynamicCameras READ dynamicCameras NOTIFY dynamicCamerasChanged) + Q_PROPERTY(QString hobbsMeter READ hobbsMeter NOTIFY hobbsMeterChanged) // Vehicle state used for guided control Q_PROPERTY(bool flying READ flying NOTIFY flyingChanged) ///< Vehicle is flying @@ -343,6 +344,7 @@ public: Q_PROPERTY(Fact* altitudeAMSL READ altitudeAMSL CONSTANT) Q_PROPERTY(Fact* flightDistance READ flightDistance CONSTANT) Q_PROPERTY(Fact* distanceToHome READ distanceToHome CONSTANT) + Q_PROPERTY(Fact* hobbs READ hobbs CONSTANT) Q_PROPERTY(FactGroup* gps READ gpsFactGroup CONSTANT) Q_PROPERTY(FactGroup* battery READ batteryFactGroup CONSTANT) @@ -613,6 +615,7 @@ public: Fact* altitudeAMSL (void) { return &_altitudeAMSLFact; } Fact* flightDistance (void) { return &_flightDistanceFact; } Fact* distanceToHome (void) { return &_distanceToHomeFact; } + Fact* hobbs (void) { return &_hobbsFact; } FactGroup* gpsFactGroup (void) { return &_gpsFactGroup; } FactGroup* batteryFactGroup (void) { return &_batteryFactGroup; } @@ -690,7 +693,9 @@ public: bool capabilitiesKnown (void) const { return _vehicleCapabilitiesKnown; } uint64_t capabilityBits (void) const { return _capabilityBits; } // Change signalled by capabilityBitsChanged + QGCCameraManager* dynamicCameras () { return _cameras; } + QString hobbsMeter (); /// @true: When flying a mission the vehicle is always facing towards the next waypoint bool vehicleYawsToNextWaypointInMission(void) const; @@ -736,6 +741,7 @@ signals: void firmwareTypeChanged(void); void vehicleTypeChanged(void); void dynamicCamerasChanged(); + void hobbsMeterChanged(); void capabilitiesKnownChanged(bool capabilitiesKnown); void initialPlanRequestCompleteChanged(bool initialPlanRequestComplete); void capabilityBitsChanged(uint64_t capabilityBits); @@ -834,6 +840,8 @@ private slots: void _clearTrajectoryPoints(void); void _clearCameraTriggerPoints(void); void _updateDistanceToHome(void); + void _updateHobbsMeter(void); + void _vehicleParamLoaded(bool ready); private: bool _containsLink(LinkInterface* link); @@ -1055,6 +1063,7 @@ private: Fact _flightDistanceFact; Fact _flightTimeFact; Fact _distanceToHomeFact; + Fact _hobbsFact; VehicleGPSFactGroup _gpsFactGroup; VehicleBatteryFactGroup _batteryFactGroup; @@ -1073,6 +1082,7 @@ private: static const char* _flightDistanceFactName; static const char* _flightTimeFactName; static const char* _distanceToHomeFactName; + static const char* _hobbsFactName; static const char* _gpsFactGroupName; static const char* _batteryFactGroupName; diff --git a/src/Vehicle/VehicleFact.json b/src/Vehicle/VehicleFact.json index f50f0d860eeb5b5fb6f1ad942987b8a299a1083f..ae6d59c50df1eedad6ff82c6ecbaced37120cabe 100644 --- a/src/Vehicle/VehicleFact.json +++ b/src/Vehicle/VehicleFact.json @@ -74,5 +74,10 @@ "shortDescription": "Flight Time", "type": "elapsedSeconds", "decimalPlaces": 1 +}, +{ + "name": "hobbs", + "shortDescription": "Hobbs Meter", + "type": "string" } ]