UASInterface.h 27.7 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"
43
#include "UASParameterDataModel.h"
44
#include "UASWaypointManager.h"
45
#include "QGCUASParamManagerInterface.h"
pixhawk's avatar
pixhawk committed
46

47 48
class QGCUASFileManager;

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

59
/*
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
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
83
*/
84

pixhawk's avatar
pixhawk committed
85 86 87 88 89 90
/**
 * @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
91 92
class UASInterface : public QObject
{
pixhawk's avatar
pixhawk committed
93 94 95 96 97 98 99
    Q_OBJECT
public:
    virtual ~UASInterface() {}

    /* MANAGEMENT */

    /** @brief The name of the robot **/
100
    virtual QString getUASName() const = 0;
101 102 103 104
    /** @brief Get short state */
    virtual const QString& getShortState() const = 0;
    /** @brief Get short mode */
    virtual const QString& getShortMode() const = 0;
105
    /** @brief Translate mode id into text */
106
    virtual QString getShortModeTextFor(uint8_t base_mode, uint32_t custom_mode) const = 0;
pixhawk's avatar
pixhawk committed
107
    //virtual QColor getColor() = 0;
108
    virtual int getUASID() const = 0; ///< Get the ID of the connected UAS
pixhawk's avatar
pixhawk committed
109
    /** @brief The time interval the robot is switched on **/
110
    virtual quint64 getUptime() const = 0;
pixhawk's avatar
pixhawk committed
111
    /** @brief Get the status flag for the communication **/
112
    virtual int getCommunicationStatus() const = 0;
pixhawk's avatar
pixhawk committed
113

lm's avatar
lm committed
114 115 116
    virtual double getLocalX() const = 0;
    virtual double getLocalY() const = 0;
    virtual double getLocalZ() const = 0;
117
    virtual bool localPositionKnown() const = 0;
lm's avatar
lm committed
118

119 120
    virtual double getLatitude() const = 0;
    virtual double getLongitude() const = 0;
121 122
    virtual double getAltitudeAMSL() const = 0;
    virtual double getAltitudeRelative() const = 0;
123
    virtual bool globalPositionKnown() const = 0;
124

lm's avatar
lm committed
125 126 127 128
    virtual double getRoll() const = 0;
    virtual double getPitch() const = 0;
    virtual double getYaw() const = 0;

129 130
    virtual bool getSelected() const = 0;

131 132
    virtual bool isArmed() const = 0;

133 134 135
    /** @brief Set the airframe of this MAV */
    virtual int getAirframe() const = 0;

136
    /** @brief Get reference to the waypoint manager **/
137
    virtual UASWaypointManager* getWaypointManager(void) = 0;
138

139
    /** @brief Get reference to the param manager **/
140
    virtual QGCUASParamManagerInterface* getParamManager() = 0;
141

142 143 144 145 146 147 148
    virtual QGCUASFileManager* getFileManager() = 0;

    /** @brief Send a message over this link (to this or to all UAS on this link) */
    virtual void sendMessage(LinkInterface* link, mavlink_message_t message) = 0;
    /** @brief Send a message over all links this UAS can be reached with (!= all links) */
    virtual void sendMessage(mavlink_message_t message) = 0;

pixhawk's avatar
pixhawk committed
149 150 151 152 153 154 155 156 157 158 159
    /* COMMUNICATION FLAGS */

    enum CommStatus {
        /** Unit is disconnected, no failure state reached so far **/
        COMM_DISCONNECTED = 0,
        /** The communication is established **/
        COMM_CONNECTING = 1,
        /** The communication link is up **/
        COMM_CONNECTED = 2,
        /** The connection is closed **/
        COMM_DISCONNECTING = 3,
160 161
        COMM_FAIL = 4,
        COMM_TIMEDOUT = 5///< Communication link failed
pixhawk's avatar
pixhawk committed
162 163
    };

