UASInterface.h 25 KB
Newer Older
pixhawk's avatar
pixhawk committed
1
2
/*=====================================================================

3
QGroundControl Open Source Ground Control Station
pixhawk's avatar
pixhawk committed
4

5
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
pixhawk's avatar
pixhawk committed
6

7
This file is part of the QGROUNDCONTROL project
pixhawk's avatar
pixhawk committed
8

9
    QGROUNDCONTROL is free software: you can redistribute it and/or modify
pixhawk's avatar
pixhawk committed
10
11
12
13
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

14
    QGROUNDCONTROL is distributed in the hope that it will be useful,
pixhawk's avatar
pixhawk committed
15
16
17
18
19
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
20
    along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
pixhawk's avatar
pixhawk committed
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

======================================================================*/

/**
 * @file
 *   @brief Abstract interface, represents one unmanned aerial vehicle
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *
 */

#ifndef _UASINTERFACE_H_
#define _UASINTERFACE_H_

#include <QObject>
#include <QList>
#include <QAction>
#include <QColor>
39
#include <QPointer>
pixhawk's avatar
pixhawk committed
40
41
42

#include "LinkInterface.h"
#include "ProtocolInterface.h"
pixhawk's avatar
pixhawk committed
43
#include "UASWaypointManager.h"
pixhawk's avatar
pixhawk committed
44

45
class FileManager;
46

47
48
49
50
51
52
53
54
55
56
enum BatteryType
{
    NICD = 0,
    NIMH = 1,
    LIION = 2,
    LIPOLY = 3,
    LIFE = 4,
    AGZN = 5
}; ///< The type of battery used

57
/*
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
enum SpeedMeasurementSource
{
    PRIMARY_SPEED = 0,          // ArduPlane: Measured airspeed or estimated airspeed. ArduCopter: Ground (XY) speed.
    GROUNDSPEED_BY_UAV = 1,     // Ground speed as reported by UAS
    GROUNDSPEED_BY_GPS = 2,     // Ground speed as calculated from received GPS velocity data
    LOCAL_SPEED = 3
}; ///< For velocity data, the data source

enum AltitudeMeasurementSource
{
    PRIMARY_ALTITUDE = 0,                  // ArduPlane: air and ground speed mix. This is the altitude used for navigastion.
    BAROMETRIC_ALTITUDE = 1,               // Altitude is pressure altitude. Ardupilot reports no altitude purely by barometer,
                                           // however when ALT_MIX==1, mix-altitude is purely barometric.
    GPS_ALTITUDE = 2                       // GPS ASL altitude
}; ///< For altitude data, the data source

// TODO!!! The different frames are probably represented elsewhere. There should really only
// be one set of frames. We also need to keep track of the home alt. somehow.
enum AltitudeMeasurementFrame
{
    ABSOLUTE = 0,               // Altitude is pressure altitude
    ABOVE_HOME_POSITION = 1
}; ///< For altitude data, a reference frame
81
*/
82

pixhawk's avatar
pixhawk committed
83
84
85
86
87
88
/**
 * @brief Interface for all robots.
 *
 * This interface is abstract and thus cannot be instantiated. It serves only as type definition.
 * It represents an unmanned aerial vehicle, e.g. a micro air vehicle.
 **/
lm's avatar
lm committed
89
90
class UASInterface : public QObject
{
pixhawk's avatar
pixhawk committed
91
92
93
94
95
96
97
    Q_OBJECT
public:
    virtual ~UASInterface() {}

    /* MANAGEMENT */

