QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
ArduSubFirmwarePlugin.cc
Go to the documentation of this file.
3#include "Vehicle.h"
4
5QGC_LOGGING_CATEGORY(APMSubmarineFactGroupLog, "FirmwarePlugin.ArduSubFirmwarePlugin")
6
8 : FactGroup(300, QStringLiteral(":/json/Vehicle/SubmarineFact.json"), parent)
9{
10 // qCDebug(APMSubmarineFactGroupLog) << Q_FUNC_INFO << this;
11
12 _addFact(&_camTiltFact);
13 _addFact(&_tetherTurnsFact);
14 _addFact(&_lightsLevel1Fact);
15 _addFact(&_lightsLevel2Fact);
16 _addFact(&_pilotGainFact);
17 _addFact(&_inputHoldFact);
18 _addFact(&_rollPitchToggleFact);
19 _addFact(&_rangefinderDistanceFact);
20 _addFact(&_rangefinderTargetFact);
21
22 _camTiltFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
23 _tetherTurnsFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
24 _lightsLevel1Fact.setRawValue(std::numeric_limits<float>::quiet_NaN());
25 _lightsLevel2Fact.setRawValue(std::numeric_limits<float>::quiet_NaN());
26 _pilotGainFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
27 _inputHoldFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
28 _rollPitchToggleFact.setRawValue(2); // 2 shows "Unavailable" in older firmwares
29 _rangefinderDistanceFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
30 _rangefinderTargetFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
31}
32
33APMSubmarineFactGroup::~APMSubmarineFactGroup()
34{
35 // qCDebug(APMSubmarineFactGroupLog) << Q_FUNC_INFO << this;
36}
37
39{
40 return vehicleImageOpaque(vehicle);
41}
42
43void ArduSubFirmwarePlugin::adjustMetaData(MAV_TYPE vehicleType, FactMetaData *metaData)
44{
45 Q_UNUSED(vehicleType);
46
47 if (!metaData) {
48 return;
49 }
50
51 if (_factRenameMap.contains(metaData->name())) {
52 metaData->setShortDescription(QString(_factRenameMap[metaData->name()]));
53 }
54}
55
60
65
67{
68 for (FirmwareFlightMode &mode: modeList) {
69 mode.fixedWing = false;
70 mode.multiRotor = true;
71 }
72
73 _updateFlightModeList(modeList);
74}
75
77{
78 switch (val) {
80 return APMSubMode::AUTO;
82 return APMSubMode::GUIDED;
83 default:
84 return UINT32_MAX;
85 }
86}
87
88/*===========================================================================*/
89
90bool ArduSubFirmwarePlugin::_remapParamNameIntialized = false;
91FirmwarePlugin::remapParamNameMajorVersionMap_t ArduSubFirmwarePlugin::_remapParamName;
92
94 : APMFirmwarePlugin(parent)
95 , _infoFactGroup(this)
96{
109 });
110
111 static FlightModeList availableFlightModes = {
112 // Mode Name , Custom Mode CanBeSet adv
113 { _manualFlightMode , APMSubMode::MANUAL , true , true },
115 { _acroFlightMode , APMSubMode::ACRO , true , true },
116 { _altHoldFlightMode , APMSubMode::ALT_HOLD , true , true },
117 { _autoFlightMode , APMSubMode::AUTO , true , true },
118 { _guidedFlightMode , APMSubMode::GUIDED , true , true },
119 { _circleFlightMode , APMSubMode::CIRCLE , true , true },
120 { _surfaceFlightMode , APMSubMode::SURFACE , true , true },
121 { _posHoldFlightMode , APMSubMode::POSHOLD , true , true },
123 { _surftrakFlightMode , APMSubMode::SURFTRAK , true , true },
124 };
125 updateAvailableFlightModes(availableFlightModes);
126
127 if (!_remapParamNameIntialized) {
128 _remapParamNameIntialized = true;
129 }
130
131 _nameToFactGroupMap.insert("apmSubInfo", &_infoFactGroup);
132
133 _factRenameMap[QStringLiteral("altitudeRelative")] = QStringLiteral("Depth");
134 _factRenameMap[QStringLiteral("flightTime")] = QStringLiteral("Dive Time");
135 _factRenameMap[QStringLiteral("altitudeAMSL")] = QStringLiteral("");
136 _factRenameMap[QStringLiteral("hobbs")] = QStringLiteral("");
137 _factRenameMap[QStringLiteral("airSpeed")] = QStringLiteral("");
138}
139
144
146{
147 // Remapping not supported
149}
150
152{
153 vehicle->requestDataStream(MAV_DATA_STREAM_RAW_SENSORS, 2);
154 vehicle->requestDataStream(MAV_DATA_STREAM_EXTENDED_STATUS, 2);
155 vehicle->requestDataStream(MAV_DATA_STREAM_RC_CHANNELS, 2);
156 vehicle->requestDataStream(MAV_DATA_STREAM_POSITION, 3);
157 vehicle->requestDataStream(MAV_DATA_STREAM_EXTRA1, 20);
158 vehicle->requestDataStream(MAV_DATA_STREAM_EXTRA2, 10);
159 vehicle->requestDataStream(MAV_DATA_STREAM_EXTRA3, 3);
160}
161
162bool ArduSubFirmwarePlugin::isCapable(const Vehicle *vehicle, FirmwareCapabilities capabilities) const
163{
164 Q_UNUSED(vehicle);
166 return ((capabilities & available) == capabilities);
167}
168
169void ArduSubFirmwarePlugin::_handleNamedValueFloat(mavlink_message_t *message)
170{
171 mavlink_named_value_float_t value{};
172 mavlink_msg_named_value_float_decode(message, &value);
173
174 const QString name = QString(value.name);
175
176 if (name == "CamTilt") {
177 _infoFactGroup.getFact("cameraTilt")->setRawValue(value.value * 100);
178 } else if (name == "TetherTrn") {
179 _infoFactGroup.getFact("tetherTurns")->setRawValue(value.value);
180 } else if (name == "Lights1") {
181 _infoFactGroup.getFact("lights1")->setRawValue(value.value * 100);
182 } else if (name == "Lights2") {
183 _infoFactGroup.getFact("lights2")->setRawValue(value.value * 100);
184 } else if (name == "PilotGain") {
185 _infoFactGroup.getFact("pilotGain")->setRawValue(value.value * 100);
186 } else if (name == "InputHold") {
187 _infoFactGroup.getFact("inputHold")->setRawValue(value.value);
188 } else if (name == "RollPitch") {
189 _infoFactGroup.getFact("rollPitchToggle")->setRawValue(value.value);
190 } else if (name == "RFTarget") {
191 _infoFactGroup.getFact("rangefinderTarget")->setRawValue(value.value);
192 }
193}
194
195void ArduSubFirmwarePlugin::_handleMavlinkMessage(mavlink_message_t *message)
196{
197 switch (message->msgid) {
198 case (MAVLINK_MSG_ID_NAMED_VALUE_FLOAT):
199 _handleNamedValueFloat(message);
200 break;
201 case (MAVLINK_MSG_ID_RANGEFINDER):
202 {
203 mavlink_rangefinder_t msg{};
204 mavlink_msg_rangefinder_decode(message, &msg);
205 _infoFactGroup.getFact("rangefinderDistance")->setRawValue(msg.distance);
206 break;
207 }
208 default:
209 break;
210 }
211}
212
214{
215 _handleMavlinkMessage(message);
217}
218
219QMap<QString, FactGroup*>* ArduSubFirmwarePlugin::factGroups()
220{
221 return &_nameToFactGroupMap;
222}
QList< FirmwareFlightMode > FlightModeList
struct __mavlink_message mavlink_message_t
#define QGC_LOGGING_CATEGORY(name, categoryStr)
This is the base class for all stack specific APM firmware plugins.
bool adjustIncomingMavlinkMessage(Vehicle *vehicle, mavlink_message_t *message) override
void initializeStreamRates(Vehicle *vehicle) override
QMap< QString, FactGroup * > * factGroups() override
Returns a pointer to a dictionary of firmware-specific FactGroups.
uint32_t _convertToCustomFlightModeEnum(uint32_t val) const override
void adjustMetaData(MAV_TYPE vehicleType, FactMetaData *metaData) override
QString stabilizedFlightMode() const override
Returns the flight mode for Stabilized.
int remapParamNameHigestMinorVersionNumber(int majorVersionNumber) const override
Returns the highest major version number that is known to the remap for this specified major version.
ArduSubFirmwarePlugin(QObject *parent=nullptr)
QString vehicleImageOpaque(const Vehicle *) const override
Return the resource file which contains the vehicle icon used in the flight view when the view is dar...
const QString _motorDetectionFlightMode
QString vehicleImageOutline(const Vehicle *vehicle) const override
Return the resource file which contains the vehicle icon used in the flight view when the view is lig...
bool adjustIncomingMavlinkMessage(Vehicle *vehicle, mavlink_message_t *message) override
bool isCapable(const Vehicle *vehicle, FirmwareCapabilities capabilities) const override
QString motorDetectionFlightMode() const override
Returns the flight mode for Motor Detection.
void updateAvailableFlightModes(FlightModeList &modeList) override
Update Available flight modes recieved from vehicle.
Used to group Facts together into an object hierarachy.
Definition FactGroup.h:19
void setShortDescription(const QString &shortDescription)
QString name() const
void _setModeEnumToModeStringMapping(FlightModeCustomModeMap enumToString)
FirmwareCapabilities
Set of optional capabilites which firmware may support.
@ GuidedModeCapability
Vehicle supports guided mode commands.
@ SetFlightModeCapability
FirmwarePlugin::setFlightMode method is supported.
@ PauseVehicleCapability
Vehicle supports pausing at current location.
void _updateFlightModeList(FlightModeList &flightModeList)
FlightModeCustomModeMap _modeEnumToString
QMap< int, remapParamNameMinorVersionRemapMap_t > remapParamNameMajorVersionMap_t
static const int versionNotSetValue
Definition Vehicle.h:702
void requestDataStream(MAV_DATA_STREAM stream, uint16_t rate, bool sendMultiple=true)
Definition Vehicle.cc:1610