Commit 17aad9f5 authored by lm's avatar lm

Cleaned up old parameter interface, added initial support for other autopilots

parent ef4f860e
......@@ -111,8 +111,6 @@ HEADERS += src/MG.h \
src/ui/AudioOutputWidget.h \
src/GAudioOutput.h \
src/LogCompressor.h \
src/ui/param/ParamTreeItem.h \
src/ui/param/ParamTreeModel.h \
src/ui/QGCParamWidget.h \
src/ui/QGCSensorSettingsWidget.h \
src/ui/linechart/Linecharts.h \
......@@ -163,8 +161,6 @@ SOURCES += src/main.cc \
src/ui/AudioOutputWidget.cc \
src/GAudioOutput.cc \
src/LogCompressor.cc \
src/ui/param/ParamTreeItem.cc \
src/ui/param/ParamTreeModel.cc \
src/ui/QGCParamWidget.cc \
src/ui/QGCSensorSettingsWidget.cc \
src/ui/linechart/Linecharts.cc \
......
......@@ -42,6 +42,7 @@ This file is part of the PIXHAWK project
#include "UASManager.h"
#include "UASInterface.h"
#include "UAS.h"
#include "SlugsMAV.h" /* FIXME REMOVE */
#include "configuration.h"
#include "LinkManager.h"
#include <mavlink.h>
......@@ -131,6 +132,9 @@ void MAVLinkProtocol::receiveBytes(LinkInterface* link)
// First create new UAS object
uas = new UAS(this, message.sysid);
//uas = new SlugsMAV(this, message.sysid);
// Make UAS aware that this link can be used to communicate with the actual robot
uas->addLink(link);
// Connect this robot to the UAS object
......
......@@ -5,6 +5,7 @@
class ArduPilotMAV : public UAS
{
Q_OBJECT
public:
ArduPilotMAV(MAVLinkProtocol* mavlink, int id = 0);
};
......
......@@ -5,6 +5,7 @@
class PxQuadMAV : public UAS
{
Q_OBJECT
public:
PxQuadMAV(MAVLinkProtocol* mavlink, int id);
};
......
#include "SlugsMAV.h"
#include <QDebug>
SlugsMAV::SlugsMAV(MAVLinkProtocol* mavlink, int id) :
UAS(mavlink, id)//,
// Place other initializers here
......@@ -9,15 +11,19 @@ SlugsMAV::SlugsMAV(MAVLinkProtocol* mavlink, int id) :
void SlugsMAV::receiveMessage(LinkInterface* link, mavlink_message_t message)
{
// Let UAS handle the default message set
UAS::receiveMessage(link, message);
// Handle your special messages
switch (message.msgid)
{
case MAVLINK_MSG_ID_HEARTBEAT:
{
printf("RECEIVED HEARTBEAT");
qDebug() << "RECEIVED HEARTBEAT";
break;
}
default:
printf("\nSLUGS RECEIVED MESSAGE WITH ID %d", message.msgid);
qDebug() << "\nSLUGS RECEIVED MESSAGE WITH ID" << message.msgid;
break;
}
}
......@@ -5,6 +5,7 @@
class SlugsMAV : public UAS
{
Q_OBJECT
public:
SlugsMAV(MAVLinkProtocol* mavlink, int id = 0);
......
......@@ -398,8 +398,8 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message)
if (!unknownPackets.contains(message.msgid))
{
unknownPackets.append(message.msgid);
GAudioOutput::instance()->say("UNABLE TO DECODE MESSAGE WITH ID " + QString::number(message.msgid) + " FROM SYSTEM " + QString::number(message.sysid));
std::cerr << "Unable to decode message from system " << std::dec << static_cast<int>(message.sysid) << " with message id:" << static_cast<int>(message.msgid) << std::endl;
//GAudioOutput::instance()->say("UNABLE TO DECODE MESSAGE WITH ID " + QString::number(message.msgid) + " FROM SYSTEM " + QString::number(message.sysid));
std::cout << "Unable to decode message from system " << std::dec << static_cast<int>(message.sysid) << " with message id:" << static_cast<int>(message.msgid) << std::endl;
//qDebug() << std::cerr << "Unable to decode message from system " << std::dec << static_cast<int>(message.acid) << " with message id:" << static_cast<int>(message.msgid) << std::endl;
}
}
......
......@@ -196,7 +196,7 @@ void DebugConsole::updateTrafficMeasurements()
void DebugConsole::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
// Update bandwidth
if (holdOn)
{
......
......@@ -110,6 +110,7 @@ void HDDisplay::triggerUpdate()
void HDDisplay::paintEvent(QPaintEvent * event)
{
Q_UNUSED(event);
//paintGL();
static quint64 interval = 0;
qDebug() << "INTERVAL:" << MG::TIME::getGroundTimeNow() - interval << __FILE__ << __LINE__;
......@@ -123,7 +124,7 @@ void HDDisplay::paintGL()
void HDDisplay::paintDisplay()
{
int refreshInterval = 100;
quint64 refreshInterval = 100;
quint64 currTime = MG::TIME::getGroundTimeNow();
if (currTime - lastPaintTime < refreshInterval)
{
......
......@@ -78,6 +78,14 @@ void ObjectDetectionView::setUAS(UASInterface* uas)
void ObjectDetectionView::newDetection(int uasId, QString patternPath, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, double confidence, bool detected)
{
Q_UNUSED(x1);
Q_UNUSED(y1);
Q_UNUSED(x2);
Q_UNUSED(y2);
Q_UNUSED(x3);
Q_UNUSED(y3);
Q_UNUSED(x4);
Q_UNUSED(y4);
if (detected)
{
if (patternList.contains(patternPath))
......
......@@ -115,8 +115,7 @@ void WaypointList::setWaypoint(int uasId, int id, double x, double y, double z,
void WaypointList::waypointReached(UASInterface* uas, int waypointId)
{
qDebug() << "ENTERING WAYPOINT REACHED";
Q_UNUSED(uas);
if (waypoints.size() > waypointId)
{
if (waypoints[waypointId]->autocontinue == true)
......
/*=====================================================================
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 Implementation of class MainWindow
* @author Lorenz Meier <mavteam@student.ethz.ch>
*
*/
#include <QStringList>
#include "ParamTreeItem.h"
ParamTreeItem::ParamTreeItem(QString name, float value, ParamTreeItem* parent)
{
parentItem = parent;
paramName = name;
paramValue = value;
// Initialize empty itemData
itemData = QList<QVariant>();
}
ParamTreeItem::ParamTreeItem(const QList<QVariant> &data, ParamTreeItem *parent)
{
parentItem = parent;
itemData = data;
}
ParamTreeItem::~ParamTreeItem()
{
qDeleteAll(childItems);
}
void ParamTreeItem::appendChild(ParamTreeItem *item)
{
childItems.append(item);
}
ParamTreeItem *ParamTreeItem::child(int row)
{
return childItems.value(row);
}
int ParamTreeItem::childCount() const
{
return childItems.count();
}
int ParamTreeItem::columnCount() const
{
return 2;// itemData.count();
}
QString ParamTreeItem::getParamName()
{
return paramName;
}
float ParamTreeItem::getParamValue()
{
return paramValue;
}
QVariant ParamTreeItem::data(int column) const
{
if (itemData.empty())
{
QVariant ret;
switch (column)
{
case 0:
ret.setValue(paramName);
break;
case 1:
ret.setValue(paramValue);
break;
default:
ret.setValue(QString(""));
break;
}
return ret;
}
else
{
return itemData.value(column, QVariant(QString("")));
}
}
ParamTreeItem *ParamTreeItem::parent() const
{
return parentItem;
}
const QList<ParamTreeItem*>* ParamTreeItem::children() const
{
return &childItems;
}
int ParamTreeItem::row() const
{
if (parentItem)
return parentItem->childItems.indexOf(const_cast<ParamTreeItem*>(this));
return 0;
}
/*=====================================================================
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 Definition of class ParamTreeItem
* @author Lorenz Meier <mavteam@student.ethz.ch>
*
*/
#ifndef PARAMTREEITEM_H
#define PARAMTREEITEM_H
#include <QList>
#include <QVariant>
/**
* @brief One item in the onboard parameter tree
*/
class ParamTreeItem
{
public:
ParamTreeItem(QString name, float value, ParamTreeItem* parent = 0);
ParamTreeItem(const QList<QVariant> &data, ParamTreeItem *parent = 0);
~ParamTreeItem();
void appendChild(ParamTreeItem *child);
QString getParamName();
float getParamValue();
ParamTreeItem *child(int row);
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
int row() const;
ParamTreeItem *parent() const;
const QList<ParamTreeItem*>* children() const;
protected:
QString paramName;
float paramValue;
private:
QList<ParamTreeItem*> childItems;
QList<QVariant> itemData;
ParamTreeItem *parentItem;
};
#endif // PARAMTREEITEM_H
/*=====================================================================
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 Implementation of class ParamTreeModel
* @author Lorenz Meier <mavteam@student.ethz.ch>
*
*/
#include <QtGui>
#include "ParamTreeItem.h"
#include "ParamTreeModel.h"
ParamTreeModel::ParamTreeModel(QObject *parent)
: QAbstractItemModel(parent),
components()
{
QList<QVariant> rootData;
rootData << tr("Parameter") << tr("Value");
rootItem = new ParamTreeItem(rootData);
//String data = "IMU\n ROLL_K_I\t1.255\n PITCH_K_P\t0.621\n PITCH_K_I\t2.5545\n";
//setupModelData(data.split(QString("\n")), rootItem);
}
ParamTreeModel::ParamTreeModel(const QString &data, QObject *parent)
: QAbstractItemModel(parent),
components()
{
QList<QVariant> rootData;
rootData << tr("Parameter") << tr("Value");
rootItem = new ParamTreeItem(rootData);
setupModelData(data.split(QString("\n")), rootItem);
}
ParamTreeModel::~ParamTreeModel()
{
delete rootItem;
}
int ParamTreeModel::columnCount(const QModelIndex &parent) const
{
if (parent.isValid())
return static_cast<ParamTreeItem*>(parent.internalPointer())->columnCount();
else
return rootItem->columnCount();
}
QVariant ParamTreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role != Qt::DisplayRole)
return QVariant();
ParamTreeItem *item = static_cast<ParamTreeItem*>(index.internalPointer());
return item->data(index.column());
}
bool ParamTreeModel::setData (const QModelIndex & index, const QVariant & value, int role)
{
}
Qt::ItemFlags ParamTreeModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return 0;
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
}
QVariant ParamTreeModel::headerData(int section, Qt::Orientation orientation,
int role) const
{
if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
return rootItem->data(section);
return QVariant();
}
QModelIndex ParamTreeModel::index(int row, int column, const QModelIndex &parent)
const
{
if (!hasIndex(row, column, parent))
return QModelIndex();
ParamTreeItem *parentItem;
if (!parent.isValid())
parentItem = rootItem;
else
parentItem = static_cast<ParamTreeItem*>(parent.internalPointer());
ParamTreeItem *childItem = parentItem->child(row);
if (childItem)
return createIndex(row, column, childItem);
else
return QModelIndex();
}
QModelIndex ParamTreeModel::parent(const QModelIndex &index) const
{
if (!index.isValid())
return QModelIndex();
ParamTreeItem *childItem = static_cast<ParamTreeItem*>(index.internalPointer());
ParamTreeItem *parentItem = childItem->parent();
if (parentItem == rootItem)
return QModelIndex();
return createIndex(parentItem->row(), 0, parentItem);
}
int ParamTreeModel::rowCount(const QModelIndex &parent) const
{
ParamTreeItem *parentItem;
if (parent.column() > 0)
return 0;
if (!parent.isValid())
parentItem = rootItem;
else
parentItem = static_cast<ParamTreeItem*>(parent.internalPointer());
return parentItem->childCount();
}
ParamTreeItem* ParamTreeModel::getNodeForComponentId(int id)
{
return components.value(id);
}
void ParamTreeModel::appendComponent(int componentId, QString name)
{
if (!components.contains(componentId))
{
ParamTreeItem* item = new ParamTreeItem(name + QString("(#") + QString::number(componentId) + QString(")"), 0, rootItem);
components.insert(componentId, item);
}
}
void ParamTreeModel::appendComponent(int componentId)
{
if (!components.contains(componentId))
{
ParamTreeItem* item = new ParamTreeItem(QString("Component #") + QString::number(componentId) + QString(""), 0, rootItem);
components.insert(componentId, item);
}
//emit dataChanged();
}
void ParamTreeModel::appendParam(int componentId, QString name, float value)
{
// If component does not exist yet
if (!components.contains(componentId))
{
appendComponent(componentId);
}
ParamTreeItem* comp = components.value(componentId);
// FIXME Children may be double here
comp->appendChild(new ParamTreeItem(name, value, comp));
qDebug() << __FILE__ << __LINE__ << "Added param" << name << value << "for component" << comp->getParamName();
emit dataChanged(createIndex(0, 0, rootItem), createIndex(0, 0, rootItem));
}
void ParamTreeModel::setupModelData(const QStringList &lines, ParamTreeItem *parent)
{
QList<ParamTreeItem*> parents;
QList<int> indentations;
parents << parent;
indentations << 0;
int number = 0;
while (number < lines.count()) {
int position = 0;
while (position < lines[number].length()) {
if (lines[number].mid(position, 1) != " ")
break;
position++;
}
QString lineData = lines[number].mid(position).trimmed();
if (!lineData.isEmpty()) {
// Read the column data from the rest of the line.
QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts);
QList<QVariant> columnData;
for (int column = 0; column < columnStrings.count(); ++column)
columnData << columnStrings[column];
if (position > indentations.last()) {
// The last child of the current parent is now the new parent
// unless the current parent has no children.
if (parents.last()->childCount() > 0) {
parents << parents.last()->child(parents.last()->childCount()-1);
indentations << position;
}
} else {
while (position < indentations.last() && parents.count() > 0) {
parents.pop_back();
indentations.pop_back();
}
}
// Append a new item to the current parent's list of children.
parents.last()->appendChild(new ParamTreeItem(columnData, parents.last()));
}
number++;
}
}
/*=====================================================================
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 Definition of class ParamParamTreeModel
* @author Lorenz Meier <mavteam@student.ethz.ch>
*
*/
#ifndef PARAMTREEMODEL_H
#define PARAMTREEMODEL_H
#include <QAbstractItemModel>
#include <QModelIndex>
#include <QVariant>
class ParamTreeItem;
class ParamTreeModel : public QAbstractItemModel
{
Q_OBJECT
public:
ParamTreeModel(QObject *parent = 0);
ParamTreeModel(const QString &data, QObject *parent = 0);
~ParamTreeModel();
QVariant data(const QModelIndex &index, int role) const;
bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole );
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const;
QModelIndex index(int row, int column,
const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &index) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
public slots:
/** @brief Add a new parameter */
void appendParam(int componentId, QString name, float value);
/** @brief Add a new component for this system */
void appendComponent(int componentId, QString name);
/** @brief Add a new component for this system */
void appendComponent(int componentId);
protected:
ParamTreeItem* getNodeForComponentId(int id);
QMap<int, ParamTreeItem*> components;
private:
void setupModelData(const QStringList &lines, ParamTreeItem *parent);
ParamTreeItem *rootItem;
};
#endif // PARAMParamTreeModel_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