    /** @brief The name of the robot **/
98
    virtual QString getUASName() const = 0;
99
100
101
102
    /** @brief Get short state */
    virtual const QString& getShortState() const = 0;
    /** @brief Get short mode */
    virtual const QString& getShortMode() const = 0;
pixhawk's avatar
pixhawk committed
103
    //virtual QColor getColor() = 0;
104
    virtual int getUASID() const = 0; ///< Get the ID of the connected UAS
pixhawk's avatar
pixhawk committed
105
    /** @brief The time interval the robot is switched on **/
106
    virtual quint64 getUptime() const = 0;
pixhawk's avatar
pixhawk committed
107

lm's avatar
lm committed
108
109
110
    virtual double getLocalX() const = 0;
    virtual double getLocalY() const = 0;
    virtual double getLocalZ() const = 0;
111
    virtual bool localPositionKnown() const = 0;
lm's avatar
lm committed
112

113
114
    virtual double getLatitude() const = 0;
    virtual double getLongitude() const = 0;
115
116
    virtual double getAltitudeAMSL() const = 0;
    virtual double getAltitudeRelative() const = 0;
117
    virtual bool globalPositionKnown() const = 0;
118

lm's avatar
lm committed
119
120
121
122
    virtual double getRoll() const = 0;
    virtual double getPitch() const = 0;
    virtual double getYaw() const = 0;

123
124
    virtual bool isArmed() const = 0;

125
126
127
    /** @brief Set the airframe of this MAV */
    virtual int getAirframe() const = 0;

pixhawk's avatar
pixhawk committed
128
    /** @brief Get reference to the waypoint manager **/
129
    virtual UASWaypointManager* getWaypointManager(void) = 0;
130

131
    virtual FileManager* getFileManager() = 0;
132

133
134
    enum Airframe {
        QGC_AIRFRAME_GENERIC = 0,
135
136
137
138
139
140
141
142
        QGC_AIRFRAME_EASYSTAR,
        QGC_AIRFRAME_TWINSTAR,
        QGC_AIRFRAME_MERLIN,
        QGC_AIRFRAME_CHEETAH,
        QGC_AIRFRAME_MIKROKOPTER,
        QGC_AIRFRAME_REAPER,
        QGC_AIRFRAME_PREDATOR,
        QGC_AIRFRAME_COAXIAL,
lm's avatar
lm committed
143
144
        QGC_AIRFRAME_PTERYX,
        QGC_AIRFRAME_TRICOPTER,
145
        QGC_AIRFRAME_HEXCOPTER,
Lorenz Meier's avatar
Lorenz Meier committed
146
147
148
        QGC_AIRFRAME_X8,
        QGC_AIRFRAME_VIPER_2_0,
        QGC_AIRFRAME_CAMFLYER_Q,
149
        QGC_AIRFRAME_END_OF_ENUM
150
    };
pixhawk's avatar
pixhawk committed
151
152
153
154
155
156
157
158
159

    /**
     * @brief Get the color for this UAS
     *
     * This static function holds a color map that allows to draw a new color for each robot
     *
     * @return The next color in the color map. The map holds 20 colors and starts from the beginning
     *         if the colors are exceeded.
     */
160
    static QColor getNextColor() {
pixhawk's avatar
pixhawk committed
161
        /* Create color map */
162
163
164
165
        static QList<QColor> colors = QList<QColor>()
		<< QColor(231,72,28)
		<< QColor(104,64,240)
		<< QColor(203,254,121)
166
		<< QColor(161,252,116)
167
168
169
               	<< QColor(232,33,47)
		<< QColor(116,251,110)
		<< QColor(234,38,107)
170
		<< QColor(104,250,138)
171
172
173
                << QColor(235,43,165)
		<< QColor(98,248,176)
		<< QColor(236,48,221)
174
		<< QColor(92,247,217)
175
176
177
                << QColor(200,54,238)
		<< QColor(87,231,246)
		<< QColor(151,59,239)
178
		<< QColor(81,183,244)
179
180
                << QColor(75,133,243)
		<< QColor(242,255,128)
181
		<< QColor(230,126,23);
182

pixhawk's avatar
pixhawk committed
183
        static int nextColor = -1;
184
185
        if(nextColor == 18){//if at the end of the list
            nextColor = -1;//go back to the beginning
pixhawk's avatar
pixhawk committed
186
        }
187
        nextColor++;
188
189
        return colors[nextColor];//return the next color
   }
pixhawk's avatar
pixhawk committed
190

191
192
    /** @brief Get the type of the system (airplane, quadrotor, helicopter,..)*/
    virtual int getSystemType() = 0;
dogmaphobic's avatar
dogmaphobic committed
193
194
    /** @brief Is it an airplane (or like one)?,..)*/
    virtual bool isAirplane() = 0;
195
196
197
198
199
    /** @brief Indicates whether this system is capable of controlling a reverse velocity.
     * Used for, among other things, altering joystick input to either -1:1 or 0:1 range.
     */
    virtual bool systemCanReverse() const = 0;

lm's avatar
lm committed
200
    virtual QString getSystemTypeName() = 0;
LM's avatar
LM committed
201
202
    /** @brief Get the type of the autopilot (PIXHAWK, APM, UDB, PPZ,..) */
    virtual int getAutopilotType() = 0;
lm's avatar
lm committed
203
    virtual QString getAutopilotTypeName() = 0;
LM's avatar
LM committed
204
    virtual void setAutopilotType(int apType) = 0;
205

LM's avatar
LM committed
206
207
208
209
    virtual QMap<int, QString> getComponents() = 0;

