UASInterface.h 11.9 KB
Newer Older
pixhawk's avatar
pixhawk committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*=====================================================================

PIXHAWK Micro Air Vehicle Flying Robotics Toolkit

(c) 2009, 2010 PIXHAWK PROJECT  <http://pixhawk.ethz.ch>

This file is part of the PIXHAWK project

    PIXHAWK is free software: you can redistribute it and/or modify
    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.

    PIXHAWK is distributed in the hope that it will be useful,
    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
    along with PIXHAWK. If not, see <http://www.gnu.org/licenses/>.

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

/**
 * @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"
#include "Waypoint.h"

/**
 * @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
59
60
61
62
    Q_OBJECT
public:
    UASInterface() :
            color(UASInterface::getNextColor())
    {
    }
    virtual ~UASInterface() {}

    /* MANAGEMENT */

    /** @brief The name of the robot **/
63
    virtual QString getUASName() const = 0;
pixhawk's avatar
pixhawk committed
64
    //virtual QColor getColor() = 0;
65
    virtual int getUASID() const = 0; ///< Get the ID of the connected UAS
pixhawk's avatar
pixhawk committed
66
    /** @brief The time interval the robot is switched on **/
67
    virtual quint64 getUptime() const = 0;
pixhawk's avatar
pixhawk committed
68
    /** @brief Get the status flag for the communication **/
69
    virtual int getCommunicationStatus() const = 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
113

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

pixhawk's avatar
pixhawk committed
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
            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
132
133
            colors.append(QColor(242,255,128));
            colors.append(QColor(230,126,23));
pixhawk's avatar
pixhawk committed
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
            nextColor++;
        }
        return colors[nextColor++];
    }

    QColor getColor()
    {
        return color;
    }

public slots:

    /** @brief Launches the system/Liftof **/
    virtual void launch() = 0;
    /** @brief Set a new waypoint **/
    virtual void setWaypoint(Waypoint* wp) = 0;
    /** @brief Set this waypoint as next waypoint to fly to */
    virtual void setWaypointActive(int wp) = 0;
    /** @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
158
    /** @brief Set the current mode of operation */
pixhawk's avatar
pixhawk committed
159
    virtual void setMode(int mode) = 0;
pixhawk's avatar
pixhawk committed
160
161
162
163
164
165
166
167
168
169
    /** 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;
170
    /** @brief Request the list of stored waypoints from the robot */
pixhawk's avatar
pixhawk committed
171
    virtual void requestWaypoints() = 0;
172
    /** @brief Clear all existing waypoints on the robot */
pixhawk's avatar
pixhawk committed
173
    virtual void clearWaypointList() = 0;
174
175
    /** @brief Request all onboard parameters of all components */
    virtual void requestParameters() = 0;
176
177
178
179
180
181
182
183
184
    /** @brief Write parameter to permanent storage */
    virtual void writeParameters() = 0;
    /** @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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200

    /**
     * @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
201
202
203
204
205
206
207

    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
208
209
210
211
212
213
214
215
216
217
218
219
220
221

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);
222
223
224
225
226
227
228
229
230
231
    /**
     * @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
     * @param text the status text
     * @param severity The severity of the message, 0 for plain debug messages, 10 for very critical messages
     */
    void textMessageReceived(int uasid, int severity, QString text);
lm's avatar
lm committed
232
233
234
235
    /**
     * @brief Drop rate of communication link updated
     *
     * @param systemId id of the air system
lm's avatar
lm committed
236
     * @param receiveDrop drop rate of packets this MAV receives (sent from GCS or other MAVs)
lm's avatar
lm committed
237
     */
lm's avatar
lm committed
238
    void dropRateChanged(int systemId,  float receiveDrop);
pixhawk's avatar
pixhawk committed
239
240
    /** @brief Robot mode has changed */
    void modeChanged(int sysId, QString status, QString description);
pixhawk's avatar
pixhawk committed
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
    /** @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);
274
    void parameterChanged(int uas, int component, QString parameterName, float value);
pixhawk's avatar
pixhawk committed
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
    void detectionReceived(int uasId, QString patternPath, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, double confidence, bool detected);
    /**
     * @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);
    void localPositionChanged(UASInterface*, double x, double y, double z, quint64 usec);
lm's avatar
lm committed
292
    void globalPositionChanged(UASInterface*, double lat, double lon, double alt, quint64 usec);
pixhawk's avatar
pixhawk committed
293
294
295
296
297
298
299
300
    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);
};

#endif // _UASINTERFACE_H_