UASInterface.h 9.9 KB
Newer Older
1 2 3 4 5 6 7 8
/****************************************************************************
 *
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/
pixhawk's avatar
pixhawk committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25


/**
 * @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>
26
#include <QPointer>
pixhawk's avatar
pixhawk committed
27 28 29 30

#include "LinkInterface.h"
#include "ProtocolInterface.h"

31
#ifndef __mobile__
32
class FileManager;
33
#endif
34

pixhawk's avatar
pixhawk committed
35 36 37 38 39 40
/**
 * @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
41 42
class UASInterface : public QObject
{
pixhawk's avatar
pixhawk committed
43 44 45 46 47 48
    Q_OBJECT
public:
    virtual ~UASInterface() {}

    /* MANAGEMENT */

49
    virtual int getUASID() const = 0; ///< Get the ID of the connected UAS
pixhawk's avatar
pixhawk committed
50
    /** @brief The time interval the robot is switched on **/
51
    virtual quint64 getUptime() const = 0;
pixhawk's avatar
pixhawk committed
52

lm's avatar
lm committed
53 54 55 56
    virtual double getRoll() const = 0;
    virtual double getPitch() const = 0;
    virtual double getYaw() const = 0;

57
#ifndef __mobile__
58
    virtual FileManager* getFileManager() = 0;
59
#endif
60

pixhawk's avatar
pixhawk committed
61 62 63 64 65 66 67 68
    /**
     * @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.
     */
69
    static QColor getNextColor() {
pixhawk's avatar
pixhawk committed
70
        /* Create color map */
71
        static QList<QColor> colors = QList<QColor>()
dogmaphobic's avatar
dogmaphobic committed
72 73 74 75 76 77 78 79
        << 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)
80
                << QColor(235,43,165)
dogmaphobic's avatar
dogmaphobic committed
81 82 83
        << QColor(98,248,176)
        << QColor(236,48,221)
        << QColor(92,247,217)
84
                << QColor(200,54,238)
dogmaphobic's avatar
dogmaphobic committed
85 86 87
        << QColor(87,231,246)
        << QColor(151,59,239)
        << QColor(81,183,244)
88
                << QColor(75,133,243)
dogmaphobic's avatar
dogmaphobic committed
89 90
        << QColor(242,255,128)
        << QColor(230,126,23);
91

pixhawk's avatar
pixhawk committed
92
        static int nextColor = -1;
93 94
        if(nextColor == 18){//if at the end of the list
            nextColor = -1;//go back to the beginning
pixhawk's avatar
pixhawk committed
95
        }
96
        nextColor++;
97 98
        return colors[nextColor];//return the next color
   }
pixhawk's avatar
pixhawk committed
99

LM's avatar
LM committed
100 101 102 103
    virtual QMap<int, QString> getComponents() = 0;

    QColor getColor()
    {
pixhawk's avatar
pixhawk committed
104 105 106
        return color;
    }

107 108 109 110 111
    enum StartCalibrationType {
        StartCalibrationRadio,
        StartCalibrationGyro,
        StartCalibrationMag,
        StartCalibrationAirspeed,
112
        StartCalibrationAccel,
113
        StartCalibrationLevel,
114
        StartCalibrationPressure,
Don Gagne's avatar
Don Gagne committed
115
        StartCalibrationEsc,
116
        StartCalibrationCopyTrims,
117 118
        StartCalibrationUavcanEsc,
        StartCalibrationCompassMot,
119 120 121
    };

    enum StartBusConfigType {
122 123
        StartBusConfigActuators,
        EndBusConfigActuators,
124
    };
dogmaphobic's avatar
dogmaphobic committed
125

126 127
    /// Starts the specified calibration
    virtual void startCalibration(StartCalibrationType calType) = 0;
dogmaphobic's avatar
dogmaphobic committed
128

129 130
    /// Ends any current calibration
    virtual void stopCalibration(void) = 0;
131

132 133 134 135 136 137
    /// 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
138
public slots:
139 140
    /** @brief Order the robot to pair its receiver **/
    virtual void pairRX(int rxType, int rxSubType) = 0;
141 142 143 144
    /** @brief Order the robot to take a picture **/
    virtual void takePhoto() {}
    /** @brief Order the robot to toggle video recording **/
    virtual void toggleVideo() {}