    QColor getColor()
    {
pixhawk's avatar
pixhawk committed
210
211
212
        return color;
    }

213
    /** @brief Returns a list of actions/commands that this vehicle can perform.
214
215
216
     * Used for creating UI elements for built-in functionality for this vehicle.
     * Actions should be mappings to `void f(void);` functions that simply issue
     * a command to the vehicle.
217
218
219
     */
    virtual QList<QAction*> getActions() const = 0;

220
221
    static const unsigned int WAYPOINT_RADIUS_DEFAULT_FIXED_WING = 25;
    static const unsigned int WAYPOINT_RADIUS_DEFAULT_ROTARY_WING = 5;
Don Gagne's avatar
Don Gagne committed
222
223
224
225
226
227
    
    enum StartCalibrationType {
        StartCalibrationRadio,
        StartCalibrationGyro,
        StartCalibrationMag,
        StartCalibrationAirspeed,
228
        StartCalibrationAccel,
229
        StartCalibrationLevel,
Don Gagne's avatar
Don Gagne committed
230
        StartCalibrationEsc,
Lorenz Meier's avatar
Lorenz Meier committed
231
232
233
234
235
236
        StartCalibrationCopyTrims,
        StartCalibrationUavcanEsc
    };

    enum StartBusConfigType {
        StartBusConfigActuators
Don Gagne's avatar
Don Gagne committed
237
238
239
240
241
242
243
    };
    
    /// Starts the specified calibration
    virtual void startCalibration(StartCalibrationType calType) = 0;
    
    /// Ends any current calibration
    virtual void stopCalibration(void) = 0;
244

Lorenz Meier's avatar
Lorenz Meier committed
245
246
247
248
249
250
    /// Starts the specified bus configuration
    virtual void startBusConfig(StartBusConfigType calType) = 0;