164 165
    enum Airframe {
        QGC_AIRFRAME_GENERIC = 0,
166 167 168 169 170 171 172 173
        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
174 175
        QGC_AIRFRAME_PTERYX,
        QGC_AIRFRAME_TRICOPTER,
176
        QGC_AIRFRAME_HEXCOPTER,
Lorenz Meier's avatar
Lorenz Meier committed
177 178 179
        QGC_AIRFRAME_X8,
        QGC_AIRFRAME_VIPER_2_0,
        QGC_AIRFRAME_CAMFLYER_Q,
180
        QGC_AIRFRAME_END_OF_ENUM
181
    };
pixhawk's avatar
pixhawk committed
182 183 184 185 186 187 188 189

    /**
         * @brief Get the links associated with this robot
         *
         * @return List with all links this robot is associated with. Association is usually
         *         based on the fact that a message for this robot has been received through that
         *         interface. The LinkInterface can support multiple protocols.
         **/
190
    virtual QList<LinkInterface*> getLinks() = 0;
pixhawk's avatar
pixhawk committed
191 192 193 194 195 196 197 198 199

    /**
     * @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.
     */
200
    static QColor getNextColor() {
pixhawk's avatar
pixhawk committed
201
        /* Create color map */
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
        static QList<QColor> colors = QList<QColor>() 
		<< QColor(231,72,28) 
		<< QColor(104,64,240) 
		<< QColor(203,254,121) 
		<< QColor(161,252,116)
               	<< QColor(232,33,47) 
		<< QColor(116,251,110) 
		<< QColor(234,38,107) 
		<< QColor(104,250,138)
                << QColor(235,43,165) 
		<< QColor(98,248,176) 
		<< QColor(236,48,221) 
		<< QColor(92,247,217)
                << QColor(200,54,238) 
		<< QColor(87,231,246) 
		<< QColor(151,59,239) 
		<< QColor(81,183,244)
                << QColor(75,133,243) 
		<< QColor(242,255,128) 
		<< QColor(230,126,23);
        
pixhawk's avatar
pixhawk committed
223
        static int nextColor = -1;
224 225
        if(nextColor == 18){//if at the end of the list
            nextColor = -1;//go back to the beginning
pixhawk's avatar
pixhawk committed
226
        }
227 228 229
        nextColor++; 
        return colors[nextColor];//return the next color
   }
pixhawk's avatar
pixhawk committed
230

231 232
    /** @brief Get the type of the system (airplane, quadrotor, helicopter,..)*/
    virtual int getSystemType() = 0;
233 234 235 236 237
    /** @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
238
    virtual QString getSystemTypeName() = 0;
LM's avatar
LM committed
239 240
    /** @brief Get the type of the autopilot (PIXHAWK, APM, UDB, PPZ,..) */
    virtual int getAutopilotType() = 0;
lm's avatar
lm committed
241
    virtual QString getAutopilotTypeName() = 0;
LM's avatar
LM committed
242
    virtual void setAutopilotType(int apType) = 0;
243

LM's avatar
LM committed
244 245 246 247
    virtual QMap<int, QString> getComponents() = 0;

    QColor getColor()
    {
pixhawk's avatar
pixhawk committed
248 249 250
        return color;
    }

251
    /** @brief Returns a list of actions/commands that this vehicle can perform.
252 253 254
     * 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.
255 256 257
     */
    virtual QList<QAction*> getActions() const = 0;

258 259 260
    static const unsigned int WAYPOINT_RADIUS_DEFAULT_FIXED_WING = 25;
    static const unsigned int WAYPOINT_RADIUS_DEFAULT_ROTARY_WING = 5;

pixhawk's avatar
pixhawk committed
261 262
public slots:

263 264
    /** @brief Set a new name for the system */
    virtual void setUASName(const QString& name) = 0;
lm's avatar
lm committed
265 266
    /** @brief Execute command immediately **/
    virtual void executeCommand(MAV_CMD command) = 0;
267
    /** @brief Executes a command **/
268
    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;