pixhawk's avatar
pixhawk committed
145

Lorenz Meier's avatar
Lorenz Meier committed
146
    /** @brief Send the full HIL state to the MAV */
dogmaphobic's avatar
dogmaphobic committed
147
#ifndef __mobile__
Lorenz Meier's avatar
Lorenz Meier committed
148 149
    virtual void sendHilState(quint64 time_us, float roll, float pitch, float yaw, float rollspeed,
                        float pitchspeed, float yawspeed, double lat, double lon, double alt,
150
                        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
151 152 153

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

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

159 160 161
    /** @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
162
#endif
163

164
    /** @brief Send command to map a RC channel to a parameter */
165
    virtual void sendMapRCToParam(QString param_id, float scale, float value0, quint8 param_rc_channel_index, float valueMin, float valueMax) = 0;
166 167 168 169

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

pixhawk's avatar
pixhawk committed
170 171 172 173
protected:
    QColor color;

signals:
174
    /** @brief A text message from the system has been received */
175
    void textMessageReceived(int uasid, int componentid, int severity, QString text);
176

177 178 179
    /**
     * @brief Update the error count of a device
     *
Ricardo de Almeida Gonzaga's avatar
Ricardo de Almeida Gonzaga committed
180
     * The error count indicates how many errors occurred during the use of a device.
181 182 183 184 185 186 187
     * 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"
Ricardo de Almeida Gonzaga's avatar
Ricardo de Almeida Gonzaga committed
188
     * @param count Errors occurred since system startup
189 190 191
     */
    void errCountChanged(int uasid, QString component, QString device, int count);

pixhawk's avatar
pixhawk committed
192 193 194 195
    /** @brief The robot is connected **/
    void connected();
    /** @brief The robot is disconnected **/
    void disconnected();
196

pixhawk's avatar
pixhawk committed
197 198 199
    /** @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
200
      * the groundstation. The data here should be converted to human-readable values before being passed, so ideally
dogmaphobic's avatar
dogmaphobic committed
201
      * SI units.
pixhawk's avatar
pixhawk committed
202 203 204
      *
      * @param uasId ID of this system
      * @param name name of the value, e.g. "battery voltage"
dogmaphobic's avatar
dogmaphobic committed
205
      * @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
206 207 208
      * @param value the value that changed
      * @param msec the timestamp of the message, in milliseconds
      */
209
    void valueChanged(const int uasid, const QString& name, const QString& unit, const QVariant &value,const quint64 msecs);
lm's avatar
lm committed
210

211
    void parameterUpdate(int uas, int component, QString parameterName, int parameterCount, int parameterId, int type, QVariant value);
Don Gagne's avatar
Don Gagne committed
212

pixhawk's avatar
pixhawk committed
213 214 215 216 217 218 219 220
    /**
     * @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
221
    void batteryChanged(UASInterface* uas, double voltage, double current, double percent, int seconds);
pixhawk's avatar
pixhawk committed
222 223
    void statusChanged(UASInterface* uas, QString status);
    void attitudeChanged(UASInterface*, double roll, double pitch, double yaw, quint64 usec);
224
    void attitudeChanged(UASInterface*, int component, double roll, double pitch, double yaw, quint64 usec);
225

pixhawk's avatar
pixhawk committed
226 227
    void imageStarted(int imgid, int width, int height, int depth, int channels);
    void imageDataReceived(int imgid, const unsigned char* imageData, int length, int startIndex);
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245

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

246 247 248
    // ERROR AND STATUS SIGNALS
    /** @brief Name of system changed */
    void nameChanged(QString newName);
249 250
    /** @brief Core specifications have changed */
    void systemSpecsChanged(int uasId);
251

dogmaphobic's avatar
dogmaphobic committed
252 253 254
    // Log Download Signals
    void logEntry   (UASInterface* uas, uint32_t time_utc, uint32_t size, uint16_t id, uint16_t num_logs, uint16_t last_log_num);
    void logData    (UASInterface* uas, uint32_t ofs, uint16_t id, uint8_t count, const uint8_t* data);
255

pixhawk's avatar
pixhawk committed
256 257
};

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

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