QGCMAVLinkUASFactory.cc 4.87 KB
Newer Older
1 2
#include "QGCMAVLinkUASFactory.h"
#include "UASManager.h"
3
#include "QGCUASWorker.h"
4
#include "QGXPX4UAS.h"
5 6 7 8 9 10 11 12 13 14

QGCMAVLinkUASFactory::QGCMAVLinkUASFactory(QObject *parent) :
    QObject(parent)
{
}

UASInterface* QGCMAVLinkUASFactory::createUAS(MAVLinkProtocol* mavlink, LinkInterface* link, int sysid, mavlink_heartbeat_t* heartbeat, QObject* parent)
{
    QPointer<QObject> p;

lm's avatar
lm committed
15 16
    if (parent != NULL)
    {
17
        p = parent;
lm's avatar
lm committed
18 19 20
    }
    else
    {
21 22 23 24 25
        p = mavlink;
    }

    UASInterface* uas;

26
    QGCUASWorker* worker = new QGCUASWorker();
27

lm's avatar
lm committed
28 29
    switch (heartbeat->autopilot)
    {
30
    case MAV_AUTOPILOT_GENERIC:
lm's avatar
lm committed
31
    {
32
        UAS* mav = new UAS(mavlink, worker, sysid);
33 34
        // Set the system type
        mav->setSystemType((int)heartbeat->type);
35

36 37
        // Connect this robot to the UAS object
        connect(mavlink, SIGNAL(messageReceived(LinkInterface*, mavlink_message_t)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
Lorenz Meier's avatar
Lorenz Meier committed
38
        connect(mavlink, SIGNAL(messageReceived(LinkInterface*,mavlink_message_t)), mav->getFileManager(), SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
39
        uas = mav;
40 41
    }
    break;
42
    case MAV_AUTOPILOT_PIXHAWK:
lm's avatar
lm committed
43
    {
44
        PxQuadMAV* mav = new PxQuadMAV(mavlink, worker, sysid);
45 46
        // Set the system type
        mav->setSystemType((int)heartbeat->type);
47

48 49 50 51 52 53 54 55
        // Connect this robot to the UAS object
        // it is IMPORTANT here to use the right object type,
        // else the slot of the parent object is called (and thus the special
        // packets never reach their goal)
        connect(mavlink, SIGNAL(messageReceived(LinkInterface*, mavlink_message_t)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
        uas = mav;
    }
    break;
56 57 58 59 60 61 62 63 64 65 66 67 68 69
    case MAV_AUTOPILOT_PX4:
    {
        QGXPX4UAS* px4 = new QGXPX4UAS(mavlink, worker, sysid);
        // Set the system type
        px4->setSystemType((int)heartbeat->type);

        // Connect this robot to the UAS object
        // it is IMPORTANT here to use the right object type,
        // else the slot of the parent object is called (and thus the special
        // packets never reach their goal)
        connect(mavlink, SIGNAL(messageReceived(LinkInterface*, mavlink_message_t)), px4, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
        uas = px4;
    }
    break;
70
    case MAV_AUTOPILOT_SLUGS:
lm's avatar
lm committed
71
    {
72
        SlugsMAV* mav = new SlugsMAV(mavlink, worker, sysid);
73 74
        // Set the system type
        mav->setSystemType((int)heartbeat->type);
75

76 77 78 79 80 81 82 83
        // Connect this robot to the UAS object
        // it is IMPORTANT here to use the right object type,
        // else the slot of the parent object is called (and thus the special
        // packets never reach their goal)
        connect(mavlink, SIGNAL(messageReceived(LinkInterface*, mavlink_message_t)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
        uas = mav;
    }
    break;
84
    case MAV_AUTOPILOT_ARDUPILOTMEGA:
lm's avatar
lm committed
85
    {
86
        ArduPilotMegaMAV* mav = new ArduPilotMegaMAV(mavlink, worker, sysid);
87 88
        // Set the system type
        mav->setSystemType((int)heartbeat->type);
89

90 91 92 93 94 95 96 97
        // Connect this robot to the UAS object
        // it is IMPORTANT here to use the right object type,
        // else the slot of the parent object is called (and thus the special
        // packets never reach their goal)
        connect(mavlink, SIGNAL(messageReceived(LinkInterface*, mavlink_message_t)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
        uas = mav;
    }
    break;
oberion's avatar
oberion committed
98
#ifdef QGC_USE_SENSESOAR_MESSAGES
oberion's avatar
oberion committed
99 100
	case MAV_AUTOPILOT_SENSESOAR:
		{
101
            senseSoarMAV* mav = new senseSoarMAV(mavlink,worker, sysid);
oberion's avatar
oberion committed
102
			mav->setSystemType((int)heartbeat->type);
103 104 105

            mav->moveToThread(worker);

oberion's avatar
oberion committed
106 107 108 109
			connect(mavlink, SIGNAL(messageReceived(LinkInterface*, mavlink_message_t)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
			uas = mav;
			break;
		}
oberion's avatar
oberion committed
110
#endif
lm's avatar
lm committed
111 112
    default:
    {
113
        UAS* mav = new UAS(mavlink, worker, sysid);
114
        mav->setSystemType((int)heartbeat->type);
115

116 117 118 119 120 121 122 123
        // Connect this robot to the UAS object
        // it is IMPORTANT here to use the right object type,
        // else the slot of the parent object is called (and thus the special
        // packets never reach their goal)
        connect(mavlink, SIGNAL(messageReceived(LinkInterface*, mavlink_message_t)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
        uas = mav;
    }
    break;
124 125
    }

126 127 128 129
    // Get the UAS ready
    worker->start(QThread::HighPriority);
    connect(uas, SIGNAL(destroyed()), worker, SLOT(quit()));

130 131 132 133 134 135 136 137 138 139 140
    // Set the autopilot type
    uas->setAutopilotType((int)heartbeat->autopilot);

    // Make UAS aware that this link can be used to communicate with the actual robot
    uas->addLink(link);

    // Now add UAS to "official" list, which makes the whole application aware of it
    UASManager::instance()->addUAS(uas);

    return uas;
}