    /// Ends any current bus configuration
    virtual void stopBusConfig(void) = 0;

pixhawk's avatar
pixhawk committed
251
252
public slots:

lm's avatar
lm committed
253
254
    /** @brief Set a new name for the system */
    virtual void setUASName(const QString& name) = 0;
lm's avatar
lm committed
255
256
    /** @brief Execute command immediately **/
    virtual void executeCommand(MAV_CMD command) = 0;
257
    /** @brief Executes a command **/
258
    virtual void executeCommand(MAV_CMD command, int confirmation, float param1, float param2, float param3, float param4, float param5, float param6, float param7, int component) = 0;
259
260
    /** @brief Executes a command ack, with success boolean **/
    virtual void executeCommandAck(int num, bool success) = 0;
261

262
263
264
    /** @brief Selects the airframe */
    virtual void setAirframe(int airframe) = 0;

pixhawk's avatar
pixhawk committed
265
266
267
    /** @brief Launches the system/Liftof **/
    virtual void launch() = 0;
    /** @brief Set a new waypoint **/
Don Gagne's avatar
Don Gagne committed
268
    //virtual void setWaypoint(MissionItem* wp) = 0;
pixhawk's avatar
pixhawk committed
269
    /** @brief Set this waypoint as next waypoint to fly to */
pixhawk's avatar
pixhawk committed
270
    //virtual void setWaypointActive(int wp) = 0;
pixhawk's avatar
pixhawk committed
271
272
    /** @brief Order the robot to return home / to land on the runway **/
    virtual void home() = 0;
273
274
    /** @brief Order the robot to land **/
    virtual void land() = 0;
275
276
    /** @brief Order the robot to pair its receiver **/
    virtual void pairRX(int rxType, int rxSubType) = 0;
pixhawk's avatar
pixhawk committed
277
278
279
280
    /** @brief Halt the system */
    virtual void halt() = 0;
    /** @brief Start/continue the current robot action */
    virtual void go() = 0;
pixhawk's avatar
pixhawk committed
281
    /** @brief Set the current mode of operation */
282
    virtual void setMode(uint8_t newBaseMode, uint32_t newCustomMode) = 0;
pixhawk's avatar
pixhawk committed
283
284
285
286
287
288
289
290
291
292
    /** Stops the robot system. If it is an MAV, the robot starts the emergency landing procedure **/
    virtual void emergencySTOP() = 0;
    /** Kills the robot. All systems are immediately shut down (e.g. the main power line is cut). This might lead to a crash **/
    virtual bool emergencyKILL() = 0;
    /**
     * @brief Shut down the system's computers
     *
     * Works only if already landed and will cleanly shut down all onboard computers.
     */
    virtual void shutdown() = 0;
293
294
295
296
297
298
299
    /** @brief Set the target position for the robot to navigate to.
     *  @param x x-coordinate of the target position
     *  @param y y-coordinate of the target position
     *  @param z z-coordinate of the target position
     *  @param yaw heading of the target position
     */
    virtual void setTargetPosition(float x, float y, float z, float yaw) = 0;
300
    /** @brief Request the list of stored waypoints from the robot */
pixhawk's avatar
pixhawk committed
301
    //virtual void requestWaypoints() = 0;
302
    /** @brief Clear all existing waypoints on the robot */
pixhawk's avatar
pixhawk committed
303
    //virtual void clearWaypointList() = 0;
304
305
    /** @brief Set world frame origin at current GPS position */
    virtual void setLocalOriginAtCurrentGPSPosition() = 0;
lm's avatar
lm committed
306
307
    /** @brief Set world frame origin / home position at this GPS position */
    virtual void setHomePosition(double lat, double lon, double alt) = 0;
pixhawk's avatar
pixhawk committed
308

309
310
311
312
313
    virtual void enableAllDataTransmission(int rate) = 0;
    virtual void enableRawSensorDataTransmission(int rate) = 0;
    virtual void enableExtendedSystemStatusTransmission(int rate) = 0;
    virtual void enableRCChannelDataTransmission(int rate) = 0;
    virtual void enableRawControllerDataTransmission(int rate) = 0;
lm's avatar
lm committed
314
    //virtual void enableRawSensorFusionTransmission(int rate) = 0;
315
316
317
318
    virtual void enablePositionTransmission(int rate) = 0;
    virtual void enableExtra1Transmission(int rate) = 0;
    virtual void enableExtra2Transmission(int rate) = 0;
    virtual void enableExtra3Transmission(int rate) = 0;
pixhawk's avatar
pixhawk committed
319

pixhawk's avatar
pixhawk committed
320
    virtual void setLocalPositionSetpoint(float x, float y, float z, float yaw) = 0;
pixhawk's avatar
pixhawk committed
321
322
    virtual void setLocalPositionOffset(float x, float y, float z, float yaw) = 0;

323
324
325
326
327
    /** @brief Return if this a rotary wing */
    virtual bool isRotaryWing() = 0;
    /** @brief Return if this is a fixed wing */
    virtual bool isFixedWing() = 0;

328
329
330
331
    /** @brief Set the current battery type and voltages */
    virtual void setBatterySpecs(const QString& specs) = 0;
    /** @brief Get the current battery type and specs */
    virtual QString getBatterySpecs() = 0;
332

Lorenz Meier's avatar
Lorenz Meier committed
333
    /** @brief Send the full HIL state to the MAV */
dogmaphobic's avatar
dogmaphobic committed
334
#ifndef __mobile__
Lorenz Meier's avatar
Lorenz Meier committed
335
336
    virtual void sendHilState(quint64 time_us, float roll, float pitch, float yaw, float rollspeed,
                        float pitchspeed, float yawspeed, double lat, double lon, double alt,
Lorenz Meier's avatar
Lorenz Meier committed
337
                        float vx, float vy, float vz, float ind_airspeed, float true_airspeed, float xacc, float yacc, float zacc) = 0;
Lorenz Meier's avatar
Lorenz Meier committed
338
339
340

