Commit 889c9769 authored by pixhawk's avatar pixhawk

Working on plugin system to simplify build dependencies between QGroundControl and MAVLink

parent 81590ac9
...@@ -25,21 +25,6 @@ ...@@ -25,21 +25,6 @@
# #
#------------------------------------------------- #-------------------------------------------------
QT += network opengl svg xml phonon
TEMPLATE = app
TARGET = qgroundcontrol
BASEDIR = .
BUILDDIR = build
LANGUAGE = C++
CONFIG += debug_and_release console
OBJECTS_DIR = $$BUILDDIR/obj
MOC_DIR = $$BUILDDIR/moc
UI_HEADERS_DIR = src/ui/generated
#$$BASEDIR/lib/qextserialport/include #$$BASEDIR/lib/qextserialport/include
# $$BASEDIR/lib/openjaus/libjaus/include \ # $$BASEDIR/lib/openjaus/libjaus/include \
# $$BASEDIR/lib/openjaus/libopenJaus/include # $$BASEDIR/lib/openjaus/libopenJaus/include
......
...@@ -8,6 +8,22 @@ ...@@ -8,6 +8,22 @@
include(lib/QMapControl/QMapControl.pri) include(lib/QMapControl/QMapControl.pri)
message("Including bundled QMapControl version as FALLBACK. This is fine on Linux and MacOS, but not the best choice in Windows") message("Including bundled QMapControl version as FALLBACK. This is fine on Linux and MacOS, but not the best choice in Windows")
QT += network opengl svg xml phonon
TEMPLATE = app
TARGET = qgroundcontrol
BASEDIR = .
BUILDDIR = build
LANGUAGE = C++
CONFIG += debug_and_release console
OBJECTS_DIR = $$BUILDDIR/obj
MOC_DIR = $$BUILDDIR/moc
UI_HEADERS_DIR = src/ui/generated
# } # }
# Include general settings for MAVGround # Include general settings for MAVGround
# necessary as last include to override any non-acceptable settings # necessary as last include to override any non-acceptable settings
...@@ -22,7 +38,8 @@ include(src/lib/qextserialport/qextserialport.pri) ...@@ -22,7 +38,8 @@ include(src/lib/qextserialport/qextserialport.pri)
include(src/lib/qwt/qwt.pri) include(src/lib/qwt/qwt.pri)
DEPENDPATH += . \ DEPENDPATH += . \
lib/QMapControl \ lib/QMapControl \
lib/QMapControl/src lib/QMapControl/src \
plugins
INCLUDEPATH += . \ INCLUDEPATH += . \
lib/QMapControl \ lib/QMapControl \
../mavlink/include \ ../mavlink/include \
......
...@@ -164,7 +164,42 @@ void Core::startLinkManager() ...@@ -164,7 +164,42 @@ void Core::startLinkManager()
**/ **/
void Core::startUASManager() void Core::startUASManager()
{ {
UASManager::instance(); // Load UAS plugins
QDir pluginsDir = QDir(qApp->applicationDirPath());
#if defined(Q_OS_WIN)
if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
pluginsDir.cdUp();
#elif defined(Q_OS_LINUX)
if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
pluginsDir.cdUp();
#elif defined(Q_OS_MAC)
if (pluginsDir.dirName() == "MacOS")
{
pluginsDir.cdUp();
pluginsDir.cdUp();
pluginsDir.cdUp();
}
#endif
pluginsDir.cd("plugins");
UASManager* m = UASManager::instance();
// Load plugins
QStringList pluginFileNames;
foreach (QString fileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
if (plugin)
{
//populateMenus(plugin);
pluginFileNames += fileName;
printf(QString("Loaded plugin from " + fileName + "\n").toStdString().c_str());
}
}
} }
moc_*
*.o
Makefile
Makefile.Debug
Makefile.Release
#include "PxMAV.h"
#include <QtCore>
PxMAV::PxMAV() :
UAS(NULL, 0)
{
}
PxMAV::PxMAV(MAVLinkProtocol* mavlink, int id) :
UAS(mavlink, id)
{
}
/**
* This function is called by MAVLink once a complete, uncorrupted (CRC check valid)
* mavlink packet is received.
*
* @param link Hardware link the message came from (e.g. /dev/ttyUSB0 or UDP port).
* messages can be sent back to the system via this link
* @param message MAVLink message, as received from the MAVLink protocol stack
*/
void PxMAV::receiveMessage(LinkInterface* link, mavlink_message_t message)
{
// Let UAS handle the default message set
UAS::receiveMessage(link, message);
mavlink_message_t* msg = &message;
//qDebug() << "PX RECEIVED" << msg->sysid << msg->compid << msg->msgid;
// Handle your special messages
switch (msg->msgid)
{
case MAVLINK_MSG_ID_WATCHDOG_HEARTBEAT:
{
mavlink_watchdog_heartbeat_t payload;
mavlink_msg_watchdog_heartbeat_decode(msg, &payload);
emit watchdogReceived(this->uasId, payload.watchdog_id, payload.process_count);
}
break;
case MAVLINK_MSG_ID_WATCHDOG_PROCESS_INFO:
{
mavlink_watchdog_process_info_t payload;
mavlink_msg_watchdog_process_info_decode(msg, &payload);
emit processReceived(this->uasId, payload.watchdog_id, payload.process_id, QString((const char*)payload.name), QString((const char*)payload.arguments), payload.timeout);
}
break;
case MAVLINK_MSG_ID_WATCHDOG_PROCESS_STATUS:
{
mavlink_watchdog_process_status_t payload;
mavlink_msg_watchdog_process_status_decode(msg, &payload);
emit processChanged(this->uasId, payload.watchdog_id, payload.process_id, payload.state, (payload.muted == 1) ? true : false, payload.crashes, payload.pid);
}
break;
case MAVLINK_MSG_ID_DEBUG_VECT:
{
mavlink_debug_vect_t vect;
mavlink_msg_debug_vect_decode(msg, &vect);
QString str((const char*)vect.name);
emit valueChanged(uasId, str+".x", vect.x, MG::TIME::getGroundTimeNow());
emit valueChanged(uasId, str+".y", vect.y, MG::TIME::getGroundTimeNow());
emit valueChanged(uasId, str+".z", vect.z, MG::TIME::getGroundTimeNow());
}
break;
case MAVLINK_MSG_ID_VISION_POSITION_ESTIMATE:
{
mavlink_vision_position_estimate_t pos;
mavlink_msg_vision_position_estimate_decode(&message, &pos);
quint64 time = getUnixTime(pos.usec);
emit valueChanged(uasId, "vis. time", pos.usec, time);
emit valueChanged(uasId, "vis. roll", pos.roll, time);
emit valueChanged(uasId, "vis. pitch", pos.pitch, time);
emit valueChanged(uasId, "vis. yaw", pos.yaw, time);
emit valueChanged(uasId, "vis. x", pos.x, time);
emit valueChanged(uasId, "vis. y", pos.y, time);
emit valueChanged(uasId, "vis. z", pos.z, time);
emit valueChanged(uasId, "vis. vx", pos.vx, time);
emit valueChanged(uasId, "vis. vy", pos.vy, time);
emit valueChanged(uasId, "vis. vz", pos.vz, time);
emit valueChanged(uasId, "vis. vyaw", pos.vyaw, time);
// Set internal state
if (!positionLock)
{
// If position was not locked before, notify positive
// GAudioOutput::instance()->notifyPositive();
}
positionLock = true;
}
break;
default:
// Do nothing
break;
}
}
void PxMAV::sendProcessCommand(int watchdogId, int processId, unsigned int command)
{
mavlink_watchdog_command_t payload;
payload.target_system_id = uasId;
payload.watchdog_id = watchdogId;
payload.process_id = processId;
payload.command_id = (uint8_t)command;
mavlink_message_t msg;
mavlink_msg_watchdog_command_encode(mavlink->getSystemId(), mavlink->getComponentId(), &msg, &payload);
sendMessage(msg);
}
Q_EXPORT_PLUGIN2(pixhawk_plugins, PxMAV)
#ifndef PXMAV_H
#define PXMAV_H
#include "UAS.h"
class PxMAV : public UAS
{
Q_OBJECT
Q_INTERFACES(UASInterface)
public:
PxMAV(MAVLinkProtocol* mavlink, int id);
PxMAV();
public slots:
/** @brief Receive a MAVLink message from this MAV */
void receiveMessage(LinkInterface* link, mavlink_message_t message);
/** @brief Send a command to an onboard process */
void sendProcessCommand(int watchdogId, int processId, unsigned int command);
signals:
void watchdogReceived(int systemId, int watchdogId, unsigned int processCount);
void processReceived(int systemId, int watchdogId, int processId, QString name, QString arguments, int timeout);
void processChanged(int systemId, int watchdogId, int processId, int state, bool muted, int crashed, int pid);
};
#endif // PXMAV_H
# This plugin is also identified by this line in PxMAV.cc
# Q_EXPORT_PLUGIN2(pixhawk_plugins, PxMAV)
include(../../qgroundcontrol.pri)
TEMPLATE = lib
CONFIG += plugin
QT += phonon
INCLUDEPATH += ../. \
../../../mavlink/include \
../../MAVLink/include \
../../mavlink/include \
../uas \
../comm
HEADERS = PxMAV.h
SOURCES = PxMAV.cc \
../uas/UAS.cc \
../GAudioOutput.cc \
../comm/MAVLinkProtocol.cc \
../uas/UASManager.cc
TARGET = $$qtLibraryTarget(pixhawk_plugins)
DESTDIR = ../../plugins
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
class PxQuadMAV : public UAS class PxQuadMAV : public UAS
{ {
Q_OBJECT Q_OBJECT
Q_INTERFACES(UASInterface)
public: public:
PxQuadMAV(MAVLinkProtocol* mavlink, int id); PxQuadMAV(MAVLinkProtocol* mavlink, int id);
public slots: public slots:
......
...@@ -43,7 +43,7 @@ This file is part of the PIXHAWK project ...@@ -43,7 +43,7 @@ This file is part of the PIXHAWK project
#include "MAVLinkProtocol.h" #include "MAVLinkProtocol.h"
#include <mavlink.h> #include <mavlink.h>
UAS::UAS(MAVLinkProtocol* protocol, int id) : UAS::UAS(MAVLinkProtocol* protocol, int id) : UASInterface(),
uasId(id), uasId(id),
startTime(MG::TIME::getGroundTimeNow()), startTime(MG::TIME::getGroundTimeNow()),
commStatus(COMM_DISCONNECTED), commStatus(COMM_DISCONNECTED),
...@@ -73,6 +73,7 @@ UAS::UAS(MAVLinkProtocol* protocol, int id) : ...@@ -73,6 +73,7 @@ UAS::UAS(MAVLinkProtocol* protocol, int id) :
positionLock(false), positionLock(false),
statusTimeout(new QTimer(this)) statusTimeout(new QTimer(this))
{ {
color = UASInterface::getNextColor();
setBattery(LIPOLY, 3); setBattery(LIPOLY, 3);
statusTimeout->setInterval(500); statusTimeout->setInterval(500);
connect(statusTimeout, SIGNAL(timeout()), this, SLOT(updateState())); connect(statusTimeout, SIGNAL(timeout()), this, SLOT(updateState()));
......
...@@ -51,10 +51,6 @@ class UASInterface : public QObject ...@@ -51,10 +51,6 @@ class UASInterface : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
UASInterface() :
color(UASInterface::getNextColor())
{
}
virtual ~UASInterface() {} virtual ~UASInterface() {}
/* MANAGEMENT */ /* MANAGEMENT */
...@@ -312,4 +308,6 @@ signals: ...@@ -312,4 +308,6 @@ signals:
void systemTypeSet(UASInterface* uas, unsigned int type); void systemTypeSet(UASInterface* uas, unsigned int type);
}; };
Q_DECLARE_INTERFACE(UASInterface, "org.qgroundcontrol/1.0");
#endif // _UASINTERFACE_H_ #endif // _UASINTERFACE_H_
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment