UASInterface.h 14.8 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 39 40 41

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

/**
 * @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>

#include "LinkInterface.h"
#include "ProtocolInterface.h"
42
#include "UASWaypointManager.h"
pixhawk's avatar
pixhawk committed
43 44 45 46 47 48 49

/**
 * @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
50 51
class UASInterface : public QObject
{
pixhawk's avatar
pixhawk committed
52 53 54 55 56 57 58
    Q_OBJECT
public:
    virtual ~UASInterface() {}

    /* MANAGEMENT */

    /** @brief The name of the robot **/
59
    virtual QString getUASName() const = 0;
pixhawk's avatar
pixhawk committed
60
    //virtual QColor getColor() = 0;
61
    virtual int getUASID() const = 0; ///< Get the ID of the connected UAS
pixhawk's avatar
pixhawk committed
62
    /** @brief The time interval the robot is switched on **/
63
    virtual quint64 getUptime() const = 0;
pixhawk's avatar
pixhawk committed
64
    /** @brief Get the status flag for the communication **/
65
    virtual int getCommunicationStatus() const = 0;
pixhawk's avatar
pixhawk committed
66

67 68 69
    /** @brief Get reference to the waypoint manager **/
    virtual UASWaypointManager &getWaypointManager(void) = 0;

pixhawk's avatar
pixhawk committed
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
    /* 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,
        COMM_FAIL = 4, ///< Communication link failed
    };



    /**
         * @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.
         **/
    virtual QList<LinkInterface*>* getLinks() = 0;

    /**
     * @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.
     */
    static QColor getNextColor()
    {
        /* Create color map */
        static QList<QColor> colors = QList<QColor>();
        static int nextColor = -1;

        if (nextColor == -1)
        {
            ///> Color map for plots, includes 20 colors
            ///> Map will start from beginning when the first 20 colors are exceeded
pixhawk's avatar
pixhawk committed
113

pixhawk's avatar
pixhawk committed
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
            colors.append(QColor(203,254,121));
            colors.append(QColor(231,72,28));
            colors.append(QColor(161,252,116));
            colors.append(QColor(232,33,47));
            colors.append(QColor(116,251,110));
            colors.append(QColor(234,38,107));
            colors.append(QColor(104,250,138));
            colors.append(QColor(235,43,165));
            colors.append(QColor(98,248,176));
            colors.append(QColor(236,48,221));
            colors.append(QColor(92,247,217));
            colors.append(QColor(200,54,238));
            colors.append(QColor(87,231,246));
            colors.append(QColor(151,59,239));
            colors.append(QColor(81,183,244));
            colors.append(QColor(104,64,240));
            colors.append(QColor(75,133,243));
pixhawk's avatar
pixhawk committed
131 132
            colors.append(QColor(242,255,128));
            colors.append(QColor(230,126,23));
pixhawk's avatar
pixhawk committed
133 134 135 136 137
            nextColor++;
        }
        return colors[nextColor++];
    }

138 139 140
    /** @brief Get the type of the system (airplane, quadrotor, helicopter,..)*/
    virtual int getSystemType() = 0;

pixhawk's avatar
pixhawk committed
141 142 143 144 145 146 147 148 149 150
    QColor getColor()
    {
        return color;
    }

public slots:

    /** @brief Launches the system/Liftof **/
    virtual void launch() = 0;
    /** @brief Set a new waypoint **/
pixhawk's avatar
pixhawk committed
151
    //virtual void setWaypoint(Waypoint* wp) = 0;
pixhawk's avatar
pixhawk committed
152
    /** @brief Set this waypoint as next waypoint to fly to */
pixhawk's avatar
pixhawk committed
153
    //virtual void setWaypointActive(int wp) = 0;
pixhawk's avatar
pixhawk committed
154 155 156 157 158 159
    /** @brief Order the robot to return home / to land on the runway **/
    virtual void home() = 0;
    /** @brief Halt the system */
    virtual void halt() = 0;
    /** @brief Start/continue the current robot action */
    virtual void go() = 0;
pixhawk's avatar
pixhawk committed
160
    /** @brief Set the current mode of operation */
pixhawk's avatar
pixhawk committed
161
    virtual void setMode(int mode) = 0;
pixhawk's avatar
pixhawk committed
162 163 164 165 166 167 168 169 170 171
    /** 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;
172
    /** @brief Request the list of stored waypoints from the robot */
pixhawk's avatar
pixhawk committed
173
    //virtual void requestWaypoints() = 0;
174
    /** @brief Clear all existing waypoints on the robot */