269 270
    /** @brief Executes a command ack, with success boolean **/
    virtual void executeCommandAck(int num, bool success) = 0;
271

272 273 274
    /** @brief Selects the airframe */
    virtual void setAirframe(int airframe) = 0;

pixhawk's avatar
pixhawk committed
275 276 277
    /** @brief Launches the system/Liftof **/
    virtual void launch() = 0;
    /** @brief Set a new waypoint **/
pixhawk's avatar
pixhawk committed
278
    //virtual void setWaypoint(Waypoint* wp) = 0;
pixhawk's avatar
pixhawk committed
279
    /** @brief Set this waypoint as next waypoint to fly to */
pixhawk's avatar
pixhawk committed
280
    //virtual void setWaypointActive(int wp) = 0;
pixhawk's avatar
pixhawk committed
281 282
    /** @brief Order the robot to return home / to land on the runway **/
    virtual void home() = 0;
283 284
    /** @brief Order the robot to land **/
    virtual void land() = 0;
285 286
    /** @brief Order the robot to pair its receiver **/
    virtual void pairRX(int rxType, int rxSubType) = 0;
pixhawk's avatar
pixhawk committed
287 288 289 290
    /** @brief Halt the system */
    virtual void halt() = 0;
    /** @brief Start/continue the current robot action */
    virtual void go() = 0;
pixhawk's avatar
pixhawk committed
291
    /** @brief Set the current mode of operation */
292
    virtual void setMode(uint8_t newBaseMode, uint32_t newCustomMode) = 0;
pixhawk's avatar
pixhawk committed
293 294 295 296 297 298 299 300 301 302
    /** 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;
303 304 305 306 307 308 309
    /** @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;
310
    /** @brief Request the list of stored waypoints from the robot */
pixhawk's avatar
pixhawk committed
311
    //virtual void requestWaypoints() = 0;
312
    /** @brief Clear all existing waypoints on the robot */
pixhawk's avatar
pixhawk committed
313
    //virtual void clearWaypointList() = 0;
314 315
    /** @brief Set world frame origin at current GPS position */
    virtual void setLocalOriginAtCurrentGPSPosition() = 0;
316 317
    /** @brief Set world frame origin / home position at this GPS position */
    virtual void setHomePosition(double lat, double lon, double alt) = 0;
318
    /** @brief Request one specific onboard parameter */
319
    virtual void requestParameter(int component, const QString& parameter) = 0;
320
    /** @brief Write parameter to permanent storage */
321 322 323
    virtual void writeParametersToStorage() = 0;
    /** @brief Read parameter from permanent storage */
    virtual void readParametersFromStorage() = 0;
324 325 326 327 328 329
    /** @brief Set a system parameter
     * @param component ID of the system component to write the parameter to
     * @param id String identifying the parameter
     * @warning The length of the ID string is limited by the MAVLink format! Take care to not exceed it
     * @param value Value of the parameter, IEEE 754 single precision floating point
     */
330
    virtual void setParameter(const int component, const QString& id, const QVariant& value) = 0;
pixhawk's avatar
pixhawk committed
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346

    /**
     * @brief Add a link to the list of current links
     *
     * Adding the link to the robot's internal link list will allow him so send its own messages
     * over all registered links. Usually a link is added once a message for this particular robot
     * has been received over a link, but adding could also be done manually.
     * @warning Not all links should be added to all robots by default, because else all robots will
     *          attempt to send over all links, typically choking wireless serial links.
     */
    virtual void addLink(LinkInterface* link) = 0;

    /**
     * @brief Set the current robot as focused in the user interface
     */
    virtual void setSelected() = 0;
lm's avatar
lm committed
347

348 349 350 351 352
    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
353
    //virtual void enableRawSensorFusionTransmission(int rate) = 0;
354 355 356 357
    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
358

pixhawk's avatar
pixhawk committed
359
    virtual void setLocalPositionSetpoint(float x, float y, float z, float yaw) = 0;
