QGCMAVLinkUASFactory.cc 3.66 KB
Newer Older
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 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
#include "QGCMAVLinkUASFactory.h"
#include "UASManager.h"

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

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

    if (parent != NULL)
    {
        p = parent;
    }
    else
    {
        p = mavlink;
    }

    UASInterface* uas;

    switch (heartbeat->autopilot)
    {
    case MAV_AUTOPILOT_GENERIC:
        {
        UAS* mav = new UAS(mavlink, sysid);
        // Set the system type
        mav->setSystemType((int)heartbeat->type);
        // Connect this robot to the UAS object
        connect(mavlink, SIGNAL(messageReceived(LinkInterface*, mavlink_message_t)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
        uas = mav;
        }
        break;
    case MAV_AUTOPILOT_PIXHAWK:
        {
            PxQuadMAV* mav = new PxQuadMAV(mavlink, sysid);
            // Set the system type
            mav->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)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
            uas = mav;
        }
        break;
    case MAV_AUTOPILOT_SLUGS:
        {
            SlugsMAV* mav = new SlugsMAV(mavlink, sysid);
            // Set the system type
            mav->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)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
            uas = mav;
        }
        break;
    case MAV_AUTOPILOT_ARDUPILOTMEGA:
        {
            ArduPilotMegaMAV* mav = new ArduPilotMegaMAV(mavlink, sysid);
            // Set the system type
            mav->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)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
            uas = mav;
        }
        break;
    default:
        {
            UAS* mav = new UAS(mavlink, sysid);
            mav->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)), mav, SLOT(receiveMessage(LinkInterface*, mavlink_message_t)));
            uas = mav;
        }
        break;
    }

    // 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;
}