    /** @brief RAW sensors for sensor HIL */
    virtual void sendHilSensors(quint64 time_us, float xacc, float yacc, float zacc, float rollspeed, float pitchspeed, float yawspeed,
Lorenz Meier's avatar
Lorenz Meier committed
341
                                float xmag, float ymag, float zmag, float abs_pressure, float diff_pressure, float pressure_alt, float temperature, quint32 fields_changed) = 0;
Lorenz Meier's avatar
Lorenz Meier committed
342
343

    /** @brief Send raw GPS for sensor HIL */
Lorenz Meier's avatar
Lorenz Meier committed
344
    virtual void sendHilGps(quint64 time_us, double lat, double lon, double alt, int fix_type, float eph, float epv, float vel, float vn, float ve, float vd, float cog, int satellites) = 0;
Lorenz Meier's avatar
Lorenz Meier committed
345

346
347
348
    /** @brief Send Optical Flow sensor message for HIL, (arguments and units accoding to mavlink documentation*/
    virtual void sendHilOpticalFlow(quint64 time_us, qint16 flow_x, qint16 flow_y, float flow_comp_m_x,
                            float flow_comp_m_y, quint8 quality, float ground_distance) = 0;
dogmaphobic's avatar
dogmaphobic committed
349
#endif
350

351
    /** @brief Send command to map a RC channel to a parameter */
Thomas Gubler's avatar
Thomas Gubler committed
352
    virtual void sendMapRCToParam(QString param_id, float scale, float value0, quint8 param_rc_channel_index, float valueMin, float valueMax) = 0;
353
354
355
356

    /** @brief Send command to disable all bindings/maps between RC and parameters */
    virtual void unsetRCToParameterMap() = 0;

pixhawk's avatar
pixhawk committed
357
358
359
360
protected:
    QColor color;

signals:
LM's avatar
LM committed
361
    /** @brief The robot state has changed */
pixhawk's avatar
pixhawk committed
362
    void statusChanged(int stateFlag);
LM's avatar
LM committed
363
364
    /** @brief A new component was detected or created */
    void componentCreated(int uas, int component, const QString& name);
pixhawk's avatar
pixhawk committed
365
366
367
368
369
370
371
    /** @brief The robot state has changed
     *
     * @param uas this robot
     * @param status short description of status, e.g. "connected"
     * @param description longer textual description. Should be however limited to a short text, e.g. 200 chars.
     */
    void statusChanged(UASInterface* uas, QString status, QString description);
372
373
374
375
376
377
    /**
     * @brief Received a plain text message from the robot
     * This signal should NOT be used for standard communication, but rather for VERY IMPORTANT
     * messages like critical errors.
     *
     * @param uasid ID of the sending system
378
     * @param compid ID of the sending component
379
380
381
     * @param text the status text
     * @param severity The severity of the message, 0 for plain debug messages, 10 for very critical messages
     */
382
383
384
385