pixhawk's avatar
pixhawk committed
360 361
    virtual void setLocalPositionOffset(float x, float y, float z, float yaw) = 0;

362
    virtual void startRadioControlCalibration(int param=1) = 0;
363
    virtual void endRadioControlCalibration() = 0;
pixhawk's avatar
pixhawk committed
364 365 366
    virtual void startMagnetometerCalibration() = 0;
    virtual void startGyroscopeCalibration() = 0;
    virtual void startPressureCalibration() = 0;
pixhawk's avatar
pixhawk committed
367

368 369 370 371 372
    /** @brief Return if this a rotary wing */
    virtual bool isRotaryWing() = 0;
    /** @brief Return if this is a fixed wing */
    virtual bool isFixedWing() = 0;

373 374 375 376
    /** @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;
377

Lorenz Meier's avatar
Lorenz Meier committed
378
    /** @brief Send the full HIL state to the MAV */
Lorenz Meier's avatar
Lorenz Meier committed
379 380
    virtual void sendHilState(quint64 time_us, float roll, float pitch, float yaw, float rollspeed,
                        float pitchspeed, float yawspeed, double lat, double lon, double alt,
381
                        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
382 383 384

    /** @brief RAW sensors for sensor HIL */
    virtual void sendHilSensors(quint64 time_us, float xacc, float yacc, float zacc, float rollspeed, float pitchspeed, float yawspeed,
385
                                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
386 387

    /** @brief Send raw GPS for sensor HIL */
388
    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
389

390 391 392 393
    /** @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;

pixhawk's avatar
pixhawk committed
394 395 396 397
protected:
    QColor color;

signals:
LM's avatar
LM committed
398
    /** @brief The robot state has changed */
pixhawk's avatar
pixhawk committed
399
    void statusChanged(int stateFlag);
LM's avatar
LM committed
400 401
    /** @brief A new component was detected or created */
    void componentCreated(int uas, int component, const QString& name);
pixhawk's avatar
pixhawk committed
402 403 404 405 406 407 408
    /** @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);
409 410 411 412 413 414
    /**
     * @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
415
     * @param compid ID of the sending component
416 417 418
     * @param text the status text
     * @param severity The severity of the message, 0 for plain debug messages, 10 for very critical messages
     */
419 420 421 422

    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);

423 424 425 426 427
    /**
     * @brief A misconfiguration has been detected by the UAS
     */
    void misconfigurationDetected(UASInterface* uas);

428
    /** @brief A text message from the system has been received */
429
    void textMessageReceived(int uasid, int componentid, int severity, QString text);
430 431 432

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

433 434 435 436 437 438 439
    /** @brief System is now armed */
    void armed();
    /** @brief System is now disarmed */
    void disarmed();
    /** @brief Arming mode changed */
    void armingChanged(bool armed);

440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
    /**
     * @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
455 456 457 458
    /**
     * @brief Drop rate of communication link updated
     *
     * @param systemId id of the air system
459
     * @param receiveDrop drop rate of packets this MAV receives (sent from GCS or other MAVs)
lm's avatar
lm committed
460
     */
461
    void dropRateChanged(int systemId,  float receiveDrop);
pixhawk's avatar
pixhawk committed
462 463
    /** @brief Robot mode has changed */
    void modeChanged(int sysId, QString status, QString description);
464 465
    /** @brief Robot armed state has changed */
    void armingChanged(int sysId, QString armingState);
pixhawk's avatar
pixhawk committed
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
    /** @brief A command has been issued **/
    void commandSent(int command);
    /** @brief The connection status has changed **/
    void connectionChanged(CommStatus connectionFlag);
    /** @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();
482

pixhawk's avatar
pixhawk committed
483 484 485
    /** @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
486 487
      * the groundstation. The data here should be converted to human-readable values before being passed, so ideally
	  * SI units.
pixhawk's avatar
pixhawk committed
488 489 490
      *
      * @param uasId ID of this system
      * @param name name of the value, e.g. "battery voltage"
491
	  * @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
492 493 494
      * @param value the value that changed
      * @param msec the timestamp of the message, in milliseconds
      */
495
    void valueChanged(const int uasid, const QString& name, const QString& unit, const QVariant &value,const quint64 msecs);
lm's avatar
lm committed
496

pixhawk's avatar
pixhawk committed
497 498 499 500 501
    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);