pixhawk's avatar
pixhawk committed
175
    //virtual void clearWaypointList() = 0;
176 177
    /** @brief Request all onboard parameters of all components */
    virtual void requestParameters() = 0;
178
    /** @brief Write parameter to permanent storage */
179 180 181
    virtual void writeParametersToStorage() = 0;
    /** @brief Read parameter from permanent storage */
    virtual void readParametersFromStorage() = 0;
182 183 184 185 186 187 188
    /** @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
     */
    virtual void setParameter(int component, QString id, float value) = 0;
pixhawk's avatar
pixhawk committed
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204

    /**
     * @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
205 206 207 208 209 210 211

    virtual void enableAllDataTransmission(bool enabled) = 0;
    virtual void enableRawSensorDataTransmission(bool enabled) = 0;
    virtual void enableExtendedSystemStatusTransmission(bool enabled) = 0;
    virtual void enableRCChannelDataTransmission(bool enabled) = 0;
    virtual void enableRawControllerDataTransmission(bool enabled) = 0;
    virtual void enableRawSensorFusionTransmission(bool enabled) = 0;
pixhawk's avatar
pixhawk committed
212

pixhawk's avatar
pixhawk committed
213 214
    virtual void setLocalPositionSetpoint(float x, float y, float z, float yaw) = 0;

pixhawk's avatar
pixhawk committed
215 216 217 218 219 220 221 222 223 224 225 226 227
protected:
    QColor color;

signals:
    /** @brief The robot state has changed **/
    void statusChanged(int stateFlag);
    /** @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);
228 229 230 231 232 233
    /**
     * @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
234
     * @param compid ID of the sending component
235 236 237
     * @param text the status text
     * @param severity The severity of the message, 0 for plain debug messages, 10 for very critical messages
     */
238
    void textMessageReceived(int uasid, int componentid, int severity, QString text);
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
    /**
     * @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
254 255 256 257
    /**
     * @brief Drop rate of communication link updated
     *
     * @param systemId id of the air system
258
     * @param receiveDrop drop rate of packets this MAV receives (sent from GCS or other MAVs)
lm's avatar
lm committed
259
     */
260
    void dropRateChanged(int systemId,  float receiveDrop);
pixhawk's avatar
pixhawk committed
261 262
    /** @brief Robot mode has changed */
    void modeChanged(int sysId, QString status, QString description);
pixhawk's avatar
pixhawk committed
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
    /** @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();
    /** @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
      * the groundstation
      *
      * @param uasId ID of this system
      * @param name name of the value, e.g. "battery voltage"
      * @param value the value that changed
      * @param msec the timestamp of the message, in milliseconds
      */
    void valueChanged(int uasId, QString name, double value, quint64 msec);
    void valueChanged(UASInterface* uas, QString name, double value, quint64 msec);
    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);
296
    void parameterChanged(int uas, int component, QString parameterName, float value);
297
    void patternDetected(int uasId, QString patternPath, float confidence, bool detected);
pixhawk's avatar
pixhawk committed
298
    void letterDetected(int uasId, QString letter, float confidence, bool detected);
pixhawk's avatar
pixhawk committed
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
    /**
     * @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
     */
    void batteryChanged(UASInterface* uas, double voltage, double percent, int seconds);
    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);
    void attitudeThrustSetPointChanged(UASInterface*, double rollDesired, double pitchDesired, double yawDesired, double thrustDesired, quint64 usec);
lm's avatar
lm committed
314
    void positionSetPointsChanged(int uasid, float xDesired, float yDesired, float zDesired, float yawDesired, quint64 usec);
pixhawk's avatar
pixhawk committed
315
    void localPositionChanged(UASInterface*, double x, double y, double z, quint64 usec);
lm's avatar
lm committed
316
    void globalPositionChanged(UASInterface*, double lat, double lon, double alt, quint64 usec);
lm's avatar
lm committed
317 318
    /** @brief Update the status of one satellite used for localization */
    void gpsSatelliteStatusChanged(int uasid, int satid, float azimuth, float direction, float snr, bool used);
pixhawk's avatar
pixhawk committed
319 320 321 322 323
    void speedChanged(UASInterface*, double x, double y, double z, quint64 usec);
    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);
pixhawk's avatar
pixhawk committed
324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
    /** @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);

    /**
     * @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);
348 349 350 351 352
    /**
     * @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);
pixhawk's avatar
pixhawk committed
353 354
};

355 356
Q_DECLARE_INTERFACE(UASInterface, "org.qgroundcontrol/1.0");

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