    void poiFound(UASInterface* uas, int type, int colorIndex, QString message, float x, float y, float z);
    void poiConnectionFound(UASInterface* uas, int type, int colorIndex, QString message, float x1, float y1, float z1, float x2, float y2, float z2);

386
    /** @brief A text message from the system has been received */
387
    void textMessageReceived(int uasid, int componentid, int severity, QString text);
388
389
390

    void navModeChanged(int uasid, int mode, const QString& text);

391
392
393
394
395
396
397
    /** @brief System is now armed */
    void armed();
    /** @brief System is now disarmed */
    void disarmed();
    /** @brief Arming mode changed */
    void armingChanged(bool armed);

398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
    /**
     * @brief Update the error count of a device
     *
     * The error count indicates how many errors occured during the use of a device.
     * Usually a random error from time to time is acceptable, e.g. through electromagnetic
     * interferences on device lines like I2C and SPI. A constantly and rapidly increasing
     * error count however can help to identify broken cables or misbehaving drivers.
     *
     * @param uasid System ID
     * @param component Name of the component, e.g. "IMU"
     * @param device Name of the device, e.g. "SPI0" or "I2C1"
     * @param count Errors occured since system startup
     */
    void errCountChanged(int uasid, QString component, QString device, int count);

lm's avatar
lm committed
413
414
415
416
    /**
     * @brief Drop rate of communication link updated
     *
     * @param systemId id of the air system
lm's avatar
lm committed
417
     * @param receiveDrop drop rate of packets this MAV receives (sent from GCS or other MAVs)
lm's avatar
lm committed
418
     */
lm's avatar
lm committed
419
    void dropRateChanged(int systemId,  float receiveDrop);
pixhawk's avatar
pixhawk committed
420
421
    /** @brief Robot mode has changed */
    void modeChanged(int sysId, QString status, QString description);
pixhawk's avatar
pixhawk committed
422
423
424
425
426
427
428
429
430
431
432
433
434
435
    /** @brief A command has been issued **/
    void commandSent(int command);
    /** @brief The robot is connecting **/
    void connecting();
    /** @brief The robot is connected **/
    void connected();
    /** @brief The robot is disconnected **/
    void disconnected();
    /** @brief The robot is active **/
    void activated();
    /** @brief The robot is inactive **/
    void deactivated();
    /** @brief The robot is manually controlled **/
    void manualControl();
436

pixhawk's avatar
pixhawk committed
437
438
439
    /** @brief A value of the robot has changed.
      *
      * Typically this is used to send lowlevel information like the battery voltage to the plotting facilities of
440
441
      * the groundstation. The data here should be converted to human-readable values before being passed, so ideally
	  * SI units.
pixhawk's avatar
pixhawk committed
442
443
444
      *
      * @param uasId ID of this system
      * @param name name of the value, e.g. "battery voltage"
445
	  * @param unit The units this variable is in as an abbreviation. For system-dependent (such as raw ADC values) use "raw", for bitfields use "bits", for true/false or on/off use "bool", for unitless values use "-".
pixhawk's avatar
pixhawk committed
446
447
448
      * @param value the value that changed
      * @param msec the timestamp of the message, in milliseconds
      */
449
    void valueChanged(const int uasid, const QString& name, const QString& unit, const QVariant &value,const quint64 msecs);
lm's avatar
lm committed
450

pixhawk's avatar
pixhawk committed
451
452
453
454
455
    void voltageChanged(int uasId, double voltage);
    void waypointUpdated(int uasId, int id, double x, double y, double z, double yaw, bool autocontinue, bool active);
    void waypointSelected(int uasId, int id);
    void waypointReached(UASInterface* uas, int id);
    void autoModeChanged(bool autoMode);
456
    void parameterUpdate(int uas, int component, QString parameterName, int parameterCount, int parameterId, int type, QVariant value);
pixhawk's avatar
pixhawk committed
457
458
459
460
461
462
463
464
    /**
     * @brief The battery status has been updated
     *
     * @param uas sending system
     * @param voltage battery voltage
     * @param percent remaining capacity in percent
     * @param seconds estimated remaining flight time in seconds
     */
dongfang's avatar
dongfang committed
465
    void batteryChanged(UASInterface* uas, double voltage, double current, double percent, int seconds);
466
    void batteryConsumedChanged(UASInterface* uas, double current_consumed);
pixhawk's avatar
pixhawk committed
467
468
469
470
471
    void statusChanged(UASInterface* uas, QString status);
    void actuatorChanged(UASInterface*, int actId, double value);
    void thrustChanged(UASInterface*, double thrust);
    void heartbeat(UASInterface* uas);
    void attitudeChanged(UASInterface*, double roll, double pitch, double yaw, quint64 usec);
472
    void attitudeChanged(UASInterface*, int component, double roll, double pitch, double yaw, quint64 usec);
473
    void attitudeRotationRatesChanged(int uas, double rollrate, double pitchrate, double yawrate, quint64 usec);
474
    void attitudeThrustSetPointChanged(UASInterface*, float rollDesired, float pitchDesired, float yawDesired, float thrustDesired, quint64 usec);
475
    /** @brief The MAV set a new setpoint in the local (not body) NED X, Y, Z frame */
lm's avatar
lm committed
476
    void positionSetPointsChanged(int uasid, float xDesired, float yDesired, float zDesired, float yawDesired, quint64 usec);
477
478
    /** @brief A user (or an autonomous mission or obstacle avoidance planner) requested to set a new setpoint */
    void userPositionSetPointsChanged(int uasid, float xDesired, float yDesired, float zDesired, float yawDesired);
pixhawk's avatar
pixhawk committed
479
    void localPositionChanged(UASInterface*, double x, double y, double z, quint64 usec);
480
    void localPositionChanged(UASInterface*, int component, double x, double y, double z, quint64 usec);
481
482
    void globalPositionChanged(UASInterface*, double lat, double lon, double altAMSL, double altWGS84, quint64 usec);
    void altitudeChanged(UASInterface*, double altitudeAMSL, double altitudeWGS84, double altitudeRelative, double climbRate, quint64 usec);
lm's avatar
lm committed
483
484
    /** @brief Update the status of one satellite used for localization */
    void gpsSatelliteStatusChanged(int uasid, int satid, float azimuth, float direction, float snr, bool used);
485
486

