diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configccpmwidget.cpp b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configccpmwidget.cpp index 4a6ca62a9..a7e46eb83 100644 --- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configccpmwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configccpmwidget.cpp @@ -554,7 +554,7 @@ void ConfigCcpmWidget::updateThrottleCurveValue(QList curveValues0,doubl for (i=0; iCurveSettings->item(i, 1 )->text().toDouble(); + CurrentValue=m_ccpm->CurveSettings->item(i, 0 )->text().toDouble(); if (CurrentValue!=internalCurveValues[i]) { m_ccpm->CurveSettings->item(i, 0)->setText(QString().sprintf("%.3f",internalCurveValues.at(i))); @@ -1224,11 +1224,10 @@ void ConfigCcpmWidget::setMixer() } //get the user data for the curve into the mixer settings - for (i=0;i<5;i++) + for (i=0;i<5;i++) { mixerSettingsData.ThrottleCurve1[i] = m_ccpm->CurveSettings->item(i, 0)->text().toDouble(); - - for (i=0;i<5;i++) mixerSettingsData.ThrottleCurve2[i] = m_ccpm->CurveSettings->item(i, 1)->text().toDouble(); + } //mapping of collective input to curve 2... //MixerSettings.Curve2Source = Throttle,Roll,Pitch,Yaw,Accessory0,Accessory1,Accessory2,Accessory3,Accessory4,Accessory5 diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 4a2130b26..ba1dbb74e 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -46,7 +46,7 @@ #define STICK_MIN_MOVE -8 #define STICK_MAX_MOVE 8 -ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent),wizardStep(wizardNone),loop(NULL),skipflag(false),transmitterType(heli) +ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent),wizardStep(wizardNone),transmitterType(heli),loop(NULL),skipflag(false) { manualCommandObj = ManualControlCommand::GetInstance(getObjectManager()); manualSettingsObj = ManualControlSettings::GetInstance(getObjectManager()); diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h index 76d6b55bd..3cac0abc0 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h @@ -84,7 +84,7 @@ public: }; ConfigTaskWidget(QWidget *parent = 0); - ~ConfigTaskWidget(); + virtual ~ConfigTaskWidget(); void disableMouseWheelEvents(); bool eventFilter( QObject * obj, QEvent * evt ); diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvepoint.cpp b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvepoint.cpp index 6eaa8f5ed..64b9912b1 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvepoint.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvepoint.cpp @@ -43,6 +43,7 @@ Node::Node(MixerCurveWidget *graphWidget) setCacheMode(DeviceCoordinateCache); setZValue(-1); vertical = false; + value = 0; } void Node::addEdge(Edge *edge) @@ -98,6 +99,15 @@ void Node::verticalMove(bool flag){ vertical = flag; } +double Node::getValue() { + return value; +} + +void Node::setValue(double val) { + value = val; +} + + QVariant Node::itemChange(GraphicsItemChange change, const QVariant &value) { @@ -117,11 +127,19 @@ QVariant Node::itemChange(GraphicsItemChange change, const QVariant &value) newPos.setY(h); return newPos; } - case ItemPositionHasChanged: + case ItemPositionHasChanged: { foreach (Edge *edge, edgeList) edge->adjust(); - graph->itemMoved((h-newPos.y())/h); + + double min = graph->getMin(); + double range = graph->getMax() - min; + double ratio = (h - newPos.y()) / h; + double val = (range * ratio ) + min; + setValue(val); + + graph->itemMoved(val); break; + } default: break; }; diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvepoint.h b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvepoint.h index 987875e32..19b940625 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvepoint.h +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvepoint.h @@ -48,12 +48,16 @@ public: enum { Type = UserType + 1 }; int type() const { return Type; } + void verticalMove(bool flag); QRectF boundingRect() const; QPainterPath shape() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + void setValue(double val); + double getValue(); + protected: QVariant itemChange(GraphicsItemChange change, const QVariant &value); @@ -61,6 +65,8 @@ protected: void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); private: + + double value; QList edgeList; QPointF newPos; MixerCurveWidget *graph; diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvewidget.cpp b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvewidget.cpp index f21d782f6..56ed8bee9 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvewidget.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvewidget.cpp @@ -32,8 +32,6 @@ #include #include - - /* * Initialize the widget */ @@ -74,11 +72,48 @@ MixerCurveWidget::MixerCurveWidget(QWidget *parent) : QGraphicsView(parent) scene->setSceneRect(plot->boundingRect()); setScene(scene); + initNodes(MixerCurveWidget::NODE_NUMELEM); } MixerCurveWidget::~MixerCurveWidget() { + for (int i=0; i= 0 && index < nodePool.count()) + { + node = nodePool.at(index); + } + else { + node = new Node(this); + nodePool.append(node); + } + return node; +} + +Edge* MixerCurveWidget::getEdge(int index, Node* sourceNode, Node* destNode) +{ + Edge* edge; + + if (index >= 0 && index < edgePool.count()) + { + edge = edgePool.at(index); + edge->setSourceNode(sourceNode); + edge->setDestNode(destNode); + } + else { + edge = new Edge(sourceNode,destNode); + edgePool.append(edge); + } + return edge; } /** @@ -89,60 +124,62 @@ MixerCurveWidget::~MixerCurveWidget() */ void MixerCurveWidget::initCurve(QList points) { - if (points.length() < 2) return; // We need at least 2 points on a curve! - // First of all, reset the list - // TODO: one edge might not get deleted properly, small mem leak maybe... + if (nodeList.count() != points.count()) + initNodes(points.count()); + + // finally, set node positions + setCurve(points); +} + +void MixerCurveWidget::initNodes(int numPoints) +{ + // First of all, clear any existing list + if (nodeList.count()) { foreach (Node *node, nodeList ) { QList edges = node->edges(); foreach(Edge *edge, edges) { - if (scene()->items().contains(edge)) - scene()->removeItem(edge); - else + if (edge->destNode() == node) { delete edge; + } + else { + scene()->removeItem(edge); + } } - scene()->removeItem(node); - delete node; - } - nodeList.clear(); + scene()->removeItem(node); + } + + nodeList.clear(); + } + + // Create the nodes and edges + Node* prevNode = 0; + for (int i=0; iboundingRect().width()/(points.length()-1); - qreal h = plot->boundingRect().height(); - for (int i=0; iaddItem(node); nodeList.append(node); - double val = points.at(i); - if (val>curveMax) - val=curveMax; - if (valsetPos(w*i,h-val*h); - node->verticalMove(true); - } + scene()->addItem(node); - // ... and link them together: - for (int i=0; i<(points.length()-1); i++) { - scene()->addItem(new Edge(nodeList.at(i),nodeList.at(i+1))); - } + if (prevNode) { + scene()->addItem(getEdge(i, prevNode, node)); + } + prevNode = node; + } } - /** Returns the current curve settings */ QList MixerCurveWidget::getCurve() { + QList list; - qreal h = plot->boundingRect().height(); foreach(Node *node, nodeList) { - list.append(((curveMax-curveMin)*(h-node->pos().y())/h)+curveMin); + list.append(node->getValue()); } return list; @@ -150,11 +187,15 @@ QList MixerCurveWidget::getCurve() { /** Sets a linear graph */ -void MixerCurveWidget::initLinearCurve(quint32 numPoints, double maxValue) +void MixerCurveWidget::initLinearCurve(quint32 numPoints, double maxValue, double minValue) { + Q_UNUSED(maxValue); + Q_UNUSED(minValue); + QList points; for (double i=0; i points) { - if (nodeList.length()<1) - { - initCurve(points); - } - else - { - qreal w = plot->boundingRect().width()/(points.length()-1); - qreal h = plot->boundingRect().height(); - for (int i=0; icurveMax) - val=curveMax; - if (valsetPos(w*i,h-val*h); - } + curveUpdating = true; + + if (nodeList.count() != points.count()) + initNodes(points.count()); + + double min = curveMin + 10; + double max = curveMax + 10; + + qreal w = plot->boundingRect().width()/(points.count()-1); + qreal h = plot->boundingRect().height(); + for (int i=0; i curveMax) + val = curveMax; + + val += 10; + val -= min; + val /= (max - min); + + nodeList.at(i)->setPos(w*i, h - (val*h)); + nodeList.at(i)->verticalMove(true); } + + curveUpdating = false; + + emit curveUpdated(points, (double)0); } @@ -205,8 +256,10 @@ void MixerCurveWidget::resizeEvent(QResizeEvent* event) void MixerCurveWidget::itemMoved(double itemValue) { - QList list = getCurve(); - emit curveUpdated(list, itemValue); + if (!curveUpdating) { + QList list = getCurve(); + emit curveUpdated(list, itemValue); + } } void MixerCurveWidget::setMin(double value) @@ -217,6 +270,14 @@ void MixerCurveWidget::setMax(double value) { curveMax = value; } +double MixerCurveWidget::getMin() +{ + return curveMin; +} +double MixerCurveWidget::getMax() +{ + return curveMax; +} void MixerCurveWidget::setRange(double min, double max) { curveMin = min; diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvewidget.h b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvewidget.h index 9a14123a7..92c9c3a8c 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvewidget.h +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/mixercurvewidget.h @@ -31,6 +31,7 @@ #include #include #include +#include #include "mixercurvepoint.h" #include "mixercurveline.h" #include "uavobjectwidgetutils_global.h" @@ -45,12 +46,16 @@ public: void itemMoved(double itemValue); // Callback when a point is moved, to be updated void initCurve (QList points); QList getCurve(); - void initLinearCurve(quint32 numPoints, double maxValue); + void initLinearCurve(quint32 numPoints, double maxValue = 1, double minValue = 0); void setCurve(QList); void setMin(double value); + double getMin(); void setMax(double value); + double getMax(); void setRange(double min, double max); + static const int NODE_NUMELEM = 5; + signals: void curveUpdated(QList, double ); @@ -58,9 +63,19 @@ private slots: private: QGraphicsSvgItem *plot; + + QList nodePool; + QList edgePool; QList nodeList; + QList points; + double curveMin; double curveMax; + bool curveUpdating; + + void initNodes(int numPoints); + Node* getNode(int index); + Edge* getEdge(int index, Node* sourceNode, Node* destNode); protected: void showEvent(QShowEvent *event);