502 503
    void parameterChanged(int uas, int component, QString parameterName, QVariant value);
    void parameterChanged(int uas, int component, int parameterCount, int parameterId, QString parameterName, QVariant value);
504
    void patternDetected(int uasId, QString patternPath, float confidence, bool detected);
pixhawk's avatar
pixhawk committed
505
    void letterDetected(int uasId, QString letter, float confidence, bool detected);
pixhawk's avatar
pixhawk committed
506 507 508 509 510 511 512 513
    /**
     * @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
514
    void batteryChanged(UASInterface* uas, double voltage, double current, double percent, int seconds);
pixhawk's avatar
pixhawk committed
515 516 517 518 519
    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);
520
    void attitudeChanged(UASInterface*, int component, double roll, double pitch, double yaw, quint64 usec);
521
    void attitudeRotationRatesChanged(int uas, double rollrate, double pitchrate, double yawrate, quint64 usec);
522
    void attitudeThrustSetPointChanged(UASInterface*, float rollDesired, float pitchDesired, float yawDesired, float thrustDesired, quint64 usec);
523
    /** @brief The MAV set a new setpoint in the local (not body) NED X, Y, Z frame */
lm's avatar
lm committed
524
    void positionSetPointsChanged(int uasid, float xDesired, float yDesired, float zDesired, float yawDesired, quint64 usec);
525 526
    /** @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
527
    void localPositionChanged(UASInterface*, double x, double y, double z, quint64 usec);
528
    void localPositionChanged(UASInterface*, int component, double x, double y, double z, quint64 usec);
529 530
    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
531 532
    /** @brief Update the status of one satellite used for localization */
    void gpsSatelliteStatusChanged(int uasid, int satid, float azimuth, float direction, float snr, bool used);
533 534

    // The horizontal speed (a scalar)
535
    void speedChanged(UASInterface* uas, double groundSpeed, double airSpeed, quint64 usec);
536
    // Consider adding a MAV_FRAME parameter to this; could help specifying what the 3 scalars are.
537
    void velocityChanged_NED(UASInterface*, double vx, double vy, double vz, quint64 usec);
538 539 540

    void navigationControllerErrorsChanged(UASInterface*, double altitudeError, double speedError, double xtrackError);

pixhawk's avatar
pixhawk committed
541 542 543 544
    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);
545

pixhawk's avatar
pixhawk committed
546 547 548 549 550 551 552 553
    /** @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);
554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
    /** @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);


578 579 580 581
    /** @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);
pixhawk's avatar
pixhawk committed
582 583
    /** @brief Remote control RSSI changed */
    void remoteControlRSSIChanged(float rssi);
pixhawk's avatar
pixhawk committed
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599

    /**
     * @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);
600 601 602 603 604
    /**
     * @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);
605

606
    // ERROR AND STATUS SIGNALS
607 608
    /** @brief Heartbeat timed out or was regained */
    void heartbeatTimeout(bool timeout, unsigned int ms);
609 610
    /** @brief Name of system changed */
    void nameChanged(QString newName);
611 612
    /** @brief System has been selected as focused system */
    void systemSelected(bool selected);
613 614
    /** @brief Core specifications have changed */
    void systemSpecsChanged(int uasId);
615

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

619 620 621 622

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

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

626
protected:
627

628
    // TIMEOUT CONSTANTS
629
    static const unsigned int timeoutIntervalHeartbeat = 3500 * 1000; ///< Heartbeat timeout is 3.5 seconds
630

pixhawk's avatar
pixhawk committed
631 632
};

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

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