    // The horizontal speed (a scalar)
487
    void speedChanged(UASInterface* uas, double groundSpeed, double airSpeed, quint64 usec);
488
    // Consider adding a MAV_FRAME parameter to this; could help specifying what the 3 scalars are.
489
    void velocityChanged_NED(UASInterface*, double vx, double vy, double vz, quint64 usec);
490
491

    void navigationControllerErrorsChanged(UASInterface*, double altitudeError, double speedError, double xtrackError);
492
    void NavigationControllerDataChanged(UASInterface *uas, float navRoll, float navPitch, float navBearing, float targetBearing, float targetDist);
493

pixhawk's avatar
pixhawk committed
494
495
496
497
    void imageStarted(int imgid, int width, int height, int depth, int channels);
    void imageDataReceived(int imgid, const unsigned char* imageData, int length, int startIndex);
    /** @brief Emit the new system type */
    void systemTypeSet(UASInterface* uas, unsigned int type);
498

pixhawk's avatar
pixhawk committed
499
500
501
502
503
504
505
506
    /** @brief Attitude control enabled/disabled */
    void attitudeControlEnabled(bool enabled);
    /** @brief Position 2D control enabled/disabled */
    void positionXYControlEnabled(bool enabled);
    /** @brief Altitude control enabled/disabled */
    void positionZControlEnabled(bool enabled);
    /** @brief Heading control enabled/disabled */
    void positionYawControlEnabled(bool enabled);
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
    /** @brief Optical flow status changed */
    void opticalFlowStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Vision based localization status changed */
    void visionLocalizationStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Infrared / Ultrasound status changed */
    void distanceSensorStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Gyroscope status changed */
    void gyroStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Accelerometer status changed */
    void accelStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Magnetometer status changed */
    void magSensorStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Barometer status changed */
    void baroStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Differential pressure / airspeed status changed */
    void airspeedStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Actuator status changed */
    void actuatorStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Laser scanner status changed */
    void laserStatusChanged(bool supported, bool enabled, bool ok);
    /** @brief Vicon / Leica Geotracker status changed */
    void groundTruthSensorStatusChanged(bool supported, bool enabled, bool ok);


531
532
533
534
    /** @brief Value of a remote control channel (raw) */
    void remoteControlChannelRawChanged(int channelId, float raw);
    /** @brief Value of a remote control channel (scaled)*/
    void remoteControlChannelScaledChanged(int channelId, float normalized);
535
536
    /** @brief Remote control RSSI changed  (0% - 100%)*/
    void remoteControlRSSIChanged(uint8_t rssi);
pixhawk's avatar
pixhawk committed
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552

    /**
     * @brief Localization quality changed
     * @param fix 0: lost, 1: 2D local position hold, 2: 2D localization, 3: 3D localization
     */
    void localizationChanged(UASInterface* uas, int fix);
    /**
     * @brief GPS localization quality changed
     * @param fix 0: lost, 1: at least one satellite, but no GPS fix, 2: 2D localization, 3: 3D localization
     */
    void gpsLocalizationChanged(UASInterface* uas, int fix);
    /**
     * @brief Vision localization quality changed
     * @param fix 0: lost, 1: 2D local position hold, 2: 2D localization, 3: 3D localization
     */
    void visionLocalizationChanged(UASInterface* uas, int fix);
553
554
555
556
557
    /**
     * @brief IR/U localization quality changed
     * @param fix 0: No IR/Ultrasound sensor, N > 0: Found N active sensors
     */
    void irUltraSoundLocalizationChanged(UASInterface* uas, int fix);
558

lm's avatar
lm committed
559
    // ERROR AND STATUS SIGNALS
560
561
    /** @brief Heartbeat timed out or was regained */
    void heartbeatTimeout(bool timeout, unsigned int ms);
lm's avatar
lm committed
562
563
    /** @brief Name of system changed */
    void nameChanged(QString newName);
564
565
    /** @brief Core specifications have changed */
    void systemSpecsChanged(int uasId);
566

LM's avatar
LM committed
567
568
569
    /** @brief Object detected */
    void objectDetected(unsigned int time, int id, int type, const QString& name, int quality, float bearing, float distance);

570
571
572
573

    // HOME POSITION / ORIGIN CHANGES
    void homePositionChanged(int uas, double lat, double lon, double alt);

574
575
576
    /** @brief The system received an unknown message, which it could not interpret */
    void unknownPacketReceived(int uas, int component, int messageid);

lm's avatar
lm committed
577
protected:
578

lm's avatar
lm committed
579
    // TIMEOUT CONSTANTS
580
    static const unsigned int timeoutIntervalHeartbeat = 3500 * 1000; ///< Heartbeat timeout is 3.5 seconds
581

pixhawk's avatar
pixhawk committed
582
583
};

lm's avatar
lm committed
584
Q_DECLARE_INTERFACE(UASInterface, "org.qgroundcontrol/1.0")
585

pixhawk's avatar
pixhawk committed
586
#endif // _UASINTERFACE_H_