From 3c49944e73b9c0f7b32a5a35a3e991b533af84b3 Mon Sep 17 00:00:00 2001 From: pip Date: Fri, 28 Jan 2011 20:45:45 +0000 Subject: [PATCH] Added OpenGL option to the "Dial" and "LinearDial" plugins. git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2613 ebee16cc-31ac-478f-84a7-5cbb03baadba --- ground/openpilotgcs/src/plugins/dial/dial.pro | 1 + .../src/plugins/dial/dialgadget.cpp | 142 +- .../plugins/dial/dialgadgetconfiguration.cpp | 331 ++-- .../plugins/dial/dialgadgetconfiguration.h | 282 +-- .../plugins/dial/dialgadgetoptionspage.cpp | 549 +++--- .../src/plugins/dial/dialgadgetoptionspage.ui | 1610 +++++++++-------- .../src/plugins/dial/dialgadgetwidget.cpp | 1258 ++++++------- .../src/plugins/dial/dialgadgetwidget.h | 301 +-- .../src/plugins/lineardial/lineardial.pro | 1 + .../plugins/lineardial/lineardialgadget.cpp | 121 +- .../lineardialgadgetconfiguration.cpp | 235 +-- .../lineardialgadgetconfiguration.h | 213 +-- .../lineardialgadgetoptionspage.cpp | 412 ++--- .../lineardial/lineardialgadgetoptionspage.ui | 1071 +++++------ .../lineardial/lineardialgadgetwidget.cpp | 874 ++++----- .../lineardial/lineardialgadgetwidget.h | 247 +-- 16 files changed, 3870 insertions(+), 3778 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/dial/dial.pro b/ground/openpilotgcs/src/plugins/dial/dial.pro index 4ad150f45..d2956921f 100644 --- a/ground/openpilotgcs/src/plugins/dial/dial.pro +++ b/ground/openpilotgcs/src/plugins/dial/dial.pro @@ -1,6 +1,7 @@ TEMPLATE = lib TARGET = DialGadget QT += svg +QT += opengl include(../../openpilotgcsplugin.pri) include(../../plugins/coreplugin/coreplugin.pri) include(dial_dependencies.pri) diff --git a/ground/openpilotgcs/src/plugins/dial/dialgadget.cpp b/ground/openpilotgcs/src/plugins/dial/dialgadget.cpp index 4e7c6a30a..7ce31bf32 100644 --- a/ground/openpilotgcs/src/plugins/dial/dialgadget.cpp +++ b/ground/openpilotgcs/src/plugins/dial/dialgadget.cpp @@ -1,70 +1,72 @@ -/** - ****************************************************************************** - * - * @file dialgadget.cpp - * @author Edouard Lafargue and David Carlson Copyright (C) 2010. - * @see The GNU Public License (GPL) Version 3 - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup DialPlugin Dial Plugin - * @{ - * @brief Plots flight information rotary style dials - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "dialgadget.h" -#include "dialgadgetwidget.h" -#include "dialgadgetconfiguration.h" - -DialGadget::DialGadget(QString classId, DialGadgetWidget *widget, QWidget *parent) : - IUAVGadget(classId, parent), - m_widget(widget) -{ -} - -DialGadget::~DialGadget() -{ -} - -/* - This is called when a configuration is loaded, and updates the plugin's settings. - Careful: the plugin is already drawn before the loadConfiguration method is called the - first time, so you have to be careful not to assume all the plugin values are initialized - the first time you use them - */ -void DialGadget::loadConfiguration(IUAVGadgetConfiguration* config) -{ - DialGadgetConfiguration *m = qobject_cast(config); - m_widget->setDialFile(m->dialFile(), m->dialBackground(), m->dialForeground(), m->dialNeedle1(), - m->dialNeedle2(),m->dialNeedle3(),m->getN1Move(), m->getN2Move(), - m->getN3Move()); - - m_widget->setN1Min(m->getN1Min()); - m_widget->setN1Max(m->getN1Max()); - m_widget->setN1Factor(m->getN1Factor()); - m_widget->setN2Min(m->getN2Min()); - m_widget->setN2Max(m->getN2Max()); - m_widget->setN2Factor(m->getN2Factor()); - m_widget->setN3Min(m->getN3Min()); - m_widget->setN3Max(m->getN3Max()); - m_widget->setN3Factor(m->getN3Factor()); - m_widget->setDialFont(m->getFont()); - m_widget->connectNeedles(m->getN1DataObject(),m->getN1ObjField(), - m->getN2DataObject(),m->getN2ObjField(), - m->getN3DataObject(),m->getN3ObjField() - ); -} +/** + ****************************************************************************** + * + * @file dialgadget.cpp + * @author Edouard Lafargue and David Carlson Copyright (C) 2010. + * @see The GNU Public License (GPL) Version 3 + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup DialPlugin Dial Plugin + * @{ + * @brief Plots flight information rotary style dials + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "dialgadget.h" +#include "dialgadgetwidget.h" +#include "dialgadgetconfiguration.h" + +DialGadget::DialGadget(QString classId, DialGadgetWidget *widget, QWidget *parent) : + IUAVGadget(classId, parent), + m_widget(widget) +{ +} + +DialGadget::~DialGadget() +{ +} + +/* + This is called when a configuration is loaded, and updates the plugin's settings. + Careful: the plugin is already drawn before the loadConfiguration method is called the + first time, so you have to be careful not to assume all the plugin values are initialized + the first time you use them + */ +void DialGadget::loadConfiguration(IUAVGadgetConfiguration* config) +{ + DialGadgetConfiguration *m = qobject_cast(config); + m_widget->setDialFile(m->dialFile(), m->dialBackground(), m->dialForeground(), m->dialNeedle1(), + m->dialNeedle2(),m->dialNeedle3(),m->getN1Move(), m->getN2Move(), + m->getN3Move()); + + m_widget->enableOpenGL(m->useOpenGL()); + + m_widget->setN1Min(m->getN1Min()); + m_widget->setN1Max(m->getN1Max()); + m_widget->setN1Factor(m->getN1Factor()); + m_widget->setN2Min(m->getN2Min()); + m_widget->setN2Max(m->getN2Max()); + m_widget->setN2Factor(m->getN2Factor()); + m_widget->setN3Min(m->getN3Min()); + m_widget->setN3Max(m->getN3Max()); + m_widget->setN3Factor(m->getN3Factor()); + m_widget->setDialFont(m->getFont()); + m_widget->connectNeedles(m->getN1DataObject(),m->getN1ObjField(), + m->getN2DataObject(),m->getN2ObjField(), + m->getN3DataObject(),m->getN3ObjField() + ); +} diff --git a/ground/openpilotgcs/src/plugins/dial/dialgadgetconfiguration.cpp b/ground/openpilotgcs/src/plugins/dial/dialgadgetconfiguration.cpp index 8d3a69760..fe052e617 100644 --- a/ground/openpilotgcs/src/plugins/dial/dialgadgetconfiguration.cpp +++ b/ground/openpilotgcs/src/plugins/dial/dialgadgetconfiguration.cpp @@ -1,163 +1,168 @@ -/** - ****************************************************************************** - * - * @file dialgadgetconfiguration.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @see The GNU Public License (GPL) Version 3 - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup DialPlugin Dial Plugin - * @{ - * @brief Plots flight information rotary style dials - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "dialgadgetconfiguration.h" -#include "utils/pathutils.h" - -/** - * Loads a saved configuration or defaults if non exist. - * - */ -DialGadgetConfiguration::DialGadgetConfiguration(QString classId, QSettings* qSettings, QObject *parent) : - IUAVGadgetConfiguration(classId, parent), - m_defaultDial("Unknown"), - dialBackgroundID("background"), - dialForegroundID("foreground"), - dialNeedleID1("needle"), - dialNeedleID2("needle2"), - dialNeedleID3("needle3"), - needle1MinValue(0), - needle1MaxValue(100), - needle2MinValue(0), - needle2MaxValue(100), - needle3MinValue(0), - needle3MaxValue(100), - needle1Factor(1), - needle2Factor(1), - needle3Factor(1), - needle1Move("Rotate"), - needle2Move("Rotate"), - needle3Move("Rotate") -{ - //if a saved configuration exists load it - if(qSettings != 0) { - QString dialFile = qSettings->value("dialFile").toString(); - - m_defaultDial=Utils::PathUtils().InsertDataPath(dialFile); - dialBackgroundID = qSettings->value("dialBackgroundID").toString(); - dialForegroundID = qSettings->value("dialForegroundID").toString(); - dialNeedleID1 = qSettings->value("dialNeedleID1").toString(); - dialNeedleID2 = qSettings->value("dialNeedleID2").toString(); - dialNeedleID3 = qSettings->value("dialNeedleID3").toString(); - needle1MinValue = qSettings->value("needle1MinValue").toDouble(); - needle1MaxValue = qSettings->value("needle1MaxValue").toDouble(); - needle2MinValue = qSettings->value("needle2MinValue").toDouble(); - needle2MaxValue = qSettings->value("needle2MaxValue").toDouble(); - needle3MinValue = qSettings->value("needle3MinValue").toDouble(); - needle3MaxValue = qSettings->value("needle3MaxValue").toDouble(); - needle1DataObject = qSettings->value("needle1DataObject").toString(); - needle1ObjectField = qSettings->value("needle1ObjectField").toString(); - needle2DataObject = qSettings->value("needle2DataObject").toString(); - needle2ObjectField = qSettings->value("needle2ObjectField").toString(); - needle3DataObject = qSettings->value("needle3DataObject").toString(); - needle3ObjectField = qSettings->value("needle3ObjectField").toString(); - needle1Factor = qSettings->value("needle1Factor").toDouble(); - needle2Factor = qSettings->value("needle2Factor").toDouble(); - needle3Factor = qSettings->value("needle3Factor").toDouble(); - needle1Move = qSettings->value("needle1Move").toString(); - needle2Move = qSettings->value("needle2Move").toString(); - needle3Move = qSettings->value("needle3Move").toString(); - font = qSettings->value("font").toString(); - } -} - -/** - * Clones a configuration. - * - */ -IUAVGadgetConfiguration *DialGadgetConfiguration::clone() -{ - DialGadgetConfiguration *m = new DialGadgetConfiguration(this->classId()); - m->m_defaultDial=m_defaultDial; - m->setDialBackgroundID(dialBackgroundID); - m->setDialForegroundID(dialForegroundID); - m->setDialNeedleID1(dialNeedleID1); - m->setDialNeedleID2(dialNeedleID2); - m->setDialNeedleID3(dialNeedleID3); - m->setN1Min(needle1MinValue); - m->setN1Max(needle1MaxValue); - m->setN2Min(needle2MinValue); - m->setN2Max(needle2MaxValue); - m->setN3Min(needle3MinValue); - m->setN3Max(needle3MaxValue); - m->setN1DataObject(needle1DataObject); - m->setN1ObjField(needle1ObjectField); - m->setN2DataObject(needle2DataObject); - m->setN2ObjField(needle2ObjectField); - m->setN3DataObject(needle3DataObject); - m->setN3ObjField(needle3ObjectField); - m->setN1Factor(needle1Factor); - m->setN2Factor(needle2Factor); - m->setN3Factor(needle3Factor); - m->setN1Move(needle1Move); - m->setN2Move(needle2Move); - m->setN3Move(needle3Move); - m->setFont(font); - - return m; -} - -/** - * Saves a configuration. - * - */ -void DialGadgetConfiguration::saveConfig(QSettings* settings) const { - QString dialFile = Utils::PathUtils().RemoveDataPath(m_defaultDial); - settings->setValue("dialFile", dialFile); - - settings->setValue("dialBackgroundID", dialBackgroundID); - settings->setValue("dialForegroundID", dialForegroundID); - - settings->setValue("dialNeedleID1", dialNeedleID1); - settings->setValue("dialNeedleID2", dialNeedleID2); - settings->setValue("dialNeedleID3", dialNeedleID3); - - settings->setValue("needle1MinValue", needle1MinValue); - settings->setValue("needle1MaxValue", needle1MaxValue); - settings->setValue("needle2MinValue", needle2MinValue); - settings->setValue("needle2MaxValue", needle2MaxValue); - settings->setValue("needle3MinValue", needle3MinValue); - settings->setValue("needle3MaxValue", needle3MaxValue); - - settings->setValue("needle1DataObject", needle1DataObject); - settings->setValue("needle1ObjectField", needle1ObjectField); - settings->setValue("needle2DataObject", needle2DataObject); - settings->setValue("needle2ObjectField", needle2ObjectField); - settings->setValue("needle3DataObject", needle3DataObject); - settings->setValue("needle3ObjectField", needle3ObjectField); - - settings->setValue("needle1Factor", needle1Factor); - settings->setValue("needle2Factor", needle2Factor); - settings->setValue("needle3Factor", needle3Factor); - - settings->setValue("needle1Move", needle1Move); - settings->setValue("needle2Move", needle2Move); - settings->setValue("needle3Move", needle3Move); - - settings->setValue("font", font); -} +/** + ****************************************************************************** + * + * @file dialgadgetconfiguration.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @see The GNU Public License (GPL) Version 3 + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup DialPlugin Dial Plugin + * @{ + * @brief Plots flight information rotary style dials + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "dialgadgetconfiguration.h" +#include "utils/pathutils.h" + +/** + * Loads a saved configuration or defaults if non exist. + * + */ +DialGadgetConfiguration::DialGadgetConfiguration(QString classId, QSettings* qSettings, QObject *parent) : + IUAVGadgetConfiguration(classId, parent), + m_defaultDial("Unknown"), + dialBackgroundID("background"), + dialForegroundID("foreground"), + dialNeedleID1("needle"), + dialNeedleID2("needle2"), + dialNeedleID3("needle3"), + needle1MinValue(0), + needle1MaxValue(100), + needle2MinValue(0), + needle2MaxValue(100), + needle3MinValue(0), + needle3MaxValue(100), + needle1Factor(1), + needle2Factor(1), + needle3Factor(1), + needle1Move("Rotate"), + needle2Move("Rotate"), + needle3Move("Rotate") +{ + //if a saved configuration exists load it + if(qSettings != 0) { + QString dialFile = qSettings->value("dialFile").toString(); + + useOpenGLFlag = qSettings->value("useOpenGLFlag").toBool(); + + m_defaultDial=Utils::PathUtils().InsertDataPath(dialFile); + dialBackgroundID = qSettings->value("dialBackgroundID").toString(); + dialForegroundID = qSettings->value("dialForegroundID").toString(); + dialNeedleID1 = qSettings->value("dialNeedleID1").toString(); + dialNeedleID2 = qSettings->value("dialNeedleID2").toString(); + dialNeedleID3 = qSettings->value("dialNeedleID3").toString(); + needle1MinValue = qSettings->value("needle1MinValue").toDouble(); + needle1MaxValue = qSettings->value("needle1MaxValue").toDouble(); + needle2MinValue = qSettings->value("needle2MinValue").toDouble(); + needle2MaxValue = qSettings->value("needle2MaxValue").toDouble(); + needle3MinValue = qSettings->value("needle3MinValue").toDouble(); + needle3MaxValue = qSettings->value("needle3MaxValue").toDouble(); + needle1DataObject = qSettings->value("needle1DataObject").toString(); + needle1ObjectField = qSettings->value("needle1ObjectField").toString(); + needle2DataObject = qSettings->value("needle2DataObject").toString(); + needle2ObjectField = qSettings->value("needle2ObjectField").toString(); + needle3DataObject = qSettings->value("needle3DataObject").toString(); + needle3ObjectField = qSettings->value("needle3ObjectField").toString(); + needle1Factor = qSettings->value("needle1Factor").toDouble(); + needle2Factor = qSettings->value("needle2Factor").toDouble(); + needle3Factor = qSettings->value("needle3Factor").toDouble(); + needle1Move = qSettings->value("needle1Move").toString(); + needle2Move = qSettings->value("needle2Move").toString(); + needle3Move = qSettings->value("needle3Move").toString(); + font = qSettings->value("font").toString(); + } +} + +/** + * Clones a configuration. + * + */ +IUAVGadgetConfiguration *DialGadgetConfiguration::clone() +{ + DialGadgetConfiguration *m = new DialGadgetConfiguration(this->classId()); + m->useOpenGLFlag = useOpenGLFlag; + m->m_defaultDial=m_defaultDial; + m->setDialBackgroundID(dialBackgroundID); + m->setDialForegroundID(dialForegroundID); + m->setDialNeedleID1(dialNeedleID1); + m->setDialNeedleID2(dialNeedleID2); + m->setDialNeedleID3(dialNeedleID3); + m->setN1Min(needle1MinValue); + m->setN1Max(needle1MaxValue); + m->setN2Min(needle2MinValue); + m->setN2Max(needle2MaxValue); + m->setN3Min(needle3MinValue); + m->setN3Max(needle3MaxValue); + m->setN1DataObject(needle1DataObject); + m->setN1ObjField(needle1ObjectField); + m->setN2DataObject(needle2DataObject); + m->setN2ObjField(needle2ObjectField); + m->setN3DataObject(needle3DataObject); + m->setN3ObjField(needle3ObjectField); + m->setN1Factor(needle1Factor); + m->setN2Factor(needle2Factor); + m->setN3Factor(needle3Factor); + m->setN1Move(needle1Move); + m->setN2Move(needle2Move); + m->setN3Move(needle3Move); + m->setFont(font); + + return m; +} + +/** + * Saves a configuration. + * + */ +void DialGadgetConfiguration::saveConfig(QSettings* settings) const { + QString dialFile = Utils::PathUtils().RemoveDataPath(m_defaultDial); + settings->setValue("dialFile", dialFile); + + settings->setValue("useOpenGLFlag", useOpenGLFlag); + + settings->setValue("dialBackgroundID", dialBackgroundID); + settings->setValue("dialForegroundID", dialForegroundID); + + settings->setValue("dialNeedleID1", dialNeedleID1); + settings->setValue("dialNeedleID2", dialNeedleID2); + settings->setValue("dialNeedleID3", dialNeedleID3); + + settings->setValue("needle1MinValue", needle1MinValue); + settings->setValue("needle1MaxValue", needle1MaxValue); + settings->setValue("needle2MinValue", needle2MinValue); + settings->setValue("needle2MaxValue", needle2MaxValue); + settings->setValue("needle3MinValue", needle3MinValue); + settings->setValue("needle3MaxValue", needle3MaxValue); + + settings->setValue("needle1DataObject", needle1DataObject); + settings->setValue("needle1ObjectField", needle1ObjectField); + settings->setValue("needle2DataObject", needle2DataObject); + settings->setValue("needle2ObjectField", needle2ObjectField); + settings->setValue("needle3DataObject", needle3DataObject); + settings->setValue("needle3ObjectField", needle3ObjectField); + + settings->setValue("needle1Factor", needle1Factor); + settings->setValue("needle2Factor", needle2Factor); + settings->setValue("needle3Factor", needle3Factor); + + settings->setValue("needle1Move", needle1Move); + settings->setValue("needle2Move", needle2Move); + settings->setValue("needle3Move", needle3Move); + + settings->setValue("font", font); +} diff --git a/ground/openpilotgcs/src/plugins/dial/dialgadgetconfiguration.h b/ground/openpilotgcs/src/plugins/dial/dialgadgetconfiguration.h index 609033e18..0b8f942d6 100644 --- a/ground/openpilotgcs/src/plugins/dial/dialgadgetconfiguration.h +++ b/ground/openpilotgcs/src/plugins/dial/dialgadgetconfiguration.h @@ -1,139 +1,143 @@ -/** - ****************************************************************************** - * - * @file dialgadgetconfiguration.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @see The GNU Public License (GPL) Version 3 - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup DialPlugin Dial Plugin - * @{ - * @brief Plots flight information rotary style dials - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef DIALGADGETCONFIGURATION_H -#define DIALGADGETCONFIGURATION_H - -#include - -using namespace Core; - -/* Despite its name, this is actually a generic analog dial - supporting up to two rotating "needle" indicators. - */ -class DialGadgetConfiguration : public IUAVGadgetConfiguration -{ -Q_OBJECT -public: - explicit DialGadgetConfiguration(QString classId, QSettings* qSettings = 0, QObject *parent = 0); - - - //set dial configuration functions - void setDialFile(QString dialFile){m_defaultDial=dialFile;} - void setDialBackgroundID(QString elementID) { dialBackgroundID = elementID;} - void setDialForegroundID(QString elementID) { dialForegroundID = elementID;} - void setDialNeedleID1(QString elementID) { dialNeedleID1 = elementID;} - void setDialNeedleID2(QString elementID) { dialNeedleID2 = elementID;} - void setDialNeedleID3(QString elementID) { dialNeedleID3 = elementID;} - void setN1Min(double val) { needle1MinValue = val;} - void setN2Min(double val) { needle2MinValue = val;} - void setN3Min(double val) { needle3MinValue = val;} - void setN1Max(double val) { needle1MaxValue = val;} - void setN2Max(double val) { needle2MaxValue = val;} - void setN3Max(double val) { needle3MaxValue = val;} - void setN1Factor(double val) { needle1Factor = val;} - void setN2Factor(double val) { needle2Factor = val;} - void setN3Factor(double val) { needle3Factor = val;} - void setN1DataObject(QString text) {needle1DataObject = text; } - void setN2DataObject(QString text){ needle2DataObject = text; } - void setN3DataObject(QString text){ needle3DataObject = text; } - void setN1ObjField(QString text) { needle1ObjectField = text; } - void setN2ObjField(QString text) { needle2ObjectField = text; } - void setN3ObjField(QString text) { needle3ObjectField = text; } - void setN1Move( QString move) { needle1Move = move; } - void setN2Move( QString move) { needle2Move = move; } - void setN3Move( QString move) { needle3Move = move; } - void setFont(QString text) { font = text; } - - - //get dial configuration functions - QString dialFile() {return m_defaultDial;} - QString dialBackground() {return dialBackgroundID;} - QString dialForeground() {return dialForegroundID;} - QString dialNeedle1() {return dialNeedleID1;} - QString dialNeedle2() {return dialNeedleID2;} - QString dialNeedle3() {return dialNeedleID3;} - double getN1Min() { return needle1MinValue;} - double getN2Min() { return needle2MinValue;} - double getN3Min() { return needle3MinValue;} - double getN1Max() { return needle1MaxValue;} - double getN2Max() { return needle2MaxValue;} - double getN3Max() { return needle3MaxValue;} - double getN1Factor() { return needle1Factor;} - double getN2Factor() { return needle2Factor;} - double getN3Factor() { return needle3Factor;} - QString getN1DataObject() { return needle1DataObject; } - QString getN2DataObject() { return needle2DataObject; } - QString getN3DataObject() { return needle3DataObject; } - QString getN1ObjField() { return needle1ObjectField; } - QString getN2ObjField() { return needle2ObjectField; } - QString getN3ObjField() { return needle3ObjectField; } - QString getN1Move() { return needle1Move; } - QString getN2Move() { return needle2Move; } - QString getN3Move() { return needle3Move; } - QString getFont() { return font;} - - void saveConfig(QSettings* settings) const; - IUAVGadgetConfiguration *clone(); - -private: - QString m_defaultDial; // The name of the dial's SVG source file - QString dialBackgroundID; // SVG elementID of the background - QString dialForegroundID; // ... of the foreground - QString dialNeedleID1; // ... and the first needle - QString dialNeedleID2; // ... and the second - QString dialNeedleID3; // ... and the third - - // Note: MinValue not used at the moment! - double needle1MinValue; // Value corresponding to a 0 degree angle; - double needle1MaxValue; // Value corresponding to a 360 degree angle; - double needle2MinValue; - double needle2MaxValue; - double needle3MinValue; - double needle3MaxValue; - double needle1Factor; - double needle2Factor; - double needle3Factor; - - // The font used for the dial - QString font; - - QString needle1DataObject; - QString needle1ObjectField; - QString needle2DataObject; - QString needle2ObjectField; - QString needle3DataObject; - QString needle3ObjectField; - - // How the two dials move: - QString needle1Move; - QString needle2Move; - QString needle3Move; -}; - -#endif // DIALGADGETCONFIGURATION_H +/** + ****************************************************************************** + * + * @file dialgadgetconfiguration.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @see The GNU Public License (GPL) Version 3 + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup DialPlugin Dial Plugin + * @{ + * @brief Plots flight information rotary style dials + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef DIALGADGETCONFIGURATION_H +#define DIALGADGETCONFIGURATION_H + +#include + +using namespace Core; + +/* Despite its name, this is actually a generic analog dial + supporting up to two rotating "needle" indicators. + */ +class DialGadgetConfiguration : public IUAVGadgetConfiguration +{ +Q_OBJECT +public: + explicit DialGadgetConfiguration(QString classId, QSettings* qSettings = 0, QObject *parent = 0); + + + //set dial configuration functions + void setDialFile(QString dialFile){m_defaultDial=dialFile;} + void setDialBackgroundID(QString elementID) { dialBackgroundID = elementID;} + void setDialForegroundID(QString elementID) { dialForegroundID = elementID;} + void setDialNeedleID1(QString elementID) { dialNeedleID1 = elementID;} + void setDialNeedleID2(QString elementID) { dialNeedleID2 = elementID;} + void setDialNeedleID3(QString elementID) { dialNeedleID3 = elementID;} + void setN1Min(double val) { needle1MinValue = val;} + void setN2Min(double val) { needle2MinValue = val;} + void setN3Min(double val) { needle3MinValue = val;} + void setN1Max(double val) { needle1MaxValue = val;} + void setN2Max(double val) { needle2MaxValue = val;} + void setN3Max(double val) { needle3MaxValue = val;} + void setN1Factor(double val) { needle1Factor = val;} + void setN2Factor(double val) { needle2Factor = val;} + void setN3Factor(double val) { needle3Factor = val;} + void setN1DataObject(QString text) {needle1DataObject = text; } + void setN2DataObject(QString text){ needle2DataObject = text; } + void setN3DataObject(QString text){ needle3DataObject = text; } + void setN1ObjField(QString text) { needle1ObjectField = text; } + void setN2ObjField(QString text) { needle2ObjectField = text; } + void setN3ObjField(QString text) { needle3ObjectField = text; } + void setN1Move( QString move) { needle1Move = move; } + void setN2Move( QString move) { needle2Move = move; } + void setN3Move( QString move) { needle3Move = move; } + void setFont(QString text) { font = text; } + void setUseOpenGL(bool flag) { useOpenGLFlag = flag; } + + + //get dial configuration functions + QString dialFile() {return m_defaultDial;} + QString dialBackground() {return dialBackgroundID;} + QString dialForeground() {return dialForegroundID;} + QString dialNeedle1() {return dialNeedleID1;} + QString dialNeedle2() {return dialNeedleID2;} + QString dialNeedle3() {return dialNeedleID3;} + double getN1Min() { return needle1MinValue;} + double getN2Min() { return needle2MinValue;} + double getN3Min() { return needle3MinValue;} + double getN1Max() { return needle1MaxValue;} + double getN2Max() { return needle2MaxValue;} + double getN3Max() { return needle3MaxValue;} + double getN1Factor() { return needle1Factor;} + double getN2Factor() { return needle2Factor;} + double getN3Factor() { return needle3Factor;} + QString getN1DataObject() { return needle1DataObject; } + QString getN2DataObject() { return needle2DataObject; } + QString getN3DataObject() { return needle3DataObject; } + QString getN1ObjField() { return needle1ObjectField; } + QString getN2ObjField() { return needle2ObjectField; } + QString getN3ObjField() { return needle3ObjectField; } + QString getN1Move() { return needle1Move; } + QString getN2Move() { return needle2Move; } + QString getN3Move() { return needle3Move; } + QString getFont() { return font;} + bool useOpenGL() { return useOpenGLFlag; } + + void saveConfig(QSettings* settings) const; + IUAVGadgetConfiguration *clone(); + +private: + QString m_defaultDial; // The name of the dial's SVG source file + QString dialBackgroundID; // SVG elementID of the background + QString dialForegroundID; // ... of the foreground + QString dialNeedleID1; // ... and the first needle + QString dialNeedleID2; // ... and the second + QString dialNeedleID3; // ... and the third + + // Note: MinValue not used at the moment! + double needle1MinValue; // Value corresponding to a 0 degree angle; + double needle1MaxValue; // Value corresponding to a 360 degree angle; + double needle2MinValue; + double needle2MaxValue; + double needle3MinValue; + double needle3MaxValue; + double needle1Factor; + double needle2Factor; + double needle3Factor; + + // The font used for the dial + QString font; + + QString needle1DataObject; + QString needle1ObjectField; + QString needle2DataObject; + QString needle2ObjectField; + QString needle3DataObject; + QString needle3ObjectField; + + // How the two dials move: + QString needle1Move; + QString needle2Move; + QString needle3Move; + + bool useOpenGLFlag; +}; + +#endif // DIALGADGETCONFIGURATION_H diff --git a/ground/openpilotgcs/src/plugins/dial/dialgadgetoptionspage.cpp b/ground/openpilotgcs/src/plugins/dial/dialgadgetoptionspage.cpp index feb6b408d..438966ecb 100644 --- a/ground/openpilotgcs/src/plugins/dial/dialgadgetoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/dial/dialgadgetoptionspage.cpp @@ -1,273 +1,276 @@ -/** - ****************************************************************************** - * - * @file dialgadgetoptionspage.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @see The GNU Public License (GPL) Version 3 - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup DialPlugin Dial Plugin - * @{ - * @brief Plots flight information rotary style dials - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "dialgadgetoptionspage.h" -#include "dialgadgetconfiguration.h" -#include "ui_dialgadgetoptionspage.h" -#include "extensionsystem/pluginmanager.h" -#include "uavobjectmanager.h" -#include "uavdataobject.h" - - -#include -#include -#include - -DialGadgetOptionsPage::DialGadgetOptionsPage(DialGadgetConfiguration *config, QObject *parent) : - IOptionsPage(parent), - m_config(config) -{ -} - -//creates options page widget (uses the UI file) -QWidget *DialGadgetOptionsPage::createPage(QWidget *parent) -{ - - Q_UNUSED(parent); - options_page = new Ui::DialGadgetOptionsPage(); - //main widget - QWidget *optionsPageWidget = new QWidget; - //main layout - options_page->setupUi(optionsPageWidget); - - // Fills the combo boxes for the UAVObjects - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - QList< QList > objList = objManager->getDataObjects(); - foreach (QList list, objList) { - foreach (UAVDataObject* obj, list) { - options_page->uavObject1->addItem(obj->getName()); - options_page->uavObject2->addItem(obj->getName()); - options_page->uavObject3->addItem(obj->getName()); - } - } - - // Fills the combo boxes for Needle movement options - options_page->moveNeedle1->addItem("Rotate"); - options_page->moveNeedle1->addItem("Horizontal"); - options_page->moveNeedle1->addItem("Vertical"); - - options_page->moveNeedle2->addItem("Rotate"); - options_page->moveNeedle2->addItem("Horizontal"); - options_page->moveNeedle2->addItem("Vertical"); - - options_page->moveNeedle3->addItem("Rotate"); - options_page->moveNeedle3->addItem("Horizontal"); - options_page->moveNeedle3->addItem("Vertical"); - - // Restore the contents from the settings: - - options_page->svgSourceFile->setExpectedKind(Utils::PathChooser::File); - options_page->svgSourceFile->setPromptDialogFilter(tr("SVG image (*.svg)")); - options_page->svgSourceFile->setPromptDialogTitle(tr("Choose SVG image")); - options_page->svgSourceFile->setPath(m_config->dialFile()); - options_page->backgroundID->setText(m_config->dialBackground()); - options_page->foregroundID->setText(m_config->dialForeground()); - options_page->needle1ID->setText(m_config->dialNeedle1()); - options_page->needle2ID->setText(m_config->dialNeedle2()); - options_page->needle3ID->setText(m_config->dialNeedle3()); - options_page->needle1Min->setValue(m_config->getN1Min()); - options_page->needle1Max->setValue(m_config->getN1Max()); - options_page->needle2Min->setValue(m_config->getN2Min()); - options_page->needle2Max->setValue(m_config->getN2Max()); - options_page->needle3Min->setValue(m_config->getN3Min()); - options_page->needle3Max->setValue(m_config->getN3Max()); - options_page->factor1->setValue(m_config->getN1Factor()); - options_page->factor2->setValue(m_config->getN2Factor()); - options_page->factor3->setValue(m_config->getN3Factor()); - options_page->moveNeedle1->setCurrentIndex(options_page->moveNeedle1->findText(m_config->getN1Move())); - options_page->moveNeedle2->setCurrentIndex(options_page->moveNeedle2->findText(m_config->getN2Move())); - options_page->moveNeedle3->setCurrentIndex(options_page->moveNeedle3->findText(m_config->getN3Move())); - - //select saved UAV Object field values - if(options_page->uavObject1->findText(m_config->getN1DataObject())!=-1){ - options_page->uavObject1->setCurrentIndex(options_page->uavObject1->findText(m_config->getN1DataObject())); - // Now load the object field values - 1st check that the object saved in the config still exists - UAVDataObject* obj = dynamic_cast( objManager->getObject(m_config->getN1DataObject()) ); - if (obj != NULL ) { - on_uavObject1_currentIndexChanged(m_config->getN1DataObject()); - // And set the highlighed value from the settings: - options_page->objectField1->setCurrentIndex(options_page->objectField1->findText(m_config->getN1ObjField())); - } - } - connect(options_page->uavObject1, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_uavObject1_currentIndexChanged(QString))); - - if(options_page->uavObject2->findText(m_config->getN2DataObject())!=-1){ - options_page->uavObject2->setCurrentIndex(options_page->uavObject2->findText(m_config->getN2DataObject())); - // Now load the object field values: - UAVDataObject* obj = dynamic_cast( objManager->getObject(m_config->getN2DataObject())); - if (obj != NULL ) { - on_uavObject2_currentIndexChanged(m_config->getN2DataObject()); - options_page->objectField2->setCurrentIndex(options_page->objectField2->findText(m_config->getN2ObjField())); - } - } - connect(options_page->uavObject2, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_uavObject2_currentIndexChanged(QString))); - - if(options_page->uavObject3->findText(m_config->getN3DataObject())!=-1){ - options_page->uavObject3->setCurrentIndex(options_page->uavObject3->findText(m_config->getN3DataObject())); - // Now load the object field values: - UAVDataObject* obj = dynamic_cast( objManager->getObject(m_config->getN3DataObject())); - if (obj != NULL ) { - on_uavObject3_currentIndexChanged(m_config->getN3DataObject()); - options_page->objectField3->setCurrentIndex(options_page->objectField3->findText(m_config->getN3ObjField())); - } - } - connect(options_page->uavObject3, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_uavObject3_currentIndexChanged(QString))); - - connect(options_page->fontPicker, SIGNAL(clicked()), this, SLOT(on_fontPicker_clicked())); - - return optionsPageWidget; -} - -/** - * Called when the user presses apply or OK. - * - * Saves the current values - * - */ -void DialGadgetOptionsPage::apply() -{ - m_config->setDialFile(options_page->svgSourceFile->path()); - m_config->setDialBackgroundID(options_page->backgroundID->text()); - m_config->setDialForegroundID(options_page->foregroundID->text()); - m_config->setDialNeedleID1(options_page->needle1ID->text()); - m_config->setDialNeedleID2(options_page->needle2ID->text()); - m_config->setDialNeedleID3(options_page->needle3ID->text()); - m_config->setN1Min(options_page->needle1Min->value()); - m_config->setN1Max(options_page->needle1Max->value()); - m_config->setN1Factor(options_page->factor1->value()); - m_config->setN2Min(options_page->needle2Min->value()); - m_config->setN2Max(options_page->needle2Max->value()); - m_config->setN2Factor(options_page->factor2->value()); - m_config->setN3Min(options_page->needle3Min->value()); - m_config->setN3Max(options_page->needle3Max->value()); - m_config->setN3Factor(options_page->factor3->value()); - m_config->setN1DataObject(options_page->uavObject1->currentText()); - m_config->setN2DataObject(options_page->uavObject2->currentText()); - m_config->setN3DataObject(options_page->uavObject3->currentText()); - m_config->setN1ObjField(options_page->objectField1->currentText()); - m_config->setN2ObjField(options_page->objectField2->currentText()); - m_config->setN3ObjField(options_page->objectField3->currentText()); - m_config->setN1Move(options_page->moveNeedle1->currentText()); - m_config->setN2Move(options_page->moveNeedle2->currentText()); - m_config->setN3Move(options_page->moveNeedle3->currentText()); - m_config->setFont(font.toString()); - -} - -/** - * Opens a font picker. - * - */ -void DialGadgetOptionsPage::on_fontPicker_clicked() -{ - bool ok; - font = QFontDialog::getFont(&ok, QFont("Arial", 12), qobject_cast(this)); -} - - -/* - Fills in the field1 combo box when value is changed in the - object1 field -*/ -void DialGadgetOptionsPage::on_uavObject1_currentIndexChanged(QString val) { - options_page->objectField1->clear(); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { - if(field->getType() == UAVObjectField::STRING || field->getType() == UAVObjectField::ENUM ) - continue; - if(field->getElementNames().count() > 1) - { - foreach(QString elemName , field->getElementNames()) - { - options_page->objectField1->addItem(field->getName() + "-" + elemName); - } - } - else - options_page->objectField1->addItem(field->getName()); - } -} - -/* - Fills in the field2 combo box when value is changed in the - object2 field -*/ -void DialGadgetOptionsPage::on_uavObject2_currentIndexChanged(QString val) { - options_page->objectField2->clear(); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { - if(field->getType() == UAVObjectField::STRING || field->getType() == UAVObjectField::ENUM ) - continue; - if(field->getElementNames().count() > 1) - { - foreach(QString elemName , field->getElementNames()) - { - options_page->objectField2->addItem(field->getName() + "-" + elemName); - } - } - else - options_page->objectField2->addItem(field->getName()); - } -} - -/* - Fills in the field3 combo box when value is changed in the - object3 field -*/ -void DialGadgetOptionsPage::on_uavObject3_currentIndexChanged(QString val) { - options_page->objectField3->clear(); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { - if(field->getType() == UAVObjectField::STRING || field->getType() == UAVObjectField::ENUM ) - continue; - if(field->getElementNames().count() > 1) - { - foreach(QString elemName , field->getElementNames()) - { - options_page->objectField3->addItem(field->getName() + "-" + elemName); - } - } - else - options_page->objectField3->addItem(field->getName()); - } -} - - -void DialGadgetOptionsPage::finish() -{ - -} +/** + ****************************************************************************** + * + * @file dialgadgetoptionspage.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @see The GNU Public License (GPL) Version 3 + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup DialPlugin Dial Plugin + * @{ + * @brief Plots flight information rotary style dials + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "dialgadgetoptionspage.h" +#include "dialgadgetconfiguration.h" +#include "ui_dialgadgetoptionspage.h" +#include "extensionsystem/pluginmanager.h" +#include "uavobjectmanager.h" +#include "uavdataobject.h" + + +#include +#include +#include + +DialGadgetOptionsPage::DialGadgetOptionsPage(DialGadgetConfiguration *config, QObject *parent) : + IOptionsPage(parent), + m_config(config) +{ +} + +//creates options page widget (uses the UI file) +QWidget *DialGadgetOptionsPage::createPage(QWidget *parent) +{ + + Q_UNUSED(parent); + options_page = new Ui::DialGadgetOptionsPage(); + //main widget + QWidget *optionsPageWidget = new QWidget; + //main layout + options_page->setupUi(optionsPageWidget); + + // Fills the combo boxes for the UAVObjects + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); + QList< QList > objList = objManager->getDataObjects(); + foreach (QList list, objList) { + foreach (UAVDataObject* obj, list) { + options_page->uavObject1->addItem(obj->getName()); + options_page->uavObject2->addItem(obj->getName()); + options_page->uavObject3->addItem(obj->getName()); + } + } + + // Fills the combo boxes for Needle movement options + options_page->moveNeedle1->addItem("Rotate"); + options_page->moveNeedle1->addItem("Horizontal"); + options_page->moveNeedle1->addItem("Vertical"); + + options_page->moveNeedle2->addItem("Rotate"); + options_page->moveNeedle2->addItem("Horizontal"); + options_page->moveNeedle2->addItem("Vertical"); + + options_page->moveNeedle3->addItem("Rotate"); + options_page->moveNeedle3->addItem("Horizontal"); + options_page->moveNeedle3->addItem("Vertical"); + + // Restore the contents from the settings: + + options_page->useOpenGL->setChecked(m_config->useOpenGL()); + + options_page->svgSourceFile->setExpectedKind(Utils::PathChooser::File); + options_page->svgSourceFile->setPromptDialogFilter(tr("SVG image (*.svg)")); + options_page->svgSourceFile->setPromptDialogTitle(tr("Choose SVG image")); + options_page->svgSourceFile->setPath(m_config->dialFile()); + options_page->backgroundID->setText(m_config->dialBackground()); + options_page->foregroundID->setText(m_config->dialForeground()); + options_page->needle1ID->setText(m_config->dialNeedle1()); + options_page->needle2ID->setText(m_config->dialNeedle2()); + options_page->needle3ID->setText(m_config->dialNeedle3()); + options_page->needle1Min->setValue(m_config->getN1Min()); + options_page->needle1Max->setValue(m_config->getN1Max()); + options_page->needle2Min->setValue(m_config->getN2Min()); + options_page->needle2Max->setValue(m_config->getN2Max()); + options_page->needle3Min->setValue(m_config->getN3Min()); + options_page->needle3Max->setValue(m_config->getN3Max()); + options_page->factor1->setValue(m_config->getN1Factor()); + options_page->factor2->setValue(m_config->getN2Factor()); + options_page->factor3->setValue(m_config->getN3Factor()); + options_page->moveNeedle1->setCurrentIndex(options_page->moveNeedle1->findText(m_config->getN1Move())); + options_page->moveNeedle2->setCurrentIndex(options_page->moveNeedle2->findText(m_config->getN2Move())); + options_page->moveNeedle3->setCurrentIndex(options_page->moveNeedle3->findText(m_config->getN3Move())); + + //select saved UAV Object field values + if(options_page->uavObject1->findText(m_config->getN1DataObject())!=-1){ + options_page->uavObject1->setCurrentIndex(options_page->uavObject1->findText(m_config->getN1DataObject())); + // Now load the object field values - 1st check that the object saved in the config still exists + UAVDataObject* obj = dynamic_cast( objManager->getObject(m_config->getN1DataObject()) ); + if (obj != NULL ) { + on_uavObject1_currentIndexChanged(m_config->getN1DataObject()); + // And set the highlighed value from the settings: + options_page->objectField1->setCurrentIndex(options_page->objectField1->findText(m_config->getN1ObjField())); + } + } + connect(options_page->uavObject1, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_uavObject1_currentIndexChanged(QString))); + + if(options_page->uavObject2->findText(m_config->getN2DataObject())!=-1){ + options_page->uavObject2->setCurrentIndex(options_page->uavObject2->findText(m_config->getN2DataObject())); + // Now load the object field values: + UAVDataObject* obj = dynamic_cast( objManager->getObject(m_config->getN2DataObject())); + if (obj != NULL ) { + on_uavObject2_currentIndexChanged(m_config->getN2DataObject()); + options_page->objectField2->setCurrentIndex(options_page->objectField2->findText(m_config->getN2ObjField())); + } + } + connect(options_page->uavObject2, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_uavObject2_currentIndexChanged(QString))); + + if(options_page->uavObject3->findText(m_config->getN3DataObject())!=-1){ + options_page->uavObject3->setCurrentIndex(options_page->uavObject3->findText(m_config->getN3DataObject())); + // Now load the object field values: + UAVDataObject* obj = dynamic_cast( objManager->getObject(m_config->getN3DataObject())); + if (obj != NULL ) { + on_uavObject3_currentIndexChanged(m_config->getN3DataObject()); + options_page->objectField3->setCurrentIndex(options_page->objectField3->findText(m_config->getN3ObjField())); + } + } + connect(options_page->uavObject3, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_uavObject3_currentIndexChanged(QString))); + + connect(options_page->fontPicker, SIGNAL(clicked()), this, SLOT(on_fontPicker_clicked())); + + return optionsPageWidget; +} + +/** + * Called when the user presses apply or OK. + * + * Saves the current values + * + */ +void DialGadgetOptionsPage::apply() +{ + m_config->setDialFile(options_page->svgSourceFile->path()); + m_config->setUseOpenGL(options_page->useOpenGL->checkState()); + m_config->setDialBackgroundID(options_page->backgroundID->text()); + m_config->setDialForegroundID(options_page->foregroundID->text()); + m_config->setDialNeedleID1(options_page->needle1ID->text()); + m_config->setDialNeedleID2(options_page->needle2ID->text()); + m_config->setDialNeedleID3(options_page->needle3ID->text()); + m_config->setN1Min(options_page->needle1Min->value()); + m_config->setN1Max(options_page->needle1Max->value()); + m_config->setN1Factor(options_page->factor1->value()); + m_config->setN2Min(options_page->needle2Min->value()); + m_config->setN2Max(options_page->needle2Max->value()); + m_config->setN2Factor(options_page->factor2->value()); + m_config->setN3Min(options_page->needle3Min->value()); + m_config->setN3Max(options_page->needle3Max->value()); + m_config->setN3Factor(options_page->factor3->value()); + m_config->setN1DataObject(options_page->uavObject1->currentText()); + m_config->setN2DataObject(options_page->uavObject2->currentText()); + m_config->setN3DataObject(options_page->uavObject3->currentText()); + m_config->setN1ObjField(options_page->objectField1->currentText()); + m_config->setN2ObjField(options_page->objectField2->currentText()); + m_config->setN3ObjField(options_page->objectField3->currentText()); + m_config->setN1Move(options_page->moveNeedle1->currentText()); + m_config->setN2Move(options_page->moveNeedle2->currentText()); + m_config->setN3Move(options_page->moveNeedle3->currentText()); + m_config->setFont(font.toString()); + +} + +/** + * Opens a font picker. + * + */ +void DialGadgetOptionsPage::on_fontPicker_clicked() +{ + bool ok; + font = QFontDialog::getFont(&ok, QFont("Arial", 12), qobject_cast(this)); +} + + +/* + Fills in the field1 combo box when value is changed in the + object1 field +*/ +void DialGadgetOptionsPage::on_uavObject1_currentIndexChanged(QString val) { + options_page->objectField1->clear(); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); + UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); + QList fieldList = obj->getFields(); + foreach (UAVObjectField* field, fieldList) { + if(field->getType() == UAVObjectField::STRING || field->getType() == UAVObjectField::ENUM ) + continue; + if(field->getElementNames().count() > 1) + { + foreach(QString elemName , field->getElementNames()) + { + options_page->objectField1->addItem(field->getName() + "-" + elemName); + } + } + else + options_page->objectField1->addItem(field->getName()); + } +} + +/* + Fills in the field2 combo box when value is changed in the + object2 field +*/ +void DialGadgetOptionsPage::on_uavObject2_currentIndexChanged(QString val) { + options_page->objectField2->clear(); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); + UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); + QList fieldList = obj->getFields(); + foreach (UAVObjectField* field, fieldList) { + if(field->getType() == UAVObjectField::STRING || field->getType() == UAVObjectField::ENUM ) + continue; + if(field->getElementNames().count() > 1) + { + foreach(QString elemName , field->getElementNames()) + { + options_page->objectField2->addItem(field->getName() + "-" + elemName); + } + } + else + options_page->objectField2->addItem(field->getName()); + } +} + +/* + Fills in the field3 combo box when value is changed in the + object3 field +*/ +void DialGadgetOptionsPage::on_uavObject3_currentIndexChanged(QString val) { + options_page->objectField3->clear(); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); + UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); + QList fieldList = obj->getFields(); + foreach (UAVObjectField* field, fieldList) { + if(field->getType() == UAVObjectField::STRING || field->getType() == UAVObjectField::ENUM ) + continue; + if(field->getElementNames().count() > 1) + { + foreach(QString elemName , field->getElementNames()) + { + options_page->objectField3->addItem(field->getName() + "-" + elemName); + } + } + else + options_page->objectField3->addItem(field->getName()); + } +} + + +void DialGadgetOptionsPage::finish() +{ + +} diff --git a/ground/openpilotgcs/src/plugins/dial/dialgadgetoptionspage.ui b/ground/openpilotgcs/src/plugins/dial/dialgadgetoptionspage.ui index d07f7fdde..f3832ee2a 100644 --- a/ground/openpilotgcs/src/plugins/dial/dialgadgetoptionspage.ui +++ b/ground/openpilotgcs/src/plugins/dial/dialgadgetoptionspage.ui @@ -1,796 +1,814 @@ - - - DialGadgetOptionsPage - - - - 0 - 0 - 545 - 341 - - - - - 0 - 0 - - - - Form - - - - - -1 - -1 - 511 - 311 - - - - - QLayout::SetMinimumSize - - - 10 - - - 5 - - - 10 - - - 10 - - - - - 10 - - - QLayout::SetMaximumSize - - - 10 - - - - - - 0 - 0 - - - - Dial SVG: - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Dial font: - - - - - - - Select... - - - - - - - - - Qt::Horizontal - - - - - - - - - BackgroundID - - - - - - - - - - ForegroundID - - - - - - - - - - - - - 0 - 0 - - - - 0 - - - - Indicator 1 - - - - - 10 - 10 - 478 - 151 - - - - - 4 - - - 0 - - - 4 - - - - - - - Indicator 1 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Movement: - - - - - - - - - - ID: - - - - - - - - 0 - 0 - - - - - 50 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - - 10 - - - - - Min: - - - - - - - - 0 - 0 - - - - 3 - - - -100000.000000000000000 - - - 100000.000000000000000 - - - - - - - Max: - - - - - - - - 0 - 0 - - - - 3 - - - -100000.000000000000000 - - - 100000.000000000000000 - - - - - - - Factor: - - - - - - - - 0 - 0 - - - - 5 - - - -100000.000000000000000 - - - 100000.000000000000000 - - - - - - - - - 10 - - - - - DataObject - - - - - - - - 0 - 0 - - - - - - - - ObjectField - - - - - - - - 0 - 0 - - - - - - - - - - Qt::Horizontal - - - - - - - - - Indicator 2 - - - - - 10 - 10 - 473 - 139 - - - - - 0 - - - 4 - - - - - - - Indicator 2 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Movement: - - - - - - - - - - ID: - - - - - - - - 0 - 0 - - - - - - - - - - 10 - - - - - Min: - - - - - - - - 0 - 0 - - - - 3 - - - -10000.000000000000000 - - - 100000.000000000000000 - - - - - - - Max: - - - - - - - - 0 - 0 - - - - 3 - - - -100000.000000000000000 - - - 100000.000000000000000 - - - - - - - Factor: - - - - - - - - 0 - 0 - - - - 5 - - - -100000.000000000000000 - - - 100000.000000000000000 - - - - - - - - - 10 - - - - - DataObject - - - - - - - - 0 - 0 - - - - - - - - ObjectField - - - - - - - - 0 - 0 - - - - - - - - - - Qt::Horizontal - - - - - - - - - Indicator 3 - - - - - 10 - 10 - 473 - 139 - - - - - 0 - - - 4 - - - - - - - Indicator 3 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Movement: - - - - - - - - - - ID: - - - - - - - - 0 - 0 - - - - - - - - - - 10 - - - - - Min: - - - - - - - - 0 - 0 - - - - 3 - - - -10000.000000000000000 - - - 100000.000000000000000 - - - - - - - Max: - - - - - - - - 0 - 0 - - - - 3 - - - -100000.000000000000000 - - - 100000.000000000000000 - - - - - - - Factor: - - - - - - - - 0 - 0 - - - - 5 - - - -100000.000000000000000 - - - 100000.000000000000000 - - - - - - - - - 10 - - - - - DataObject - - - - - - - - 0 - 0 - - - - - - - - ObjectField - - - - - - - - 0 - 0 - - - - - - - - - - Qt::Horizontal - - - - - - - - - - - - - - Utils::PathChooser - QWidget -
utils/pathchooser.h
- 1 -
-
- - -
+ + + DialGadgetOptionsPage + + + + 0 + 0 + 545 + 341 + + + + + 0 + 0 + + + + Form + + + + + -1 + -1 + 511 + 311 + + + + + QLayout::SetMinimumSize + + + 10 + + + 5 + + + 10 + + + 10 + + + + + + + Use OpenGL + + + + + + + + + Qt::Horizontal + + + + + + + 10 + + + QLayout::SetMaximumSize + + + 10 + + + + + + 0 + 0 + + + + Dial SVG: + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Dial font: + + + + + + + Select... + + + + + + + + + Qt::Horizontal + + + + + + + + + BackgroundID + + + + + + + + + + ForegroundID + + + + + + + + + + + + + 0 + 0 + + + + 0 + + + + Indicator 1 + + + + + 10 + 10 + 478 + 151 + + + + + 4 + + + 0 + + + 4 + + + + + + + Indicator 1 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Movement: + + + + + + + + + + ID: + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 16777215 + 16777215 + + + + + + + + + + 10 + + + + + Min: + + + + + + + + 0 + 0 + + + + 3 + + + -100000.000000000000000 + + + 100000.000000000000000 + + + + + + + Max: + + + + + + + + 0 + 0 + + + + 3 + + + -100000.000000000000000 + + + 100000.000000000000000 + + + + + + + Factor: + + + + + + + + 0 + 0 + + + + 5 + + + -100000.000000000000000 + + + 100000.000000000000000 + + + + + + + + + 10 + + + + + DataObject + + + + + + + + 0 + 0 + + + + + + + + ObjectField + + + + + + + + 0 + 0 + + + + + + + + + + Qt::Horizontal + + + + + + + + + Indicator 2 + + + + + 10 + 10 + 473 + 139 + + + + + 0 + + + 4 + + + + + + + Indicator 2 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Movement: + + + + + + + + + + ID: + + + + + + + + 0 + 0 + + + + + + + + + + 10 + + + + + Min: + + + + + + + + 0 + 0 + + + + 3 + + + -10000.000000000000000 + + + 100000.000000000000000 + + + + + + + Max: + + + + + + + + 0 + 0 + + + + 3 + + + -100000.000000000000000 + + + 100000.000000000000000 + + + + + + + Factor: + + + + + + + + 0 + 0 + + + + 5 + + + -100000.000000000000000 + + + 100000.000000000000000 + + + + + + + + + 10 + + + + + DataObject + + + + + + + + 0 + 0 + + + + + + + + ObjectField + + + + + + + + 0 + 0 + + + + + + + + + + Qt::Horizontal + + + + + + + + + Indicator 3 + + + + + 10 + 10 + 473 + 139 + + + + + 0 + + + 4 + + + + + + + Indicator 3 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Movement: + + + + + + + + + + ID: + + + + + + + + 0 + 0 + + + + + + + + + + 10 + + + + + Min: + + + + + + + + 0 + 0 + + + + 3 + + + -10000.000000000000000 + + + 100000.000000000000000 + + + + + + + Max: + + + + + + + + 0 + 0 + + + + 3 + + + -100000.000000000000000 + + + 100000.000000000000000 + + + + + + + Factor: + + + + + + + + 0 + 0 + + + + 5 + + + -100000.000000000000000 + + + 100000.000000000000000 + + + + + + + + + 10 + + + + + DataObject + + + + + + + + 0 + 0 + + + + + + + + ObjectField + + + + + + + + 0 + 0 + + + + + + + + + + Qt::Horizontal + + + + + + + + + + + + + + Utils::PathChooser + QWidget +
utils/pathchooser.h
+ 1 +
+
+ + +
diff --git a/ground/openpilotgcs/src/plugins/dial/dialgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/dial/dialgadgetwidget.cpp index ac5525279..2553e7af4 100644 --- a/ground/openpilotgcs/src/plugins/dial/dialgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/dial/dialgadgetwidget.cpp @@ -1,623 +1,635 @@ -/** - ****************************************************************************** - * - * @file dialgadgetwidget.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @see The GNU Public License (GPL) Version 3 - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup DialPlugin Dial Plugin - * @{ - * @brief Plots flight information rotary style dials - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "dialgadgetwidget.h" -#include -#include -#include - -DialGadgetWidget::DialGadgetWidget(QWidget *parent) : QGraphicsView(parent) -{ - // TODO: create a proper "needle" object instead of hardcoding all this - // which is ugly (but easy). - - setMinimumSize(64,64); - setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - setScene(new QGraphicsScene(this)); - setRenderHints(QPainter::Antialiasing); - - m_renderer = new QSvgRenderer(); - - obj1 = NULL; - obj2 = NULL; - obj3 = NULL; - m_text1 = NULL; - m_text2 = NULL; - m_text3 = NULL; // Should be initialized to NULL otherwise the setFont method - // might segfault upon initialization if called before SetDialFile - - needle1Target = 0; - needle2Target = 0; - needle3Target = 0; - - // This timer mechanism makes needles rotate smoothly - connect(&dialTimer, SIGNAL(timeout()), this, SLOT(rotateNeedles())); -} - -DialGadgetWidget::~DialGadgetWidget() -{ - // Do nothing -} - -/*! - \brief Connects the widget to the relevant UAVObjects - */ -void DialGadgetWidget::connectNeedles(QString object1, QString nfield1, - QString object2, QString nfield2, - QString object3, QString nfield3) { - if (obj1 != NULL) - disconnect(obj1,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(updateNeedle1(UAVObject*))); - if (obj2 != NULL) - disconnect(obj2,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(updateNeedle2(UAVObject*))); - if (obj3 != NULL) - disconnect(obj3,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(updateNeedle3(UAVObject*))); - - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - - // Check validity of arguments first, reject empty args and unknown fields. - if (!(object1.isEmpty() || nfield1.isEmpty())) { - obj1 = dynamic_cast( objManager->getObject(object1) ); - if (obj1 != NULL ) { - // qDebug() << "Connected Object 1 (" << object1 << ")."; - connect(obj1, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateNeedle1(UAVObject*))); - if(nfield1.contains("-")) - { - QStringList fieldSubfield = nfield1.split("-", QString::SkipEmptyParts); - field1 = fieldSubfield.at(0); - subfield1 = fieldSubfield.at(1); - haveSubField1 = true; - } - else - { - field1= nfield1; - haveSubField1 = false; - } - } else { - qDebug() << "Error: Object is unknown (" << object1 << ")."; - } - } - - // And do the same for the second needle. - if (!(object2.isEmpty() || nfield2.isEmpty())) { - obj2 = dynamic_cast( objManager->getObject(object2) ); - if (obj2 != NULL ) { - // qDebug() << "Connected Object 2 (" << object2 << ")."; - connect(obj2, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateNeedle2(UAVObject*))); - if(nfield2.contains("-")) - { - QStringList fieldSubfield = nfield2.split("-", QString::SkipEmptyParts); - field2 = fieldSubfield.at(0); - subfield2 = fieldSubfield.at(1); - haveSubField2 = true; - } - else - { - field2= nfield2; - haveSubField2 = false; - } - } else { - qDebug() << "Error: Object is unknown (" << object2 << ")."; - } - } - - // And do the same for the third needle. - if (!(object3.isEmpty() || nfield3.isEmpty())) { - obj3 = dynamic_cast( objManager->getObject(object3) ); - if (obj3 != NULL ) { - // qDebug() << "Connected Object 3 (" << object3 << ")."; - connect(obj3, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateNeedle3(UAVObject*))); - if(nfield3.contains("-")) - { - QStringList fieldSubfield = nfield3.split("-", QString::SkipEmptyParts); - field3 = fieldSubfield.at(0); - subfield3 = fieldSubfield.at(1); - haveSubField3 = true; - } - else - { - field3= nfield3; - haveSubField3 = false; - } - } else { - qDebug() << "Error: Object is unknown (" << object3 << ")."; - } - } -} - -/*! - \brief Called by the UAVObject which got updated - */ -void DialGadgetWidget::updateNeedle1(UAVObject *object1) { - // Double check that the field exists: - double value; - UAVObjectField* field = object1->getField(field1); - if (field) { - if(haveSubField1){ - int indexOfSubField = field->getElementNames().indexOf(QRegExp(subfield1, Qt::CaseSensitive, QRegExp::FixedString)); - value = field->getDouble(indexOfSubField); - } else - value = field->getDouble(); - if (value != value) { - qDebug() << "Dial widget: encountered NaN !!"; - return; - } - setNeedle1(value); - } else { - qDebug() << "Wrong field, maybe an issue with object disconnection ?"; - } -} - -/*! - \brief Called by the UAVObject which got updated - */ -void DialGadgetWidget::updateNeedle2(UAVObject *object2) { - double value; - UAVObjectField* field = object2->getField(field2); - if (field) { - if(haveSubField2){ - int indexOfSubField = field->getElementNames().indexOf(QRegExp(subfield2, Qt::CaseSensitive, QRegExp::FixedString)); - value = field->getDouble(indexOfSubField); - } else - value = field->getDouble(); - if (value != value) { - qDebug() << "Dial widget: encountered NaN !!"; - return; - } - setNeedle2(value); - } else { - qDebug() << "Wrong field, maybe an issue with object disconnection ?"; - } -} - -/*! - \brief Called by the UAVObject which got updated - */ -void DialGadgetWidget::updateNeedle3(UAVObject *object3) { - double value; - UAVObjectField* field = object3->getField(field3); - if (field) { - if(haveSubField3){ - int indexOfSubField = field->getElementNames().indexOf(QRegExp(subfield3, Qt::CaseSensitive, QRegExp::FixedString)); - value = field->getDouble(indexOfSubField); - } else - value = field->getDouble(); - if (value != value) { - qDebug() << "Dial widget: encountered NaN !!"; - return; - } - setNeedle3(value); - } else { - qDebug() << "Wrong field, maybe an issue with object disconnection ?"; - } -} - -/* - Initializes the dial file, and does all the one-time calculations for - display later. This is the method which really initializes the dial. - */ -void DialGadgetWidget::setDialFile(QString dfn, QString bg, QString fg, QString n1, QString n2, - QString n3, QString n1Move, QString n2Move, QString n3Move) -{ - fgenabled = false; - n2enabled = false; - n3enabled = false; - QGraphicsScene *l_scene = scene(); - setBackgroundBrush(QBrush(Utils::StyleHelper::baseColor())); - if (QFile::exists(dfn) && m_renderer->load(dfn) && m_renderer->isValid()) - { - l_scene->clear(); // This also deletes all items contained in the scene. - m_background = new QGraphicsSvgItem(); - // All other items will be clipped to the shape of the background - m_background->setFlags(QGraphicsItem::ItemClipsChildrenToShape| - QGraphicsItem::ItemClipsToShape); - m_foreground = new QGraphicsSvgItem(); - m_needle1 = new QGraphicsSvgItem(); - m_needle2 = new QGraphicsSvgItem(); - m_needle3 = new QGraphicsSvgItem(); - m_needle1->setParentItem(m_background); - m_needle2->setParentItem(m_background); - m_needle3->setParentItem(m_background); - m_foreground->setParentItem(m_background); - - // We assume the dial contains at least the background - // and needle1 - m_background->setSharedRenderer(m_renderer); - m_background->setElementId(bg); - l_scene->addItem(m_background); - - m_needle1->setSharedRenderer(m_renderer); - m_needle1->setElementId(n1); - // Note: no need to add the item explicitely because it - // is done automatically since it's a child item of the - // background. - //l_scene->addItem(m_needle1); - - // The dial gadget allows Needle1 and Needle2 to be - // the same element, for combined movement. Needle3 - // is always independent. - if (n1 == n2) { - m_needle2 = m_needle1; - n2enabled = true; - } else { - if (m_renderer->elementExists(n2)) { - m_needle2->setSharedRenderer(m_renderer); - m_needle2->setElementId(n2); - //l_scene->addItem(m_needle2); - n2enabled = true; - } - } - - if (m_renderer->elementExists(n3)) { - m_needle3->setSharedRenderer(m_renderer); - m_needle3->setElementId(n3); - //l_scene->addItem(m_needle3); - n3enabled = true; - } - - if (m_renderer->elementExists(fg)) { - m_foreground->setSharedRenderer(m_renderer); - m_foreground->setElementId(fg); - // Center it on the scene - QRectF rectB = m_background->boundingRect(); - QRectF rectF = m_foreground->boundingRect(); - m_foreground->setPos(rectB.width()/2-rectF.width()/2,rectB.height()/2-rectF.height()/2); - //l_scene->addItem(m_foreground); - fgenabled = true; - } - - rotateN1 = false; - horizN1 = false; - vertN1 = false; - rotateN2 = false; - horizN2 = false; - vertN2 = false; - rotateN3 = false; - horizN3 = false; - vertN3 = false; - - // Now setup the rotation/translation settings: - // this is UGLY UGLY UGLY, sorry... - if (n1Move.contains("Rotate")) { - rotateN1 = true; - } else if (n1Move.contains("Horizontal")) { - horizN1 = true; - } else if (n1Move.contains("Vertical")) { - vertN1 = true; - } - - if (n2Move.contains("Rotate")) { - rotateN2 = true; - } else if (n2Move.contains("Horizontal")) { - horizN2 = true; - } else if (n2Move.contains("Vertical")) { - vertN2 = true; - } - - if (n3Move.contains("Rotate")) { - rotateN3 = true; - } else if (n3Move.contains("Horizontal")) { - horizN3 = true; - } else if (n3Move.contains("Vertical")) { - vertN3 = true; - } - - l_scene->setSceneRect(m_background->boundingRect()); - - // Now Initialize the center for all transforms of the dial needles to the - // center of the background: - // - Move the center of the needle to the center of the background. - QRectF rectB = m_background->boundingRect(); - QRectF rectN = m_needle1->boundingRect(); - m_needle1->setPos(rectB.width()/2-rectN.width()/2,rectB.height()/2-rectN.height()/2); - // - Put the transform origin point of the needle at its center. - m_needle1->setTransformOriginPoint(rectN.width()/2,rectN.height()/2); - - // Check whether the dial also wants display the numeric value: - if (m_renderer->elementExists(n1+"-text")) { - QMatrix textMatrix = m_renderer->matrixForElement(n1+"-text"); - qreal startX = textMatrix.mapRect(m_renderer->boundsOnElement(n1+"-text")).x(); - qreal startY = textMatrix.mapRect(m_renderer->boundsOnElement(n1+"-text")).y(); - QTransform matrix; - matrix.translate(startX,startY); - m_text1 = new QGraphicsTextItem("0.00"); - m_text1->setDefaultTextColor(QColor("White")); - m_text1->setTransform(matrix,false); - l_scene->addItem(m_text1); - } else { - m_text1 = NULL; - } - - - if ((n1 != n2) && n2enabled) { - // Only do it for needle2 if it is not the same as n1 - rectN = m_needle2->boundingRect(); - m_needle2->setPos(rectB.width()/2-rectN.width()/2,rectB.height()/2-rectN.height()/2); - m_needle2->setTransformOriginPoint(rectN.width()/2,rectN.height()/2); - // Check whether the dial also wants display the numeric value: - if (m_renderer->elementExists(n2+"-text")) { - QMatrix textMatrix = m_renderer->matrixForElement(n2+"-text"); - qreal startX = textMatrix.mapRect(m_renderer->boundsOnElement(n2+"-text")).x(); - qreal startY = textMatrix.mapRect(m_renderer->boundsOnElement(n2+"-text")).y(); - QTransform matrix; - matrix.translate(startX,startY); - m_text2 = new QGraphicsTextItem("0.00"); - m_text2->setDefaultTextColor(QColor("White")); - m_text2->setTransform(matrix,false); - l_scene->addItem(m_text2); - } else { - m_text2 = NULL; - } - - } - if (n3enabled) { - rectN = m_needle3->boundingRect(); - m_needle3->setPos(rectB.width()/2-rectN.width()/2,rectB.height()/2-rectN.height()/2); - m_needle3->setTransformOriginPoint(rectN.width()/2,rectN.height()/2); - // Check whether the dial also wants display the numeric value: - if (m_renderer->elementExists(n3+"-text")) { - QMatrix textMatrix = m_renderer->matrixForElement(n3+"-text"); - qreal startX = textMatrix.mapRect(m_renderer->boundsOnElement(n3+"-text")).x(); - qreal startY = textMatrix.mapRect(m_renderer->boundsOnElement(n3+"-text")).y(); - QTransform matrix; - matrix.translate(startX,startY); - m_text3 = new QGraphicsTextItem("0.00"); - m_text3->setDefaultTextColor(QColor("White")); - m_text3->setTransform(matrix,false); - l_scene->addItem(m_text3); - } else { - m_text3 = NULL; - } - - } - - // Last: we just loaded the dial file which is by default positioned on a "zero" value - // of the needles, so we have to reset the needle values too upon dial file loading, otherwise - // we would end up with an offset whenever we change a dial file and the needle value - // is not zero at that time. - needle1Value = 0; - needle2Value = 0; - needle3Value = 0; - if (!dialTimer.isActive()) - dialTimer.start(); - dialError = false; - } - else - { - qDebug()<<"no file: display default background."; - m_renderer->load(QString(":/dial/images/empty.svg")); - l_scene->clear(); // This also deletes all items contained in the scene. - m_background = new QGraphicsSvgItem(); - m_background->setSharedRenderer(m_renderer); - l_scene->addItem(m_background); - m_text1 = NULL; - m_text2 = NULL; - m_text3 = NULL; - m_needle1 = NULL; - m_needle2 = NULL; - m_needle3 = NULL; - dialError = true; - } -} - -void DialGadgetWidget::paint() -{ - update(); -} - -void DialGadgetWidget::paintEvent(QPaintEvent *event) -{ - // Skip painting until the dial file is loaded - if (! m_renderer->isValid()) { - qDebug()<<"Dial file not loaded, not rendering"; - return; - } - QGraphicsView::paintEvent(event); -} - -// This event enables the dial to be dynamically resized -// whenever the gadget is resized, taking advantage of the vector -// nature of SVG dials. -void DialGadgetWidget::resizeEvent(QResizeEvent *event) -{ - Q_UNUSED(event); - fitInView(m_background, Qt::KeepAspectRatio ); -} - -void DialGadgetWidget::setDialFont(QString fontProps) -{ - QFont font = QFont("Arial",12); - font.fromString(fontProps); - if (m_text1) { - m_text1->setFont(font); - } -} - - -// Converts the value into an angle: -// this enables smooth rotation in rotateNeedles below -void DialGadgetWidget::setNeedle1(double value) { - if (rotateN1) { - needle1Target = 360*(value*n1Factor-n1MinValue)/(n1MaxValue-n1MinValue); - } - if (horizN1) { - needle1Target = (value*n1Factor-n1MinValue)/(n1MaxValue-n1MinValue); - } - if (vertN1) { - needle1Target = (value*n1Factor-n1MinValue)/(n1MaxValue-n1MinValue); - } - if (!dialTimer.isActive()) - dialTimer.start(); - if (m_text1) { - QString s; - s.sprintf("%.2f",value*n1Factor); - m_text1->setPlainText(s); - } -} - -void DialGadgetWidget::setNeedle2(double value) { - if (rotateN2) { - needle2Target = 360*(value*n2Factor-n2MinValue)/(n2MaxValue-n2MinValue); - } - if (horizN2) { - needle2Target = (value*n2Factor-n2MinValue)/(n2MaxValue-n2MinValue); - } - if (vertN2) { - needle2Target = (value*n2Factor-n2MinValue)/(n2MaxValue-n2MinValue); - } - if (!dialTimer.isActive()) - dialTimer.start(); - if (m_text2) { - QString s; - s.sprintf("%.2f",value*n2Factor); - m_text2->setPlainText(s); - } - -} - -void DialGadgetWidget::setNeedle3(double value) { - if (rotateN3) { - needle3Target = 360*(value*n3Factor-n3MinValue)/(n3MaxValue-n3MinValue); - } - if (horizN3) { - needle3Target = (value*n3Factor-n3MinValue)/(n3MaxValue-n3MinValue); - } - if (vertN3) { - needle3Target = (value*n3Factor-n3MinValue)/(n3MaxValue-n3MinValue); - } - if (!dialTimer.isActive()) - dialTimer.start(); - if (m_text3) { - QString s; - s.sprintf("%.2f",value*n3Factor); - m_text3->setPlainText(s); - } -} - -// Take an input value and rotate the dial accordingly -// Rotation is smooth, starts fast and slows down when -// approaching the target. -// We aim for a 0.5 degree precision. -// -// Note: this code is valid even if needle1 and needle2 point -// to the same element. -void DialGadgetWidget::rotateNeedles() -{ - if (dialError) { - // We get there in case the dial file is missing or corrupt. - dialTimer.stop(); - return; - } - int dialRun = 3; - if (n2enabled) { - double needle2Diff; - if (abs((needle2Value-needle2Target)*10) > 5) { - needle2Diff =(needle2Target - needle2Value)/5; - } else { - needle2Diff = needle2Target - needle2Value; - dialRun--; - } - if (rotateN2) { - m_needle2->setRotation(m_needle2->rotation()+needle2Diff); - } else { - QPointF opd = QPointF(0,0); - if (horizN2) { - opd = QPointF(needle2Diff,0); - } - if (vertN2) { - opd = QPointF(0,needle2Diff); - } - m_needle2->setTransform(QTransform::fromTranslate(opd.x(),opd.y()), true); - // Since we have moved the needle, we need to move - // the transform origin point the opposite way - // so that it keeps rotating from the same point. - // (this is only useful if needle1 and needle2 are the - // same object, for combined movement such as attitude indicator). - QPointF oop = m_needle2->transformOriginPoint(); - m_needle2->setTransformOriginPoint(oop.x()-opd.x(),oop.y()-opd.y()); - } - needle2Value += needle2Diff; - } else { - dialRun--; - } - - // We assume that needle1 always exists! - double needle1Diff; - if ((abs((needle1Value-needle1Target)*10) > 5)) { - needle1Diff = (needle1Target - needle1Value)/5; - } else { - needle1Diff = needle1Target - needle1Value; - dialRun--; - } - if (rotateN1) { - m_needle1->setRotation(m_needle1->rotation()+needle1Diff); - } else { - QPointF opd = QPointF(0,0); - if (horizN1) { - opd = QPointF(needle1Diff,0); - } - if (vertN1) { - opd = QPointF(0,needle1Diff); - } - m_needle1->setTransform(QTransform::fromTranslate(opd.x(),opd.y()), true); - QPointF oop = m_needle1->transformOriginPoint(); - m_needle1->setTransformOriginPoint((oop.x()-opd.x()),(oop.y()-opd.y())); - } - needle1Value += needle1Diff; - - if (n3enabled) { - double needle3Diff; - if ((abs((needle3Value-needle3Target)*10) > 5)) { - needle3Diff = (needle3Target - needle3Value)/5; - } else { - needle3Diff = needle3Target - needle3Value; - dialRun--; - } - if (rotateN3) { - m_needle3->setRotation(m_needle3->rotation()+needle3Diff); - } else { - QPointF opd = QPointF(0,0); - if (horizN3) { - opd = QPointF(needle3Diff,0); - } - if (vertN3) { - opd = QPointF(0,needle3Diff); - } - m_needle3->setTransform(QTransform::fromTranslate(opd.x(),opd.y()), true); - QPointF oop = m_needle3->transformOriginPoint(); - m_needle3->setTransformOriginPoint((oop.x()-opd.x()),(oop.y()-opd.y())); - } - needle3Value += needle3Diff; - } else { - dialRun--; - } - - // Now check: if dialRun is now zero, we should - // just stop the timer since all needles have finished moving - if (!dialRun) dialTimer.stop(); -} +/** + ****************************************************************************** + * + * @file dialgadgetwidget.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @see The GNU Public License (GPL) Version 3 + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup DialPlugin Dial Plugin + * @{ + * @brief Plots flight information rotary style dials + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "dialgadgetwidget.h" +#include +#include +#include +#include + +DialGadgetWidget::DialGadgetWidget(QWidget *parent) : QGraphicsView(parent) +{ + // TODO: create a proper "needle" object instead of hardcoding all this + // which is ugly (but easy). + + setMinimumSize(64,64); + setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + setScene(new QGraphicsScene(this)); + setRenderHints(QPainter::Antialiasing); + + m_renderer = new QSvgRenderer(); + + obj1 = NULL; + obj2 = NULL; + obj3 = NULL; + m_text1 = NULL; + m_text2 = NULL; + m_text3 = NULL; // Should be initialized to NULL otherwise the setFont method + // might segfault upon initialization if called before SetDialFile + + needle1Target = 0; + needle2Target = 0; + needle3Target = 0; + + // This timer mechanism makes needles rotate smoothly + connect(&dialTimer, SIGNAL(timeout()), this, SLOT(rotateNeedles())); +} + +DialGadgetWidget::~DialGadgetWidget() +{ + // Do nothing +} + +/*! + \brief Enables/Disables OpenGL + */ +void DialGadgetWidget::enableOpenGL(bool flag) +{ + if (flag) + setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); + else + setViewport(new QWidget); +} + +/*! + \brief Connects the widget to the relevant UAVObjects + */ +void DialGadgetWidget::connectNeedles(QString object1, QString nfield1, + QString object2, QString nfield2, + QString object3, QString nfield3) { + if (obj1 != NULL) + disconnect(obj1,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(updateNeedle1(UAVObject*))); + if (obj2 != NULL) + disconnect(obj2,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(updateNeedle2(UAVObject*))); + if (obj3 != NULL) + disconnect(obj3,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(updateNeedle3(UAVObject*))); + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); + + // Check validity of arguments first, reject empty args and unknown fields. + if (!(object1.isEmpty() || nfield1.isEmpty())) { + obj1 = dynamic_cast( objManager->getObject(object1) ); + if (obj1 != NULL ) { + // qDebug() << "Connected Object 1 (" << object1 << ")."; + connect(obj1, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateNeedle1(UAVObject*))); + if(nfield1.contains("-")) + { + QStringList fieldSubfield = nfield1.split("-", QString::SkipEmptyParts); + field1 = fieldSubfield.at(0); + subfield1 = fieldSubfield.at(1); + haveSubField1 = true; + } + else + { + field1= nfield1; + haveSubField1 = false; + } + } else { + qDebug() << "Error: Object is unknown (" << object1 << ")."; + } + } + + // And do the same for the second needle. + if (!(object2.isEmpty() || nfield2.isEmpty())) { + obj2 = dynamic_cast( objManager->getObject(object2) ); + if (obj2 != NULL ) { + // qDebug() << "Connected Object 2 (" << object2 << ")."; + connect(obj2, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateNeedle2(UAVObject*))); + if(nfield2.contains("-")) + { + QStringList fieldSubfield = nfield2.split("-", QString::SkipEmptyParts); + field2 = fieldSubfield.at(0); + subfield2 = fieldSubfield.at(1); + haveSubField2 = true; + } + else + { + field2= nfield2; + haveSubField2 = false; + } + } else { + qDebug() << "Error: Object is unknown (" << object2 << ")."; + } + } + + // And do the same for the third needle. + if (!(object3.isEmpty() || nfield3.isEmpty())) { + obj3 = dynamic_cast( objManager->getObject(object3) ); + if (obj3 != NULL ) { + // qDebug() << "Connected Object 3 (" << object3 << ")."; + connect(obj3, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateNeedle3(UAVObject*))); + if(nfield3.contains("-")) + { + QStringList fieldSubfield = nfield3.split("-", QString::SkipEmptyParts); + field3 = fieldSubfield.at(0); + subfield3 = fieldSubfield.at(1); + haveSubField3 = true; + } + else + { + field3= nfield3; + haveSubField3 = false; + } + } else { + qDebug() << "Error: Object is unknown (" << object3 << ")."; + } + } +} + +/*! + \brief Called by the UAVObject which got updated + */ +void DialGadgetWidget::updateNeedle1(UAVObject *object1) { + // Double check that the field exists: + double value; + UAVObjectField* field = object1->getField(field1); + if (field) { + if(haveSubField1){ + int indexOfSubField = field->getElementNames().indexOf(QRegExp(subfield1, Qt::CaseSensitive, QRegExp::FixedString)); + value = field->getDouble(indexOfSubField); + } else + value = field->getDouble(); + if (value != value) { + qDebug() << "Dial widget: encountered NaN !!"; + return; + } + setNeedle1(value); + } else { + qDebug() << "Wrong field, maybe an issue with object disconnection ?"; + } +} + +/*! + \brief Called by the UAVObject which got updated + */ +void DialGadgetWidget::updateNeedle2(UAVObject *object2) { + double value; + UAVObjectField* field = object2->getField(field2); + if (field) { + if(haveSubField2){ + int indexOfSubField = field->getElementNames().indexOf(QRegExp(subfield2, Qt::CaseSensitive, QRegExp::FixedString)); + value = field->getDouble(indexOfSubField); + } else + value = field->getDouble(); + if (value != value) { + qDebug() << "Dial widget: encountered NaN !!"; + return; + } + setNeedle2(value); + } else { + qDebug() << "Wrong field, maybe an issue with object disconnection ?"; + } +} + +/*! + \brief Called by the UAVObject which got updated + */ +void DialGadgetWidget::updateNeedle3(UAVObject *object3) { + double value; + UAVObjectField* field = object3->getField(field3); + if (field) { + if(haveSubField3){ + int indexOfSubField = field->getElementNames().indexOf(QRegExp(subfield3, Qt::CaseSensitive, QRegExp::FixedString)); + value = field->getDouble(indexOfSubField); + } else + value = field->getDouble(); + if (value != value) { + qDebug() << "Dial widget: encountered NaN !!"; + return; + } + setNeedle3(value); + } else { + qDebug() << "Wrong field, maybe an issue with object disconnection ?"; + } +} + +/* + Initializes the dial file, and does all the one-time calculations for + display later. This is the method which really initializes the dial. + */ +void DialGadgetWidget::setDialFile(QString dfn, QString bg, QString fg, QString n1, QString n2, + QString n3, QString n1Move, QString n2Move, QString n3Move) +{ + fgenabled = false; + n2enabled = false; + n3enabled = false; + QGraphicsScene *l_scene = scene(); + setBackgroundBrush(QBrush(Utils::StyleHelper::baseColor())); + if (QFile::exists(dfn) && m_renderer->load(dfn) && m_renderer->isValid()) + { + l_scene->clear(); // This also deletes all items contained in the scene. + m_background = new QGraphicsSvgItem(); + // All other items will be clipped to the shape of the background + m_background->setFlags(QGraphicsItem::ItemClipsChildrenToShape| + QGraphicsItem::ItemClipsToShape); + m_foreground = new QGraphicsSvgItem(); + m_needle1 = new QGraphicsSvgItem(); + m_needle2 = new QGraphicsSvgItem(); + m_needle3 = new QGraphicsSvgItem(); + m_needle1->setParentItem(m_background); + m_needle2->setParentItem(m_background); + m_needle3->setParentItem(m_background); + m_foreground->setParentItem(m_background); + + // We assume the dial contains at least the background + // and needle1 + m_background->setSharedRenderer(m_renderer); + m_background->setElementId(bg); + l_scene->addItem(m_background); + + m_needle1->setSharedRenderer(m_renderer); + m_needle1->setElementId(n1); + // Note: no need to add the item explicitely because it + // is done automatically since it's a child item of the + // background. + //l_scene->addItem(m_needle1); + + // The dial gadget allows Needle1 and Needle2 to be + // the same element, for combined movement. Needle3 + // is always independent. + if (n1 == n2) { + m_needle2 = m_needle1; + n2enabled = true; + } else { + if (m_renderer->elementExists(n2)) { + m_needle2->setSharedRenderer(m_renderer); + m_needle2->setElementId(n2); + //l_scene->addItem(m_needle2); + n2enabled = true; + } + } + + if (m_renderer->elementExists(n3)) { + m_needle3->setSharedRenderer(m_renderer); + m_needle3->setElementId(n3); + //l_scene->addItem(m_needle3); + n3enabled = true; + } + + if (m_renderer->elementExists(fg)) { + m_foreground->setSharedRenderer(m_renderer); + m_foreground->setElementId(fg); + // Center it on the scene + QRectF rectB = m_background->boundingRect(); + QRectF rectF = m_foreground->boundingRect(); + m_foreground->setPos(rectB.width()/2-rectF.width()/2,rectB.height()/2-rectF.height()/2); + //l_scene->addItem(m_foreground); + fgenabled = true; + } + + rotateN1 = false; + horizN1 = false; + vertN1 = false; + rotateN2 = false; + horizN2 = false; + vertN2 = false; + rotateN3 = false; + horizN3 = false; + vertN3 = false; + + // Now setup the rotation/translation settings: + // this is UGLY UGLY UGLY, sorry... + if (n1Move.contains("Rotate")) { + rotateN1 = true; + } else if (n1Move.contains("Horizontal")) { + horizN1 = true; + } else if (n1Move.contains("Vertical")) { + vertN1 = true; + } + + if (n2Move.contains("Rotate")) { + rotateN2 = true; + } else if (n2Move.contains("Horizontal")) { + horizN2 = true; + } else if (n2Move.contains("Vertical")) { + vertN2 = true; + } + + if (n3Move.contains("Rotate")) { + rotateN3 = true; + } else if (n3Move.contains("Horizontal")) { + horizN3 = true; + } else if (n3Move.contains("Vertical")) { + vertN3 = true; + } + + l_scene->setSceneRect(m_background->boundingRect()); + + // Now Initialize the center for all transforms of the dial needles to the + // center of the background: + // - Move the center of the needle to the center of the background. + QRectF rectB = m_background->boundingRect(); + QRectF rectN = m_needle1->boundingRect(); + m_needle1->setPos(rectB.width()/2-rectN.width()/2,rectB.height()/2-rectN.height()/2); + // - Put the transform origin point of the needle at its center. + m_needle1->setTransformOriginPoint(rectN.width()/2,rectN.height()/2); + + // Check whether the dial also wants display the numeric value: + if (m_renderer->elementExists(n1+"-text")) { + QMatrix textMatrix = m_renderer->matrixForElement(n1+"-text"); + qreal startX = textMatrix.mapRect(m_renderer->boundsOnElement(n1+"-text")).x(); + qreal startY = textMatrix.mapRect(m_renderer->boundsOnElement(n1+"-text")).y(); + QTransform matrix; + matrix.translate(startX,startY); + m_text1 = new QGraphicsTextItem("0.00"); + m_text1->setDefaultTextColor(QColor("White")); + m_text1->setTransform(matrix,false); + l_scene->addItem(m_text1); + } else { + m_text1 = NULL; + } + + + if ((n1 != n2) && n2enabled) { + // Only do it for needle2 if it is not the same as n1 + rectN = m_needle2->boundingRect(); + m_needle2->setPos(rectB.width()/2-rectN.width()/2,rectB.height()/2-rectN.height()/2); + m_needle2->setTransformOriginPoint(rectN.width()/2,rectN.height()/2); + // Check whether the dial also wants display the numeric value: + if (m_renderer->elementExists(n2+"-text")) { + QMatrix textMatrix = m_renderer->matrixForElement(n2+"-text"); + qreal startX = textMatrix.mapRect(m_renderer->boundsOnElement(n2+"-text")).x(); + qreal startY = textMatrix.mapRect(m_renderer->boundsOnElement(n2+"-text")).y(); + QTransform matrix; + matrix.translate(startX,startY); + m_text2 = new QGraphicsTextItem("0.00"); + m_text2->setDefaultTextColor(QColor("White")); + m_text2->setTransform(matrix,false); + l_scene->addItem(m_text2); + } else { + m_text2 = NULL; + } + + } + if (n3enabled) { + rectN = m_needle3->boundingRect(); + m_needle3->setPos(rectB.width()/2-rectN.width()/2,rectB.height()/2-rectN.height()/2); + m_needle3->setTransformOriginPoint(rectN.width()/2,rectN.height()/2); + // Check whether the dial also wants display the numeric value: + if (m_renderer->elementExists(n3+"-text")) { + QMatrix textMatrix = m_renderer->matrixForElement(n3+"-text"); + qreal startX = textMatrix.mapRect(m_renderer->boundsOnElement(n3+"-text")).x(); + qreal startY = textMatrix.mapRect(m_renderer->boundsOnElement(n3+"-text")).y(); + QTransform matrix; + matrix.translate(startX,startY); + m_text3 = new QGraphicsTextItem("0.00"); + m_text3->setDefaultTextColor(QColor("White")); + m_text3->setTransform(matrix,false); + l_scene->addItem(m_text3); + } else { + m_text3 = NULL; + } + + } + + // Last: we just loaded the dial file which is by default positioned on a "zero" value + // of the needles, so we have to reset the needle values too upon dial file loading, otherwise + // we would end up with an offset whenever we change a dial file and the needle value + // is not zero at that time. + needle1Value = 0; + needle2Value = 0; + needle3Value = 0; + if (!dialTimer.isActive()) + dialTimer.start(); + dialError = false; + } + else + { + qDebug()<<"no file: display default background."; + m_renderer->load(QString(":/dial/images/empty.svg")); + l_scene->clear(); // This also deletes all items contained in the scene. + m_background = new QGraphicsSvgItem(); + m_background->setSharedRenderer(m_renderer); + l_scene->addItem(m_background); + m_text1 = NULL; + m_text2 = NULL; + m_text3 = NULL; + m_needle1 = NULL; + m_needle2 = NULL; + m_needle3 = NULL; + dialError = true; + } +} + +void DialGadgetWidget::paint() +{ + update(); +} + +void DialGadgetWidget::paintEvent(QPaintEvent *event) +{ + // Skip painting until the dial file is loaded + if (! m_renderer->isValid()) { + qDebug()<<"Dial file not loaded, not rendering"; + return; + } + QGraphicsView::paintEvent(event); +} + +// This event enables the dial to be dynamically resized +// whenever the gadget is resized, taking advantage of the vector +// nature of SVG dials. +void DialGadgetWidget::resizeEvent(QResizeEvent *event) +{ + Q_UNUSED(event); + fitInView(m_background, Qt::KeepAspectRatio ); +} + +void DialGadgetWidget::setDialFont(QString fontProps) +{ + QFont font = QFont("Arial",12); + font.fromString(fontProps); + if (m_text1) { + m_text1->setFont(font); + } +} + + +// Converts the value into an angle: +// this enables smooth rotation in rotateNeedles below +void DialGadgetWidget::setNeedle1(double value) { + if (rotateN1) { + needle1Target = 360*(value*n1Factor-n1MinValue)/(n1MaxValue-n1MinValue); + } + if (horizN1) { + needle1Target = (value*n1Factor-n1MinValue)/(n1MaxValue-n1MinValue); + } + if (vertN1) { + needle1Target = (value*n1Factor-n1MinValue)/(n1MaxValue-n1MinValue); + } + if (!dialTimer.isActive()) + dialTimer.start(); + if (m_text1) { + QString s; + s.sprintf("%.2f",value*n1Factor); + m_text1->setPlainText(s); + } +} + +void DialGadgetWidget::setNeedle2(double value) { + if (rotateN2) { + needle2Target = 360*(value*n2Factor-n2MinValue)/(n2MaxValue-n2MinValue); + } + if (horizN2) { + needle2Target = (value*n2Factor-n2MinValue)/(n2MaxValue-n2MinValue); + } + if (vertN2) { + needle2Target = (value*n2Factor-n2MinValue)/(n2MaxValue-n2MinValue); + } + if (!dialTimer.isActive()) + dialTimer.start(); + if (m_text2) { + QString s; + s.sprintf("%.2f",value*n2Factor); + m_text2->setPlainText(s); + } + +} + +void DialGadgetWidget::setNeedle3(double value) { + if (rotateN3) { + needle3Target = 360*(value*n3Factor-n3MinValue)/(n3MaxValue-n3MinValue); + } + if (horizN3) { + needle3Target = (value*n3Factor-n3MinValue)/(n3MaxValue-n3MinValue); + } + if (vertN3) { + needle3Target = (value*n3Factor-n3MinValue)/(n3MaxValue-n3MinValue); + } + if (!dialTimer.isActive()) + dialTimer.start(); + if (m_text3) { + QString s; + s.sprintf("%.2f",value*n3Factor); + m_text3->setPlainText(s); + } +} + +// Take an input value and rotate the dial accordingly +// Rotation is smooth, starts fast and slows down when +// approaching the target. +// We aim for a 0.5 degree precision. +// +// Note: this code is valid even if needle1 and needle2 point +// to the same element. +void DialGadgetWidget::rotateNeedles() +{ + if (dialError) { + // We get there in case the dial file is missing or corrupt. + dialTimer.stop(); + return; + } + int dialRun = 3; + if (n2enabled) { + double needle2Diff; + if (abs((needle2Value-needle2Target)*10) > 5) { + needle2Diff =(needle2Target - needle2Value)/5; + } else { + needle2Diff = needle2Target - needle2Value; + dialRun--; + } + if (rotateN2) { + m_needle2->setRotation(m_needle2->rotation()+needle2Diff); + } else { + QPointF opd = QPointF(0,0); + if (horizN2) { + opd = QPointF(needle2Diff,0); + } + if (vertN2) { + opd = QPointF(0,needle2Diff); + } + m_needle2->setTransform(QTransform::fromTranslate(opd.x(),opd.y()), true); + // Since we have moved the needle, we need to move + // the transform origin point the opposite way + // so that it keeps rotating from the same point. + // (this is only useful if needle1 and needle2 are the + // same object, for combined movement such as attitude indicator). + QPointF oop = m_needle2->transformOriginPoint(); + m_needle2->setTransformOriginPoint(oop.x()-opd.x(),oop.y()-opd.y()); + } + needle2Value += needle2Diff; + } else { + dialRun--; + } + + // We assume that needle1 always exists! + double needle1Diff; + if ((abs((needle1Value-needle1Target)*10) > 5)) { + needle1Diff = (needle1Target - needle1Value)/5; + } else { + needle1Diff = needle1Target - needle1Value; + dialRun--; + } + if (rotateN1) { + m_needle1->setRotation(m_needle1->rotation()+needle1Diff); + } else { + QPointF opd = QPointF(0,0); + if (horizN1) { + opd = QPointF(needle1Diff,0); + } + if (vertN1) { + opd = QPointF(0,needle1Diff); + } + m_needle1->setTransform(QTransform::fromTranslate(opd.x(),opd.y()), true); + QPointF oop = m_needle1->transformOriginPoint(); + m_needle1->setTransformOriginPoint((oop.x()-opd.x()),(oop.y()-opd.y())); + } + needle1Value += needle1Diff; + + if (n3enabled) { + double needle3Diff; + if ((abs((needle3Value-needle3Target)*10) > 5)) { + needle3Diff = (needle3Target - needle3Value)/5; + } else { + needle3Diff = needle3Target - needle3Value; + dialRun--; + } + if (rotateN3) { + m_needle3->setRotation(m_needle3->rotation()+needle3Diff); + } else { + QPointF opd = QPointF(0,0); + if (horizN3) { + opd = QPointF(needle3Diff,0); + } + if (vertN3) { + opd = QPointF(0,needle3Diff); + } + m_needle3->setTransform(QTransform::fromTranslate(opd.x(),opd.y()), true); + QPointF oop = m_needle3->transformOriginPoint(); + m_needle3->setTransformOriginPoint((oop.x()-opd.x()),(oop.y()-opd.y())); + } + needle3Value += needle3Diff; + } else { + dialRun--; + } + + // Now check: if dialRun is now zero, we should + // just stop the timer since all needles have finished moving + if (!dialRun) dialTimer.stop(); +} diff --git a/ground/openpilotgcs/src/plugins/dial/dialgadgetwidget.h b/ground/openpilotgcs/src/plugins/dial/dialgadgetwidget.h index 29291b7dd..a7e0ab787 100644 --- a/ground/openpilotgcs/src/plugins/dial/dialgadgetwidget.h +++ b/ground/openpilotgcs/src/plugins/dial/dialgadgetwidget.h @@ -1,150 +1,151 @@ -/** - ****************************************************************************** - * - * @file dialgadgetwidget.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @see The GNU Public License (GPL) Version 3 - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup DialPlugin Dial Plugin - * @{ - * @brief Plots flight information rotary style dials - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef DIALGADGETWIDGET_H_ -#define DIALGADGETWIDGET_H_ - -#include "dialgadgetconfiguration.h" -#include "extensionsystem/pluginmanager.h" -#include "uavobjectmanager.h" -#include "uavobject.h" -#include -#include -#include - -#include -#include - -class DialGadgetWidget : public QGraphicsView -{ - Q_OBJECT - -public: - DialGadgetWidget(QWidget *parent = 0); - ~DialGadgetWidget(); - void setDialFile(QString dfn, QString bg, QString fg, QString n1, QString n2, QString n3, - QString n1Move, QString n2Move, QString n3Move); - void paint(); - // setNeedle1 and setNeedle2 use a timer to simulate - // needle inertia - void setNeedle1(double value); - void setNeedle2(double value); - void setNeedle3(double value); - void setN1Min(double value) {n1MinValue = value;} - void setN1Max(double value) {n1MaxValue = value;} - void setN1Factor(double value) {n1Factor = value;} - void setN2Min(double value) {n2MinValue = value;} - void setN2Max(double value) {n2MaxValue = value;} - void setN2Factor(double value) {n2Factor = value;} - void setN3Min(double value) {n3MinValue = value;} - void setN3Max(double value) {n3MaxValue = value;} - void setN3Factor(double value) {n3Factor = value;} - // Sets up needle/UAVObject connections: - void connectNeedles(QString object1, QString field1, - QString object2, QString field2, - QString object3, QString field3); - void setDialFont(QString fontProps); - -public slots: - void updateNeedle1(UAVObject *object1); // Called by the UAVObject - void updateNeedle2(UAVObject *object2); // Called by the UAVObject - void updateNeedle3(UAVObject *object3); // Called by the UAVObject - -protected: - void paintEvent(QPaintEvent *event); - void resizeEvent(QResizeEvent *event); - - -private slots: - void rotateNeedles(); - -private: - QSvgRenderer *m_renderer; - QGraphicsSvgItem *m_background; - QGraphicsSvgItem *m_foreground; - QGraphicsSvgItem *m_needle1; - QGraphicsSvgItem *m_needle2; - QGraphicsSvgItem *m_needle3; - QGraphicsTextItem *m_text1; - QGraphicsTextItem *m_text2; - QGraphicsTextItem *m_text3; - - bool n3enabled; - bool n2enabled; // Simple flag to skip rendering if the - bool fgenabled; // layer does not exist. - bool dialError ; - - // Settings concerning move of the dials - bool rotateN1; - bool rotateN2; - bool rotateN3; - bool horizN1; - bool horizN2; - bool horizN3; - bool vertN1; - bool vertN2; - bool vertN3; - - double n1MinValue; - double n1MaxValue; - double n1Factor; - double n2MinValue; - double n2MaxValue; - double n2Factor; - double n3MinValue; - double n3MaxValue; - double n3Factor; - - // The Value and target variables - // are expressed in degrees - double needle1Target; - double needle1Value; - double needle2Target; - double needle2Value; - double needle3Target; - double needle3Value; - - // Name of the fields to read when an update is received: - UAVDataObject* obj1; - UAVDataObject* obj2; - UAVDataObject* obj3; - QString field1; - QString subfield1; - bool haveSubField1; - QString field2; - QString subfield2; - bool haveSubField2; - QString field3; - QString subfield3; - bool haveSubField3; - - // Rotation timer - QTimer dialTimer; - -}; -#endif /* DIALGADGETWIDGET_H_ */ +/** + ****************************************************************************** + * + * @file dialgadgetwidget.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @see The GNU Public License (GPL) Version 3 + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup DialPlugin Dial Plugin + * @{ + * @brief Plots flight information rotary style dials + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef DIALGADGETWIDGET_H_ +#define DIALGADGETWIDGET_H_ + +#include "dialgadgetconfiguration.h" +#include "extensionsystem/pluginmanager.h" +#include "uavobjectmanager.h" +#include "uavobject.h" +#include +#include +#include + +#include +#include + +class DialGadgetWidget : public QGraphicsView +{ + Q_OBJECT + +public: + DialGadgetWidget(QWidget *parent = 0); + ~DialGadgetWidget(); + void enableOpenGL(bool flag); + void setDialFile(QString dfn, QString bg, QString fg, QString n1, QString n2, QString n3, + QString n1Move, QString n2Move, QString n3Move); + void paint(); + // setNeedle1 and setNeedle2 use a timer to simulate + // needle inertia + void setNeedle1(double value); + void setNeedle2(double value); + void setNeedle3(double value); + void setN1Min(double value) {n1MinValue = value;} + void setN1Max(double value) {n1MaxValue = value;} + void setN1Factor(double value) {n1Factor = value;} + void setN2Min(double value) {n2MinValue = value;} + void setN2Max(double value) {n2MaxValue = value;} + void setN2Factor(double value) {n2Factor = value;} + void setN3Min(double value) {n3MinValue = value;} + void setN3Max(double value) {n3MaxValue = value;} + void setN3Factor(double value) {n3Factor = value;} + // Sets up needle/UAVObject connections: + void connectNeedles(QString object1, QString field1, + QString object2, QString field2, + QString object3, QString field3); + void setDialFont(QString fontProps); + +public slots: + void updateNeedle1(UAVObject *object1); // Called by the UAVObject + void updateNeedle2(UAVObject *object2); // Called by the UAVObject + void updateNeedle3(UAVObject *object3); // Called by the UAVObject + +protected: + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); + + +private slots: + void rotateNeedles(); + +private: + QSvgRenderer *m_renderer; + QGraphicsSvgItem *m_background; + QGraphicsSvgItem *m_foreground; + QGraphicsSvgItem *m_needle1; + QGraphicsSvgItem *m_needle2; + QGraphicsSvgItem *m_needle3; + QGraphicsTextItem *m_text1; + QGraphicsTextItem *m_text2; + QGraphicsTextItem *m_text3; + + bool n3enabled; + bool n2enabled; // Simple flag to skip rendering if the + bool fgenabled; // layer does not exist. + bool dialError ; + + // Settings concerning move of the dials + bool rotateN1; + bool rotateN2; + bool rotateN3; + bool horizN1; + bool horizN2; + bool horizN3; + bool vertN1; + bool vertN2; + bool vertN3; + + double n1MinValue; + double n1MaxValue; + double n1Factor; + double n2MinValue; + double n2MaxValue; + double n2Factor; + double n3MinValue; + double n3MaxValue; + double n3Factor; + + // The Value and target variables + // are expressed in degrees + double needle1Target; + double needle1Value; + double needle2Target; + double needle2Value; + double needle3Target; + double needle3Value; + + // Name of the fields to read when an update is received: + UAVDataObject* obj1; + UAVDataObject* obj2; + UAVDataObject* obj3; + QString field1; + QString subfield1; + bool haveSubField1; + QString field2; + QString subfield2; + bool haveSubField2; + QString field3; + QString subfield3; + bool haveSubField3; + + // Rotation timer + QTimer dialTimer; + +}; +#endif /* DIALGADGETWIDGET_H_ */ diff --git a/ground/openpilotgcs/src/plugins/lineardial/lineardial.pro b/ground/openpilotgcs/src/plugins/lineardial/lineardial.pro index cc0a5d5a1..a76a60f39 100644 --- a/ground/openpilotgcs/src/plugins/lineardial/lineardial.pro +++ b/ground/openpilotgcs/src/plugins/lineardial/lineardial.pro @@ -1,6 +1,7 @@ TEMPLATE = lib TARGET = LineardialGadget QT += svg +QT += opengl include(../../openpilotgcsplugin.pri) include(../../plugins/coreplugin/coreplugin.pri) include(lineardial_dependencies.pri) diff --git a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadget.cpp b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadget.cpp index fe29f5793..1f1e66de7 100644 --- a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadget.cpp +++ b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadget.cpp @@ -1,60 +1,61 @@ -/** - ****************************************************************************** - * - * @file lineardialgadget.cpp - * @author Edouard Lafargue Copyright (C) 2010. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup LinearDialPlugin Linear Dial Plugin - * @{ - * @brief Impliments a gadget that displays linear gauges - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "lineardialgadget.h" -#include "lineardialgadgetwidget.h" -#include "lineardialgadgetconfiguration.h" - -LineardialGadget::LineardialGadget(QString classId, LineardialGadgetWidget *widget, QWidget *parent) : - IUAVGadget(classId, parent), - m_widget(widget) -{ -} - -LineardialGadget::~LineardialGadget() -{ -} - -/* - This is called when a configuration is loaded, and updates the plugin's settings. - Careful: the plugin is already drawn before the loadConfiguration method is called the - first time, so you have to be careful not to assume all the plugin values are initialized - the first time you use them - */ -void LineardialGadget::loadConfiguration(IUAVGadgetConfiguration* config) -{ - LineardialGadgetConfiguration *m = qobject_cast(config); - m_widget->setFactor(m->getFactor()); - m_widget->setDecimalPlaces(m->getDecimalPlaces()); - m_widget->setRange(m->getMin(),m->getMax()); - m_widget->setGreenRange(m->getGreenMin(), m->getGreenMax()); - m_widget->setYellowRange(m->getYellowMin(), m->getYellowMax()); - m_widget->setRedRange(m->getRedMin(), m->getRedMax()); - m_widget->setDialFile(m->getDialFile()); // Triggers widget repaint - m_widget->setDialFont(m->getFont()); - m_widget->connectInput(m->getSourceDataObject(), m->getSourceObjectField()); -} +/** + ****************************************************************************** + * + * @file lineardialgadget.cpp + * @author Edouard Lafargue Copyright (C) 2010. + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup LinearDialPlugin Linear Dial Plugin + * @{ + * @brief Impliments a gadget that displays linear gauges + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "lineardialgadget.h" +#include "lineardialgadgetwidget.h" +#include "lineardialgadgetconfiguration.h" + +LineardialGadget::LineardialGadget(QString classId, LineardialGadgetWidget *widget, QWidget *parent) : + IUAVGadget(classId, parent), + m_widget(widget) +{ +} + +LineardialGadget::~LineardialGadget() +{ +} + +/* + This is called when a configuration is loaded, and updates the plugin's settings. + Careful: the plugin is already drawn before the loadConfiguration method is called the + first time, so you have to be careful not to assume all the plugin values are initialized + the first time you use them + */ +void LineardialGadget::loadConfiguration(IUAVGadgetConfiguration* config) +{ + LineardialGadgetConfiguration *m = qobject_cast(config); + m_widget->setFactor(m->getFactor()); + m_widget->setDecimalPlaces(m->getDecimalPlaces()); + m_widget->setRange(m->getMin(),m->getMax()); + m_widget->setGreenRange(m->getGreenMin(), m->getGreenMax()); + m_widget->setYellowRange(m->getYellowMin(), m->getYellowMax()); + m_widget->setRedRange(m->getRedMin(), m->getRedMax()); + m_widget->setDialFile(m->getDialFile()); // Triggers widget repaint + m_widget->setDialFont(m->getFont()); + m_widget->connectInput(m->getSourceDataObject(), m->getSourceObjectField()); + m_widget->enableOpenGL(m->useOpenGL()); +} diff --git a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetconfiguration.cpp b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetconfiguration.cpp index 27d34d092..1911280d1 100644 --- a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetconfiguration.cpp +++ b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetconfiguration.cpp @@ -1,116 +1,119 @@ -/** - ****************************************************************************** - * - * @file lineardialgadgetconfiguration.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup LinearDialPlugin Linear Dial Plugin - * @{ - * @brief Implements a gadget that displays linear gauges - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "lineardialgadgetconfiguration.h" -#include "utils/pathutils.h" - -/** - * Loads a saved configuration or defaults if non exist. - * - */ -LineardialGadgetConfiguration::LineardialGadgetConfiguration(QString classId, QSettings* qSettings, QObject *parent) : - IUAVGadgetConfiguration(classId, parent), - dialFile("Unknown"), - sourceDataObject("Unknown"), - sourceObjectField("Unknown"), - minValue(0), - maxValue(100), - redMin(0), - redMax(33), - yellowMin(33), - yellowMax(66), - greenMin(66), - greenMax(100), - factor(1.00), - decimalPlaces(0) -{ - //if a saved configuration exists load it - if(qSettings != 0) { - QString dFile = qSettings->value("dFile").toString(); - dialFile = Utils::PathUtils().InsertDataPath(dFile); - sourceDataObject = qSettings->value("sourceDataObject").toString(); - sourceObjectField = qSettings->value("sourceObjectField").toString(); - minValue = qSettings->value("minValue").toDouble(); - maxValue = qSettings->value("maxValue").toDouble(); - redMin = qSettings->value("redMin").toDouble(); - redMax = qSettings->value("redMax").toDouble(); - yellowMin = qSettings->value("yellowMin").toDouble(); - yellowMax = qSettings->value("yellowMax").toDouble(); - greenMin = qSettings->value("greenMin").toDouble(); - greenMax = qSettings->value("greenMax").toDouble(); - font = qSettings->value("font").toString(); - decimalPlaces = qSettings->value("decimalPlaces").toInt(); - factor = qSettings->value("factor").toDouble(); - } -} - -/** - * Clones a configuration. - * - */ -IUAVGadgetConfiguration *LineardialGadgetConfiguration::clone() -{ - LineardialGadgetConfiguration *m = new LineardialGadgetConfiguration(this->classId()); - m->dialFile=dialFile; - m->sourceDataObject = sourceDataObject; - m->sourceObjectField = sourceObjectField; - m->minValue = minValue; - m->maxValue = maxValue; - m->redMin = redMin; - m->redMax = redMax; - m->yellowMin = yellowMin; - m->yellowMax = yellowMax; - m->greenMin = greenMin; - m->greenMax = greenMax; - m->font = font; - m->decimalPlaces = decimalPlaces; - m->factor = factor; - - return m; -} - -/** - * Saves a configuration. - * - */ -void LineardialGadgetConfiguration::saveConfig(QSettings* qSettings) const { - QString dFile = Utils::PathUtils().RemoveDataPath(dialFile); - qSettings->setValue("dFile", dFile); - qSettings->setValue("sourceDataObject", sourceDataObject); - qSettings->setValue("sourceObjectField", sourceObjectField); - qSettings->setValue("minValue", minValue); - qSettings->setValue("maxValue", maxValue); - qSettings->setValue("redMin", redMin); - qSettings->setValue("redMax", redMax); - qSettings->setValue("yellowMin", yellowMin); - qSettings->setValue("yellowMax", yellowMax); - qSettings->setValue("greenMin", greenMin); - qSettings->setValue("greenMax", greenMax); - qSettings->setValue("font", font); - qSettings->setValue("decimalPlaces", decimalPlaces); - qSettings->setValue("factor", factor); -} +/** + ****************************************************************************** + * + * @file lineardialgadgetconfiguration.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup LinearDialPlugin Linear Dial Plugin + * @{ + * @brief Implements a gadget that displays linear gauges + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "lineardialgadgetconfiguration.h" +#include "utils/pathutils.h" + +/** + * Loads a saved configuration or defaults if non exist. + * + */ +LineardialGadgetConfiguration::LineardialGadgetConfiguration(QString classId, QSettings* qSettings, QObject *parent) : + IUAVGadgetConfiguration(classId, parent), + dialFile("Unknown"), + sourceDataObject("Unknown"), + sourceObjectField("Unknown"), + minValue(0), + maxValue(100), + redMin(0), + redMax(33), + yellowMin(33), + yellowMax(66), + greenMin(66), + greenMax(100), + factor(1.00), + decimalPlaces(0) +{ + //if a saved configuration exists load it + if(qSettings != 0) { + QString dFile = qSettings->value("dFile").toString(); + dialFile = Utils::PathUtils().InsertDataPath(dFile); + sourceDataObject = qSettings->value("sourceDataObject").toString(); + sourceObjectField = qSettings->value("sourceObjectField").toString(); + minValue = qSettings->value("minValue").toDouble(); + maxValue = qSettings->value("maxValue").toDouble(); + redMin = qSettings->value("redMin").toDouble(); + redMax = qSettings->value("redMax").toDouble(); + yellowMin = qSettings->value("yellowMin").toDouble(); + yellowMax = qSettings->value("yellowMax").toDouble(); + greenMin = qSettings->value("greenMin").toDouble(); + greenMax = qSettings->value("greenMax").toDouble(); + font = qSettings->value("font").toString(); + decimalPlaces = qSettings->value("decimalPlaces").toInt(); + factor = qSettings->value("factor").toDouble(); + useOpenGLFlag = qSettings->value("useOpenGLFlag").toBool(); + } +} + +/** + * Clones a configuration. + * + */ +IUAVGadgetConfiguration *LineardialGadgetConfiguration::clone() +{ + LineardialGadgetConfiguration *m = new LineardialGadgetConfiguration(this->classId()); + m->dialFile=dialFile; + m->sourceDataObject = sourceDataObject; + m->sourceObjectField = sourceObjectField; + m->minValue = minValue; + m->maxValue = maxValue; + m->redMin = redMin; + m->redMax = redMax; + m->yellowMin = yellowMin; + m->yellowMax = yellowMax; + m->greenMin = greenMin; + m->greenMax = greenMax; + m->font = font; + m->decimalPlaces = decimalPlaces; + m->factor = factor; + m->useOpenGLFlag = useOpenGLFlag; + + return m; +} + +/** + * Saves a configuration. + * + */ +void LineardialGadgetConfiguration::saveConfig(QSettings* qSettings) const { + QString dFile = Utils::PathUtils().RemoveDataPath(dialFile); + qSettings->setValue("dFile", dFile); + qSettings->setValue("sourceDataObject", sourceDataObject); + qSettings->setValue("sourceObjectField", sourceObjectField); + qSettings->setValue("minValue", minValue); + qSettings->setValue("maxValue", maxValue); + qSettings->setValue("redMin", redMin); + qSettings->setValue("redMax", redMax); + qSettings->setValue("yellowMin", yellowMin); + qSettings->setValue("yellowMax", yellowMax); + qSettings->setValue("greenMin", greenMin); + qSettings->setValue("greenMax", greenMax); + qSettings->setValue("font", font); + qSettings->setValue("decimalPlaces", decimalPlaces); + qSettings->setValue("factor", factor); + qSettings->setValue("useOpenGLFlag", useOpenGLFlag); +} diff --git a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetconfiguration.h b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetconfiguration.h index 59aedb35f..d8991c0c1 100644 --- a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetconfiguration.h +++ b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetconfiguration.h @@ -1,104 +1,109 @@ -/** - ****************************************************************************** - * - * @file lineardialgadgetconfiguration.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup LinearDialPlugin Linear Dial Plugin - * @{ - * @brief Impliments a gadget that displays linear gauges - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef LINEARDIALGADGETCONFIGURATION_H -#define LINEARDIALGADGETCONFIGURATION_H - -#include - -using namespace Core; - -/* This is a generic bargraph dial - supporting one indicator. - */ -class LineardialGadgetConfiguration : public IUAVGadgetConfiguration -{ -Q_OBJECT -public: - explicit LineardialGadgetConfiguration(QString classId, QSettings* qSettings = 0, QObject *parent = 0); - - //set dial configuration functions - void setDialFile(QString filename){dialFile=filename;} - void setRange(double min, double max) { minValue = min; maxValue = max;} - void setGreenRange(double min, double max) { greenMin = min; greenMax = max;} - void setYellowRange(double min, double max) { yellowMin = min; yellowMax = max;} - void setRedRange(double min, double max) { redMin = min; redMax = max;} - - void setFont(QString text) { font = text; } - - void setFactor(double val) { factor = val; } - void setDecimalPlaces (int val) { decimalPlaces = val; } - - void setSourceDataObject(QString text) {sourceDataObject = text; } - void setSourceObjField(QString text) { sourceObjectField = text; } - - //get dial configuration functions - QString getDialFile() {return dialFile;} - double getMin() { return minValue;} - double getMax() { return maxValue;} - double getGreenMin(){ return greenMin;} - double getGreenMax(){ return greenMax;} - double getYellowMin(){ return yellowMin;} - double getYellowMax(){ return yellowMax;} - double getRedMin(){ return redMin;} - double getRedMax(){ return redMax;} - QString getSourceDataObject() { return sourceDataObject;} - QString getSourceObjectField() { return sourceObjectField;} - QString getFont() { return font;} - int getDecimalPlaces() { return decimalPlaces; } - double getFactor() { return factor; } - - void saveConfig(QSettings* settings) const; - IUAVGadgetConfiguration *clone(); - -private: - // A linear or "bargraph" dial contains: - // * A SVG background file - // The source file should have at least the following IDs - // defined: "background", "green", "yellow", "red", "needle" - QString dialFile; - // * The name of the UAVObject field to display - QString sourceDataObject; - QString sourceObjectField; - // The font used for the dial - QString font; - // * The minimum and maximum values to be displayed - double minValue; - double maxValue; - // * Three start-stop values for green/yellow/red - double redMin; - double redMax; - double yellowMin; - double yellowMax; - double greenMin; - double greenMax; - double factor; - - int decimalPlaces; -}; - -#endif // LINEARDIALGADGETCONFIGURATION_H +/** + ****************************************************************************** + * + * @file lineardialgadgetconfiguration.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup LinearDialPlugin Linear Dial Plugin + * @{ + * @brief Impliments a gadget that displays linear gauges + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef LINEARDIALGADGETCONFIGURATION_H +#define LINEARDIALGADGETCONFIGURATION_H + +#include + +using namespace Core; + +/* This is a generic bargraph dial + supporting one indicator. + */ +class LineardialGadgetConfiguration : public IUAVGadgetConfiguration +{ +Q_OBJECT +public: + explicit LineardialGadgetConfiguration(QString classId, QSettings* qSettings = 0, QObject *parent = 0); + + //set dial configuration functions + void setDialFile(QString filename){dialFile=filename;} + void setRange(double min, double max) { minValue = min; maxValue = max;} + void setGreenRange(double min, double max) { greenMin = min; greenMax = max;} + void setYellowRange(double min, double max) { yellowMin = min; yellowMax = max;} + void setRedRange(double min, double max) { redMin = min; redMax = max;} + + void setFont(QString text) { font = text; } + + void setFactor(double val) { factor = val; } + void setDecimalPlaces (int val) { decimalPlaces = val; } + + void setSourceDataObject(QString text) {sourceDataObject = text; } + void setSourceObjField(QString text) { sourceObjectField = text; } + + void setUseOpenGL(bool flag) { useOpenGLFlag = flag; } + + //get dial configuration functions + QString getDialFile() {return dialFile;} + double getMin() { return minValue;} + double getMax() { return maxValue;} + double getGreenMin(){ return greenMin;} + double getGreenMax(){ return greenMax;} + double getYellowMin(){ return yellowMin;} + double getYellowMax(){ return yellowMax;} + double getRedMin(){ return redMin;} + double getRedMax(){ return redMax;} + QString getSourceDataObject() { return sourceDataObject;} + QString getSourceObjectField() { return sourceObjectField;} + QString getFont() { return font;} + int getDecimalPlaces() { return decimalPlaces; } + double getFactor() { return factor; } + bool useOpenGL() { return useOpenGLFlag; } + + void saveConfig(QSettings* settings) const; + IUAVGadgetConfiguration *clone(); + +private: + // A linear or "bargraph" dial contains: + // * A SVG background file + // The source file should have at least the following IDs + // defined: "background", "green", "yellow", "red", "needle" + QString dialFile; + // * The name of the UAVObject field to display + QString sourceDataObject; + QString sourceObjectField; + // The font used for the dial + QString font; + // * The minimum and maximum values to be displayed + double minValue; + double maxValue; + // * Three start-stop values for green/yellow/red + double redMin; + double redMax; + double yellowMin; + double yellowMax; + double greenMin; + double greenMax; + + double factor; + bool useOpenGLFlag; + + int decimalPlaces; +}; + +#endif // LINEARDIALGADGETCONFIGURATION_H diff --git a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetoptionspage.cpp b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetoptionspage.cpp index 517c20c31..9afe42172 100644 --- a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetoptionspage.cpp @@ -1,205 +1,207 @@ -/** - ****************************************************************************** - * - * @file lineardialgadgetoptionspage.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup LinearDialPlugin Linear Dial Plugin - * @{ - * @brief Impliments a gadget that displays linear gauges - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "lineardialgadgetoptionspage.h" -#include "lineardialgadgetconfiguration.h" -#include "ui_lineardialgadgetoptionspage.h" -#include "extensionsystem/pluginmanager.h" -#include "uavobjectmanager.h" -#include "uavdataobject.h" - -#include -#include -#include -#include - -LineardialGadgetOptionsPage::LineardialGadgetOptionsPage(LineardialGadgetConfiguration *config, QObject *parent) : - IOptionsPage(parent), - m_config(config) -{ - font = QFont("Arial", 12); // Default in case nothing exists yet. -} - -//creates options page widget (uses the UI file) -QWidget *LineardialGadgetOptionsPage::createPage(QWidget *parent) -{ - - Q_UNUSED(parent); - options_page = new Ui::LineardialGadgetOptionsPage(); - //main widget - QWidget *optionsPageWidget = new QWidget; - //main layout - options_page->setupUi(optionsPageWidget); - - - // Restore the contents from the settings: - options_page->svgSourceFile->setExpectedKind(Utils::PathChooser::File); - options_page->svgSourceFile->setPromptDialogFilter(tr("SVG image (*.svg)")); - options_page->svgSourceFile->setPromptDialogTitle(tr("Choose SVG image")); - options_page->svgSourceFile->setPath(m_config->getDialFile()); - options_page->minValue->setValue(m_config->getMin()); - options_page->maxValue->setValue(m_config->getMax()); - // Do this by hand (in case value is zero, no signal would - // be sent! - on_rangeMin_valueChanged(m_config->getMin()); - on_rangeMax_valueChanged(m_config->getMax()); - options_page->greenMin->setValue(m_config->getGreenMin()); - options_page->greenMax->setValue(m_config->getGreenMax()); - options_page->yellowMin->setValue(m_config->getYellowMin()); - options_page->yellowMax->setValue(m_config->getYellowMax()); - options_page->redMin->setValue(m_config->getRedMin()); - options_page->redMax->setValue(m_config->getRedMax()); - options_page->factor->setValue(m_config->getFactor()); - options_page->decPlaces->setValue(m_config->getDecimalPlaces()); - font.fromString(m_config->getFont()); - - // Fills the combo boxes for the UAVObjects - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - QList< QList > objList = objManager->getDataObjects(); - foreach (QList list, objList) { - foreach (UAVDataObject* obj, list) { - options_page->objectName->addItem(obj->getName()); - } - } - //select saved UAV Object field values - if(options_page->objectName->findText(m_config->getSourceDataObject())!=-1){ - options_page->objectName->setCurrentIndex(options_page->objectName->findText(m_config->getSourceDataObject())); - // Now load the object field values: - UAVDataObject* obj = dynamic_cast( objManager->getObject(m_config->getSourceDataObject()) ); - if (obj != NULL ) { - on_objectName_currentIndexChanged(m_config->getSourceDataObject()); - // And set the highlighed value from the settings: - options_page->objectField->setCurrentIndex(options_page->objectField->findText(m_config->getSourceObjectField())); - } - } - - connect(options_page->objectName, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_objectName_currentIndexChanged(QString))); - connect(options_page->fontPicker, SIGNAL(clicked()), this, SLOT(on_fontPicker_clicked())); - connect(options_page->minValue, SIGNAL(valueChanged(double)), this, SLOT(on_rangeMin_valueChanged(double))); - connect(options_page->maxValue, SIGNAL(valueChanged(double)), this, SLOT(on_rangeMax_valueChanged(double))); - - return optionsPageWidget; -} - -/** - * Used to make sure the green/yellow/red ranges are consistent - * with the overall dial range - */ -void LineardialGadgetOptionsPage::on_rangeMin_valueChanged(double val) -{ - options_page->maxValue->setMinimum(val); - - options_page->greenMin->setMinimum(val); - options_page->yellowMin->setMinimum(val); - options_page->redMin->setMinimum(val); - - options_page->greenMax->setMinimum(val); - options_page->yellowMax->setMinimum(val); - options_page->redMax->setMinimum(val); - -} - -/** - * Used to make sure the green/yellow/red ranges are consistent - * with the overall dial range - */ -void LineardialGadgetOptionsPage::on_rangeMax_valueChanged(double val) -{ - options_page->minValue->setMaximum(val); - - - options_page->greenMax->setMaximum(val); - options_page->yellowMax->setMaximum(val); - options_page->redMax->setMaximum(val); - - options_page->greenMin->setMaximum(val); - options_page->yellowMin->setMaximum(val); - options_page->redMin->setMaximum(val); -} - - -/** - * Called when the user presses apply or OK. - * - * Saves the current values - * - */ -void LineardialGadgetOptionsPage::apply() -{ - m_config->setDialFile(options_page->svgSourceFile->path()); - double rangeMin = options_page->minValue->value(); - double rangeMax = options_page->maxValue->value(); - m_config->setRange(rangeMin,rangeMax); - m_config->setGreenRange(options_page->greenMin->value(),options_page->greenMax->value()); - m_config->setYellowRange(options_page->yellowMin->value(),options_page->yellowMax->value()); - m_config->setRedRange(options_page->redMin->value(),options_page->redMax->value()); - m_config->setSourceDataObject(options_page->objectName->currentText()); - m_config->setSourceObjField(options_page->objectField->currentText()); - m_config->setFont(font.toString()); - m_config->setDecimalPlaces(options_page->decPlaces->value()); - m_config->setFactor(options_page->factor->value()); -} - -/** - * Opens a font picker. - * - */ -void LineardialGadgetOptionsPage::on_fontPicker_clicked() -{ - bool ok; - font = QFontDialog::getFont(&ok, font , qobject_cast(this)); -} - - -/* - Fills in the field1 combo box when value is changed in the - object1 field -*/ -void LineardialGadgetOptionsPage::on_objectName_currentIndexChanged(QString val) { - options_page->objectField->clear(); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { - if(field->getElementNames().count() > 1) - { - foreach(QString elemName , field->getElementNames()) - { - options_page->objectField->addItem(field->getName() + "-" + elemName); - } - } - else - options_page->objectField->addItem(field->getName()); - } -} - -void LineardialGadgetOptionsPage::finish() -{ - -} +/** + ****************************************************************************** + * + * @file lineardialgadgetoptionspage.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup LinearDialPlugin Linear Dial Plugin + * @{ + * @brief Impliments a gadget that displays linear gauges + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "lineardialgadgetoptionspage.h" +#include "lineardialgadgetconfiguration.h" +#include "ui_lineardialgadgetoptionspage.h" +#include "extensionsystem/pluginmanager.h" +#include "uavobjectmanager.h" +#include "uavdataobject.h" + +#include +#include +#include +#include + +LineardialGadgetOptionsPage::LineardialGadgetOptionsPage(LineardialGadgetConfiguration *config, QObject *parent) : + IOptionsPage(parent), + m_config(config) +{ + font = QFont("Arial", 12); // Default in case nothing exists yet. +} + +//creates options page widget (uses the UI file) +QWidget *LineardialGadgetOptionsPage::createPage(QWidget *parent) +{ + + Q_UNUSED(parent); + options_page = new Ui::LineardialGadgetOptionsPage(); + //main widget + QWidget *optionsPageWidget = new QWidget; + //main layout + options_page->setupUi(optionsPageWidget); + + + // Restore the contents from the settings: + options_page->svgSourceFile->setExpectedKind(Utils::PathChooser::File); + options_page->svgSourceFile->setPromptDialogFilter(tr("SVG image (*.svg)")); + options_page->svgSourceFile->setPromptDialogTitle(tr("Choose SVG image")); + options_page->svgSourceFile->setPath(m_config->getDialFile()); + options_page->minValue->setValue(m_config->getMin()); + options_page->maxValue->setValue(m_config->getMax()); + // Do this by hand (in case value is zero, no signal would + // be sent! + on_rangeMin_valueChanged(m_config->getMin()); + on_rangeMax_valueChanged(m_config->getMax()); + options_page->greenMin->setValue(m_config->getGreenMin()); + options_page->greenMax->setValue(m_config->getGreenMax()); + options_page->yellowMin->setValue(m_config->getYellowMin()); + options_page->yellowMax->setValue(m_config->getYellowMax()); + options_page->redMin->setValue(m_config->getRedMin()); + options_page->redMax->setValue(m_config->getRedMax()); + options_page->factor->setValue(m_config->getFactor()); + options_page->decPlaces->setValue(m_config->getDecimalPlaces()); + options_page->useOpenGL->setChecked(m_config->useOpenGL()); + font.fromString(m_config->getFont()); + + // Fills the combo boxes for the UAVObjects + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); + QList< QList > objList = objManager->getDataObjects(); + foreach (QList list, objList) { + foreach (UAVDataObject* obj, list) { + options_page->objectName->addItem(obj->getName()); + } + } + //select saved UAV Object field values + if(options_page->objectName->findText(m_config->getSourceDataObject())!=-1){ + options_page->objectName->setCurrentIndex(options_page->objectName->findText(m_config->getSourceDataObject())); + // Now load the object field values: + UAVDataObject* obj = dynamic_cast( objManager->getObject(m_config->getSourceDataObject()) ); + if (obj != NULL ) { + on_objectName_currentIndexChanged(m_config->getSourceDataObject()); + // And set the highlighed value from the settings: + options_page->objectField->setCurrentIndex(options_page->objectField->findText(m_config->getSourceObjectField())); + } + } + + connect(options_page->objectName, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_objectName_currentIndexChanged(QString))); + connect(options_page->fontPicker, SIGNAL(clicked()), this, SLOT(on_fontPicker_clicked())); + connect(options_page->minValue, SIGNAL(valueChanged(double)), this, SLOT(on_rangeMin_valueChanged(double))); + connect(options_page->maxValue, SIGNAL(valueChanged(double)), this, SLOT(on_rangeMax_valueChanged(double))); + + return optionsPageWidget; +} + +/** + * Used to make sure the green/yellow/red ranges are consistent + * with the overall dial range + */ +void LineardialGadgetOptionsPage::on_rangeMin_valueChanged(double val) +{ + options_page->maxValue->setMinimum(val); + + options_page->greenMin->setMinimum(val); + options_page->yellowMin->setMinimum(val); + options_page->redMin->setMinimum(val); + + options_page->greenMax->setMinimum(val); + options_page->yellowMax->setMinimum(val); + options_page->redMax->setMinimum(val); + +} + +/** + * Used to make sure the green/yellow/red ranges are consistent + * with the overall dial range + */ +void LineardialGadgetOptionsPage::on_rangeMax_valueChanged(double val) +{ + options_page->minValue->setMaximum(val); + + + options_page->greenMax->setMaximum(val); + options_page->yellowMax->setMaximum(val); + options_page->redMax->setMaximum(val); + + options_page->greenMin->setMaximum(val); + options_page->yellowMin->setMaximum(val); + options_page->redMin->setMaximum(val); +} + + +/** + * Called when the user presses apply or OK. + * + * Saves the current values + * + */ +void LineardialGadgetOptionsPage::apply() +{ + m_config->setDialFile(options_page->svgSourceFile->path()); + double rangeMin = options_page->minValue->value(); + double rangeMax = options_page->maxValue->value(); + m_config->setRange(rangeMin,rangeMax); + m_config->setGreenRange(options_page->greenMin->value(),options_page->greenMax->value()); + m_config->setYellowRange(options_page->yellowMin->value(),options_page->yellowMax->value()); + m_config->setRedRange(options_page->redMin->value(),options_page->redMax->value()); + m_config->setSourceDataObject(options_page->objectName->currentText()); + m_config->setSourceObjField(options_page->objectField->currentText()); + m_config->setFont(font.toString()); + m_config->setDecimalPlaces(options_page->decPlaces->value()); + m_config->setFactor(options_page->factor->value()); + m_config->setUseOpenGL(options_page->useOpenGL->checkState()); +} + +/** + * Opens a font picker. + * + */ +void LineardialGadgetOptionsPage::on_fontPicker_clicked() +{ + bool ok; + font = QFontDialog::getFont(&ok, font , qobject_cast(this)); +} + + +/* + Fills in the field1 combo box when value is changed in the + object1 field +*/ +void LineardialGadgetOptionsPage::on_objectName_currentIndexChanged(QString val) { + options_page->objectField->clear(); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); + UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); + QList fieldList = obj->getFields(); + foreach (UAVObjectField* field, fieldList) { + if(field->getElementNames().count() > 1) + { + foreach(QString elemName , field->getElementNames()) + { + options_page->objectField->addItem(field->getName() + "-" + elemName); + } + } + else + options_page->objectField->addItem(field->getName()); + } +} + +void LineardialGadgetOptionsPage::finish() +{ + +} diff --git a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetoptionspage.ui b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetoptionspage.ui index 1e2617627..1d94b3cf4 100644 --- a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetoptionspage.ui +++ b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetoptionspage.ui @@ -1,525 +1,546 @@ - - - LineardialGadgetOptionsPage - - - - 0 - 0 - 540 - 347 - - - - - 0 - 0 - - - - Form - - - - - -1 - -1 - 533 - 321 - - - - - QLayout::SetMinimumSize - - - 10 - - - 5 - - - 10 - - - 10 - - - - - 10 - - - QLayout::SetMaximumSize - - - 10 - - - - - Dial SVG: - - - - - - - - 0 - 0 - - - - - - - - - - - - - 0 - 0 - - - - Whole range: - - - - - - - Min: - - - - - - - - 0 - 0 - - - - 3 - - - -99999.000000000000000 - - - 99999.990000000005239 - - - - - - - Max: - - - - - - - - 0 - 0 - - - - 3 - - - -99999.000000000000000 - - - 99999.990000000005239 - - - - - - - - - Qt::Horizontal - - - - - - - - - - 0 - 0 - - - - Green: - - - - - - - Min: - - - - - - - - 0 - 0 - - - - 3 - - - -99999.000000000000000 - - - 99999.990000000005239 - - - - - - - Max: - - - - - - - - 0 - 0 - - - - 3 - - - -99999.000000000000000 - - - 99999.990000000005239 - - - - - - - - - Qt::Horizontal - - - - - - - - - - 0 - 0 - - - - Yellow: - - - - - - - Min: - - - - - - - - 0 - 0 - - - - 3 - - - -99999.000000000000000 - - - 99999.990000000005239 - - - - - - - Max: - - - - - - - - 0 - 0 - - - - 3 - - - -99999.000000000000000 - - - 99999.990000000005239 - - - - - - - - - Qt::Horizontal - - - - - - - - - - 0 - 0 - - - - Red: - - - - - - - Min: - - - - - - - - 0 - 0 - - - - 3 - - - -99999.000000000000000 - - - 99999.990000000005239 - - - - - - - Max: - - - - - - - - 0 - 0 - - - - 3 - - - -99999.000000000000000 - - - 99999.990000000005239 - - - - - - - - - - - - 0 - 0 - - - - Input: - - - - - - - ObjectName - - - - - - - - 0 - 0 - - - - - - - - ObjectField - - - - - - - - 0 - 0 - - - - - - - - - - 0 - - - - - - 0 - 0 - - - - Dial font: - - - - - - - Select... - - - - - - - Decimal places: - - - - - - - 99 - - - - - - - Factor: - - - - - - - 6 - - - -10000.000000000000000 - - - 100000.000000000000000 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - Utils::PathChooser - QWidget -
utils/pathchooser.h
- 1 -
-
- - -
+ + + LineardialGadgetOptionsPage + + + + 0 + 0 + 540 + 347 + + + + + 0 + 0 + + + + Form + + + + + -1 + -1 + 533 + 321 + + + + + QLayout::SetMinimumSize + + + 10 + + + 5 + + + 10 + + + 10 + + + + + + + Use OpenGL + + + true + + + + + + + + + Qt::Horizontal + + + + + + + 10 + + + QLayout::SetMaximumSize + + + 10 + + + + + Dial SVG: + + + + + + + + 0 + 0 + + + + + + + + + + + + + 0 + 0 + + + + Whole range: + + + + + + + Min: + + + + + + + + 0 + 0 + + + + 3 + + + -99999.000000000000000 + + + 99999.990000000005239 + + + + + + + Max: + + + + + + + + 0 + 0 + + + + 3 + + + -99999.000000000000000 + + + 99999.990000000005239 + + + + + + + + + Qt::Horizontal + + + + + + + + + + 0 + 0 + + + + Green: + + + + + + + Min: + + + + + + + + 0 + 0 + + + + 3 + + + -99999.000000000000000 + + + 99999.990000000005239 + + + + + + + Max: + + + + + + + + 0 + 0 + + + + 3 + + + -99999.000000000000000 + + + 99999.990000000005239 + + + + + + + + + Qt::Horizontal + + + + + + + + + + 0 + 0 + + + + Yellow: + + + + + + + Min: + + + + + + + + 0 + 0 + + + + 3 + + + -99999.000000000000000 + + + 99999.990000000005239 + + + + + + + Max: + + + + + + + + 0 + 0 + + + + 3 + + + -99999.000000000000000 + + + 99999.990000000005239 + + + + + + + + + Qt::Horizontal + + + + + + + + + + 0 + 0 + + + + Red: + + + + + + + Min: + + + + + + + + 0 + 0 + + + + 3 + + + -99999.000000000000000 + + + 99999.990000000005239 + + + + + + + Max: + + + + + + + + 0 + 0 + + + + 3 + + + -99999.000000000000000 + + + 99999.990000000005239 + + + + + + + + + + + + 0 + 0 + + + + Input: + + + + + + + ObjectName + + + + + + + + 0 + 0 + + + + + + + + ObjectField + + + + + + + + 0 + 0 + + + + + + + + + + 0 + + + + + + 0 + 0 + + + + Dial font: + + + + + + + Select... + + + + + + + Decimal places: + + + + + + + 99 + + + + + + + Factor: + + + + + + + 6 + + + -10000.000000000000000 + + + 100000.000000000000000 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Utils::PathChooser + QWidget +
utils/pathchooser.h
+ 1 +
+
+ + +
diff --git a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetwidget.cpp index 261e4af67..914ad663d 100644 --- a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetwidget.cpp @@ -1,431 +1,443 @@ -/** - ****************************************************************************** - * - * @file lineardialgadgetwidget.cpp - * @author Edouard Lafargue Copyright (C) 2010. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup LinearDialPlugin Linear Dial Plugin - * @{ - * @brief Implements a gadget that displays linear gauges and generic indicators - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "lineardialgadgetwidget.h" -#include -#include -#include - -LineardialGadgetWidget::LineardialGadgetWidget(QWidget *parent) : QGraphicsView(parent) -{ - setMinimumSize(32,32); - setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - setScene(new QGraphicsScene(this)); - setRenderHints(QPainter::Antialiasing); - m_renderer = new QSvgRenderer(); - verticalDial = false; - - paint(); - - obj1 = NULL; - fieldName = NULL; - fieldValue = NULL; - indexTarget = 0; - indexValue = 0; - places = 0; - factor = 1; - - // This timer mechanism makes the index rotate smoothly - connect(&dialTimer, SIGNAL(timeout()), this, SLOT(moveIndex())); - dialTimer.start(30); - -} - -LineardialGadgetWidget::~LineardialGadgetWidget() -{ - // Do nothing -} - -/*! - \brief Connects the widget to the relevant UAVObjects - */ -void LineardialGadgetWidget::connectInput(QString object1, QString nfield1) { - - if (obj1 != NULL) - disconnect(obj1,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(updateIndex(UAVObject*))); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - - // qDebug() << "Lineardial Connect needles - " << object1 << "-"<< nfield1; - - // Check validity of arguments first, reject empty args and unknown fields. - if (!(object1.isEmpty() || nfield1.isEmpty())) { - obj1 = dynamic_cast( objManager->getObject(object1) ); - if (obj1 != NULL ) { - connect(obj1, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateIndex(UAVObject*))); - if(nfield1.contains("-")) - { - QStringList fieldSubfield = nfield1.split("-", QString::SkipEmptyParts); - field1 = fieldSubfield.at(0); - subfield1 = fieldSubfield.at(1); - haveSubField1 = true; - } - else - { - field1= nfield1; - haveSubField1 = false; - } - if (fieldName) - fieldName->setPlainText(nfield1); - updateIndex(obj1); - - } else { - qDebug() << "Error: Object is unknown (" << object1 << ") this should not happen."; - } - } -} - -/*! - \brief Called by the UAVObject which got updated - - Updates the numeric value and/or the icon if the dial wants this. - */ -void LineardialGadgetWidget::updateIndex(UAVObject *object1) { - // Double check that the field exists: - UAVObjectField* field = object1->getField(field1); - if (field) { - QString s; - if (field->isNumeric()) { - double v; - if(haveSubField1){ - int indexOfSubField = field->getElementNames().indexOf(QRegExp(subfield1, Qt::CaseSensitive, QRegExp::FixedString)); - v = field->getDouble(indexOfSubField)*factor; - }else - v = field->getDouble()*factor; - setIndex(v); - s.sprintf("%.*f",places,v); - } - if (field->isText()) { - s = field->getValue().toString(); - if (fieldSymbol) { - // If we defined a symbol, we will look for a matching - // SVG element to display: - if (m_renderer->elementExists("symbol-" + s)) { - fieldSymbol->setElementId("symbol-" + s); - } else { - fieldSymbol->setElementId("symbol"); - } - } - } - - if (fieldValue) - fieldValue->setPlainText(s); - - if (index && !dialTimer.isActive()) - dialTimer.start(); - } else { - qDebug() << "Wrong field, maybe an issue with object disconnection ?"; - } -} - -/*! - \brief Setup dial using its master SVG template. - - Should only be called after the min/max ranges have been set. - - */ -void LineardialGadgetWidget::setDialFile(QString dfn) -{ - QGraphicsScene *l_scene = scene(); - setBackgroundBrush(QBrush(Utils::StyleHelper::baseColor())); - if (QFile::exists(dfn) && m_renderer->load(dfn) && m_renderer->isValid() ) - { - l_scene->clear(); // Beware: clear also deletes all objects - // which are currently in the scene - background = new QGraphicsSvgItem(); - background->setSharedRenderer(m_renderer); - background->setElementId("background"); - background->setFlags(QGraphicsItem::ItemClipsChildrenToShape| - QGraphicsItem::ItemClipsToShape); - l_scene->addItem(background); - - // The red/yellow/green zones are optional, we just - // test on the presence of "red" - if (m_renderer->elementExists("red")) { - // Order is important: red, then yellow then green - // overlayed on top of each other - red = new QGraphicsSvgItem(); - red->setSharedRenderer(m_renderer); - red->setElementId("red"); - red->setParentItem(background); - yellow = new QGraphicsSvgItem(); - yellow->setSharedRenderer(m_renderer); - yellow->setElementId("yellow"); - yellow->setParentItem(background); - green = new QGraphicsSvgItem(); - green->setSharedRenderer(m_renderer); - green->setElementId("green"); - green->setParentItem(background); - // In order to properly render the Green/Yellow/Red graphs, we need to find out - // the starting location of the bargraph rendering area: - QMatrix textMatrix = m_renderer->matrixForElement("bargraph"); - qreal bgX = textMatrix.mapRect(m_renderer->boundsOnElement("bargraph")).x(); - qreal bgY = textMatrix.mapRect(m_renderer->boundsOnElement("bargraph")).y(); - bargraphSize = textMatrix.mapRect(m_renderer->boundsOnElement("bargraph")).width(); - // Detect if the bargraph is vertical or horizontal. - qreal bargraphHeight = textMatrix.mapRect(m_renderer->boundsOnElement("bargraph")).height(); - if (bargraphHeight > bargraphSize) { - verticalDial = true; - bargraphSize = bargraphHeight; - } else { - verticalDial = false; - } - // Now adjust the red/yellow/green zones: - double range = maxValue-minValue; - - green->resetTransform(); - double greenScale = (greenMax-greenMin)/range; - double greenStart = verticalDial ? (maxValue-greenMax)/range*green->boundingRect().height() : - (greenMin-minValue)/range*green->boundingRect().width(); - QTransform matrix; - matrix.reset(); - if (verticalDial) { - matrix.scale(1,greenScale); - matrix.translate(bgX,(greenStart+bgY)/greenScale); - } else { - matrix.scale(greenScale,1); - matrix.translate((greenStart+bgX)/greenScale,bgY); - } - green->setTransform(matrix,false); - - yellow->resetTransform(); - double yellowScale = (yellowMax-yellowMin)/range; - double yellowStart = verticalDial ? (maxValue-yellowMax)/range*yellow->boundingRect().height() : - (yellowMin-minValue)/range*yellow->boundingRect().width(); - matrix.reset(); - if (verticalDial) { - matrix.scale(1,yellowScale); - matrix.translate(bgX,(yellowStart+bgY)/yellowScale); - } else { - matrix.scale(yellowScale,1); - matrix.translate((yellowStart+bgX)/yellowScale,bgY); - } - yellow->setTransform(matrix,false); - - red->resetTransform(); - double redScale = (redMax-redMin)/range; - double redStart = verticalDial ? (maxValue-redMax)/range*red->boundingRect().height() : - (redMin-minValue)/range*red->boundingRect().width(); - matrix.reset(); - if (verticalDial) { - matrix.scale(1,redScale); - matrix.translate(bgX,(redStart+bgY)/redScale); - } else { - matrix.scale(redScale,1); - matrix.translate((redStart+bgX)/redScale,bgY); - } - red->setTransform(matrix,false); - - } else { - red = NULL; - yellow = NULL; - green = NULL; - } - - // Check whether the dial wants to display a moving index: - if (m_renderer->elementExists("needle")) { - QMatrix textMatrix = m_renderer->matrixForElement("needle"); - QRectF nRect = textMatrix.mapRect(m_renderer->boundsOnElement("needle")); - startX = nRect.x(); - startY = nRect.y(); - QTransform matrix; - matrix.translate(startX,startY); - index = new QGraphicsSvgItem(); - index->setSharedRenderer(m_renderer); - index->setElementId("needle"); - index->setTransform(matrix,false); - index->setParentItem(background); - } else { - index = NULL; - } - - // Check whether the dial wants display its field name: - if (m_renderer->elementExists("field")) { - QMatrix textMatrix = m_renderer->matrixForElement("field"); - QRectF rect = textMatrix.mapRect(m_renderer->boundsOnElement("field")); - qreal startX = rect.x(); - qreal startY = rect.y(); - qreal elHeight = rect.height(); - QTransform matrix; - matrix.translate(startX,startY-elHeight/2); - fieldName = new QGraphicsTextItem("field"); - fieldName->setFont(QFont("Arial",(int)elHeight)); - fieldName->setDefaultTextColor(QColor("White")); - fieldName->setTransform(matrix,false); - fieldName->setParentItem(background); - } else { - fieldName = NULL; - } - - // Check whether the dial wants display the numeric value: - if (m_renderer->elementExists("value")) { - QMatrix textMatrix = m_renderer->matrixForElement("value"); - QRectF nRect = textMatrix.mapRect(m_renderer->boundsOnElement("value")); - qreal startX = nRect.x(); - qreal startY = nRect.y(); - qreal elHeight = nRect.height(); - QTransform matrix; - matrix.translate(startX,startY-elHeight/2); - fieldValue = new QGraphicsTextItem("0.00"); - fieldValue->setFont(QFont("Arial",(int)elHeight)); - fieldValue->setDefaultTextColor(QColor("White")); - fieldValue->setTransform(matrix,false); - fieldValue->setParentItem(background); - } else { - fieldValue = NULL; - } - - // Check whether the dial wants to display the value as a - // symbol (only works for text values): - if (m_renderer->elementExists("symbol")) { - QMatrix textMatrix = m_renderer->matrixForElement("symbol"); - qreal startX = textMatrix.mapRect(m_renderer->boundsOnElement("symbol")).x(); - qreal startY = textMatrix.mapRect(m_renderer->boundsOnElement("symbol")).y(); - QTransform matrix; - matrix.translate(startX,startY); - fieldSymbol = new QGraphicsSvgItem(); - fieldSymbol->setElementId("symbol"); - fieldSymbol->setSharedRenderer(m_renderer); - fieldSymbol->setTransform(matrix,false); - fieldSymbol->setParentItem(background); - } else { - fieldSymbol = NULL; - } - - if (m_renderer->elementExists("foreground")) { - foreground = new QGraphicsSvgItem(); - foreground->setSharedRenderer(m_renderer); - foreground->setElementId("foreground"); - foreground->setParentItem(background); - fgenabled = true; - } else { - fgenabled = false; - } - - l_scene->setSceneRect(background->boundingRect()); - - // Reset the current index value: - indexValue = 0; - if (!dialTimer.isActive() && index) - dialTimer.start(); - } - else - { - qDebug() << "no file "; - m_renderer->load(QString(":/lineardial/images/empty.svg")); - l_scene->clear(); // This also deletes all items contained in the scene. - background = new QGraphicsSvgItem(); - background->setSharedRenderer(m_renderer); - l_scene->addItem(background); - fieldName = NULL; - fieldValue = NULL; - fieldSymbol = NULL; - index = NULL; - } -} - - -void LineardialGadgetWidget::setDialFont(QString fontProps) -{ - // Note: a bit of juggling to preserve the automatic - // font size which was calculated upon dial initialization. - QFont font = QFont("Arial",12); - font.fromString(fontProps); - if (fieldName) { - int fieldSize = fieldName->font().pointSize(); - font.setPointSize(fieldSize); - fieldName->setFont(font); - } - if (fieldValue) { - int fieldSize = fieldValue->font().pointSize(); - font.setPointSize(fieldSize); - fieldValue->setFont(font); - } -} - - -void LineardialGadgetWidget::paint() -{ - update(); -} - -void LineardialGadgetWidget::paintEvent(QPaintEvent *event) -{ - // Skip painting until the dial file is loaded - if (! m_renderer->isValid()) { - qDebug()<<"Dial file not loaded, not rendering"; - return; - } - QGraphicsView::paintEvent(event); -} - -// This event enables the dial to be dynamically resized -// whenever the gadget is resized, taking advantage of the vector -// nature of SVG dials. -void LineardialGadgetWidget::resizeEvent(QResizeEvent *event) -{ - Q_UNUSED(event); - fitInView(background, Qt::KeepAspectRatio ); -} - -// Converts the value into an percentage: -// this enables smooth movement in moveIndex below -void LineardialGadgetWidget::setIndex(double value) { - if (verticalDial) { - indexTarget = 100*(maxValue-value)/(maxValue-minValue); - } else { - indexTarget = 100*(value-minValue)/(maxValue-minValue); - } -} - -// Take an input value and move the index accordingly -// Move is smooth, starts fast and slows down when -// approaching the target. -void LineardialGadgetWidget::moveIndex() -{ - if (!index) { // Safeguard - dialTimer.stop(); - return; - } - if ((abs((indexValue-indexTarget)*10) > 3)) { - indexValue += (indexTarget - indexValue)/5; - } else { - indexValue = indexTarget; - dialTimer.stop(); - } - QTransform matrix; - index->resetTransform(); - qreal trans = indexValue*bargraphSize/100; - if (verticalDial) { - matrix.translate(startX,trans+startY); - } else { - matrix.translate(trans+startX,startY); - } - index->setTransform(matrix,false); - - update(); -} +/** + ****************************************************************************** + * + * @file lineardialgadgetwidget.cpp + * @author Edouard Lafargue Copyright (C) 2010. + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup LinearDialPlugin Linear Dial Plugin + * @{ + * @brief Implements a gadget that displays linear gauges and generic indicators + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "lineardialgadgetwidget.h" +#include +#include +#include +#include + +LineardialGadgetWidget::LineardialGadgetWidget(QWidget *parent) : QGraphicsView(parent) +{ + setMinimumSize(32,32); + setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + setScene(new QGraphicsScene(this)); + setRenderHints(QPainter::Antialiasing); + m_renderer = new QSvgRenderer(); + verticalDial = false; + + paint(); + + obj1 = NULL; + fieldName = NULL; + fieldValue = NULL; + indexTarget = 0; + indexValue = 0; + places = 0; + factor = 1; + + // This timer mechanism makes the index rotate smoothly + connect(&dialTimer, SIGNAL(timeout()), this, SLOT(moveIndex())); + dialTimer.start(30); + +} + +LineardialGadgetWidget::~LineardialGadgetWidget() +{ + // Do nothing +} + +/*! + \brief Enables/Disables OpenGL + */ +void LineardialGadgetWidget::enableOpenGL(bool flag) +{ + if (flag) + setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); + else + setViewport(new QWidget); +} + +/*! + \brief Connects the widget to the relevant UAVObjects + */ +void LineardialGadgetWidget::connectInput(QString object1, QString nfield1) { + + if (obj1 != NULL) + disconnect(obj1,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(updateIndex(UAVObject*))); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); + + // qDebug() << "Lineardial Connect needles - " << object1 << "-"<< nfield1; + + // Check validity of arguments first, reject empty args and unknown fields. + if (!(object1.isEmpty() || nfield1.isEmpty())) { + obj1 = dynamic_cast( objManager->getObject(object1) ); + if (obj1 != NULL ) { + connect(obj1, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateIndex(UAVObject*))); + if(nfield1.contains("-")) + { + QStringList fieldSubfield = nfield1.split("-", QString::SkipEmptyParts); + field1 = fieldSubfield.at(0); + subfield1 = fieldSubfield.at(1); + haveSubField1 = true; + } + else + { + field1= nfield1; + haveSubField1 = false; + } + if (fieldName) + fieldName->setPlainText(nfield1); + updateIndex(obj1); + + } else { + qDebug() << "Error: Object is unknown (" << object1 << ") this should not happen."; + } + } +} + +/*! + \brief Called by the UAVObject which got updated + + Updates the numeric value and/or the icon if the dial wants this. + */ +void LineardialGadgetWidget::updateIndex(UAVObject *object1) { + // Double check that the field exists: + UAVObjectField* field = object1->getField(field1); + if (field) { + QString s; + if (field->isNumeric()) { + double v; + if(haveSubField1){ + int indexOfSubField = field->getElementNames().indexOf(QRegExp(subfield1, Qt::CaseSensitive, QRegExp::FixedString)); + v = field->getDouble(indexOfSubField)*factor; + }else + v = field->getDouble()*factor; + setIndex(v); + s.sprintf("%.*f",places,v); + } + if (field->isText()) { + s = field->getValue().toString(); + if (fieldSymbol) { + // If we defined a symbol, we will look for a matching + // SVG element to display: + if (m_renderer->elementExists("symbol-" + s)) { + fieldSymbol->setElementId("symbol-" + s); + } else { + fieldSymbol->setElementId("symbol"); + } + } + } + + if (fieldValue) + fieldValue->setPlainText(s); + + if (index && !dialTimer.isActive()) + dialTimer.start(); + } else { + qDebug() << "Wrong field, maybe an issue with object disconnection ?"; + } +} + +/*! + \brief Setup dial using its master SVG template. + + Should only be called after the min/max ranges have been set. + + */ +void LineardialGadgetWidget::setDialFile(QString dfn) +{ + QGraphicsScene *l_scene = scene(); + setBackgroundBrush(QBrush(Utils::StyleHelper::baseColor())); + if (QFile::exists(dfn) && m_renderer->load(dfn) && m_renderer->isValid() ) + { + l_scene->clear(); // Beware: clear also deletes all objects + // which are currently in the scene + background = new QGraphicsSvgItem(); + background->setSharedRenderer(m_renderer); + background->setElementId("background"); + background->setFlags(QGraphicsItem::ItemClipsChildrenToShape| + QGraphicsItem::ItemClipsToShape); + l_scene->addItem(background); + + // The red/yellow/green zones are optional, we just + // test on the presence of "red" + if (m_renderer->elementExists("red")) { + // Order is important: red, then yellow then green + // overlayed on top of each other + red = new QGraphicsSvgItem(); + red->setSharedRenderer(m_renderer); + red->setElementId("red"); + red->setParentItem(background); + yellow = new QGraphicsSvgItem(); + yellow->setSharedRenderer(m_renderer); + yellow->setElementId("yellow"); + yellow->setParentItem(background); + green = new QGraphicsSvgItem(); + green->setSharedRenderer(m_renderer); + green->setElementId("green"); + green->setParentItem(background); + // In order to properly render the Green/Yellow/Red graphs, we need to find out + // the starting location of the bargraph rendering area: + QMatrix textMatrix = m_renderer->matrixForElement("bargraph"); + qreal bgX = textMatrix.mapRect(m_renderer->boundsOnElement("bargraph")).x(); + qreal bgY = textMatrix.mapRect(m_renderer->boundsOnElement("bargraph")).y(); + bargraphSize = textMatrix.mapRect(m_renderer->boundsOnElement("bargraph")).width(); + // Detect if the bargraph is vertical or horizontal. + qreal bargraphHeight = textMatrix.mapRect(m_renderer->boundsOnElement("bargraph")).height(); + if (bargraphHeight > bargraphSize) { + verticalDial = true; + bargraphSize = bargraphHeight; + } else { + verticalDial = false; + } + // Now adjust the red/yellow/green zones: + double range = maxValue-minValue; + + green->resetTransform(); + double greenScale = (greenMax-greenMin)/range; + double greenStart = verticalDial ? (maxValue-greenMax)/range*green->boundingRect().height() : + (greenMin-minValue)/range*green->boundingRect().width(); + QTransform matrix; + matrix.reset(); + if (verticalDial) { + matrix.scale(1,greenScale); + matrix.translate(bgX,(greenStart+bgY)/greenScale); + } else { + matrix.scale(greenScale,1); + matrix.translate((greenStart+bgX)/greenScale,bgY); + } + green->setTransform(matrix,false); + + yellow->resetTransform(); + double yellowScale = (yellowMax-yellowMin)/range; + double yellowStart = verticalDial ? (maxValue-yellowMax)/range*yellow->boundingRect().height() : + (yellowMin-minValue)/range*yellow->boundingRect().width(); + matrix.reset(); + if (verticalDial) { + matrix.scale(1,yellowScale); + matrix.translate(bgX,(yellowStart+bgY)/yellowScale); + } else { + matrix.scale(yellowScale,1); + matrix.translate((yellowStart+bgX)/yellowScale,bgY); + } + yellow->setTransform(matrix,false); + + red->resetTransform(); + double redScale = (redMax-redMin)/range; + double redStart = verticalDial ? (maxValue-redMax)/range*red->boundingRect().height() : + (redMin-minValue)/range*red->boundingRect().width(); + matrix.reset(); + if (verticalDial) { + matrix.scale(1,redScale); + matrix.translate(bgX,(redStart+bgY)/redScale); + } else { + matrix.scale(redScale,1); + matrix.translate((redStart+bgX)/redScale,bgY); + } + red->setTransform(matrix,false); + + } else { + red = NULL; + yellow = NULL; + green = NULL; + } + + // Check whether the dial wants to display a moving index: + if (m_renderer->elementExists("needle")) { + QMatrix textMatrix = m_renderer->matrixForElement("needle"); + QRectF nRect = textMatrix.mapRect(m_renderer->boundsOnElement("needle")); + startX = nRect.x(); + startY = nRect.y(); + QTransform matrix; + matrix.translate(startX,startY); + index = new QGraphicsSvgItem(); + index->setSharedRenderer(m_renderer); + index->setElementId("needle"); + index->setTransform(matrix,false); + index->setParentItem(background); + } else { + index = NULL; + } + + // Check whether the dial wants display its field name: + if (m_renderer->elementExists("field")) { + QMatrix textMatrix = m_renderer->matrixForElement("field"); + QRectF rect = textMatrix.mapRect(m_renderer->boundsOnElement("field")); + qreal startX = rect.x(); + qreal startY = rect.y(); + qreal elHeight = rect.height(); + QTransform matrix; + matrix.translate(startX,startY-elHeight/2); + fieldName = new QGraphicsTextItem("field"); + fieldName->setFont(QFont("Arial",(int)elHeight)); + fieldName->setDefaultTextColor(QColor("White")); + fieldName->setTransform(matrix,false); + fieldName->setParentItem(background); + } else { + fieldName = NULL; + } + + // Check whether the dial wants display the numeric value: + if (m_renderer->elementExists("value")) { + QMatrix textMatrix = m_renderer->matrixForElement("value"); + QRectF nRect = textMatrix.mapRect(m_renderer->boundsOnElement("value")); + qreal startX = nRect.x(); + qreal startY = nRect.y(); + qreal elHeight = nRect.height(); + QTransform matrix; + matrix.translate(startX,startY-elHeight/2); + fieldValue = new QGraphicsTextItem("0.00"); + fieldValue->setFont(QFont("Arial",(int)elHeight)); + fieldValue->setDefaultTextColor(QColor("White")); + fieldValue->setTransform(matrix,false); + fieldValue->setParentItem(background); + } else { + fieldValue = NULL; + } + + // Check whether the dial wants to display the value as a + // symbol (only works for text values): + if (m_renderer->elementExists("symbol")) { + QMatrix textMatrix = m_renderer->matrixForElement("symbol"); + qreal startX = textMatrix.mapRect(m_renderer->boundsOnElement("symbol")).x(); + qreal startY = textMatrix.mapRect(m_renderer->boundsOnElement("symbol")).y(); + QTransform matrix; + matrix.translate(startX,startY); + fieldSymbol = new QGraphicsSvgItem(); + fieldSymbol->setElementId("symbol"); + fieldSymbol->setSharedRenderer(m_renderer); + fieldSymbol->setTransform(matrix,false); + fieldSymbol->setParentItem(background); + } else { + fieldSymbol = NULL; + } + + if (m_renderer->elementExists("foreground")) { + foreground = new QGraphicsSvgItem(); + foreground->setSharedRenderer(m_renderer); + foreground->setElementId("foreground"); + foreground->setParentItem(background); + fgenabled = true; + } else { + fgenabled = false; + } + + l_scene->setSceneRect(background->boundingRect()); + + // Reset the current index value: + indexValue = 0; + if (!dialTimer.isActive() && index) + dialTimer.start(); + } + else + { + qDebug() << "no file "; + m_renderer->load(QString(":/lineardial/images/empty.svg")); + l_scene->clear(); // This also deletes all items contained in the scene. + background = new QGraphicsSvgItem(); + background->setSharedRenderer(m_renderer); + l_scene->addItem(background); + fieldName = NULL; + fieldValue = NULL; + fieldSymbol = NULL; + index = NULL; + } +} + + +void LineardialGadgetWidget::setDialFont(QString fontProps) +{ + // Note: a bit of juggling to preserve the automatic + // font size which was calculated upon dial initialization. + QFont font = QFont("Arial",12); + font.fromString(fontProps); + if (fieldName) { + int fieldSize = fieldName->font().pointSize(); + font.setPointSize(fieldSize); + fieldName->setFont(font); + } + if (fieldValue) { + int fieldSize = fieldValue->font().pointSize(); + font.setPointSize(fieldSize); + fieldValue->setFont(font); + } +} + + +void LineardialGadgetWidget::paint() +{ + update(); +} + +void LineardialGadgetWidget::paintEvent(QPaintEvent *event) +{ + // Skip painting until the dial file is loaded + if (! m_renderer->isValid()) { + qDebug()<<"Dial file not loaded, not rendering"; + return; + } + QGraphicsView::paintEvent(event); +} + +// This event enables the dial to be dynamically resized +// whenever the gadget is resized, taking advantage of the vector +// nature of SVG dials. +void LineardialGadgetWidget::resizeEvent(QResizeEvent *event) +{ + Q_UNUSED(event); + fitInView(background, Qt::KeepAspectRatio ); +} + +// Converts the value into an percentage: +// this enables smooth movement in moveIndex below +void LineardialGadgetWidget::setIndex(double value) { + if (verticalDial) { + indexTarget = 100*(maxValue-value)/(maxValue-minValue); + } else { + indexTarget = 100*(value-minValue)/(maxValue-minValue); + } +} + +// Take an input value and move the index accordingly +// Move is smooth, starts fast and slows down when +// approaching the target. +void LineardialGadgetWidget::moveIndex() +{ + if (!index) { // Safeguard + dialTimer.stop(); + return; + } + if ((abs((indexValue-indexTarget)*10) > 3)) { + indexValue += (indexTarget - indexValue)/5; + } else { + indexValue = indexTarget; + dialTimer.stop(); + } + QTransform matrix; + index->resetTransform(); + qreal trans = indexValue*bargraphSize/100; + if (verticalDial) { + matrix.translate(startX,trans+startY); + } else { + matrix.translate(trans+startX,startY); + } + index->setTransform(matrix,false); + + update(); +} diff --git a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetwidget.h b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetwidget.h index c1734ec57..9e8030e0d 100644 --- a/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetwidget.h +++ b/ground/openpilotgcs/src/plugins/lineardial/lineardialgadgetwidget.h @@ -1,123 +1,124 @@ -/** - ****************************************************************************** - * - * @file lineardialgadgetwidget.h - * @author Edouard Lafargue Copyright (C) 2010. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup LinearDialPlugin Linear Dial Plugin - * @{ - * @brief Impliments a gadget that displays linear gauges - *****************************************************************************/ -/* - * This program 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. - * - * This program 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 this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef LINEARDIALGADGETWIDGET_H_ -#define LINEARDIALGADGETWIDGET_H_ - -#include "lineardialgadgetconfiguration.h" -#include "extensionsystem/pluginmanager.h" -#include "uavobjectmanager.h" -#include "uavobject.h" -#include -#include -#include - -#include -#include - -class LineardialGadgetWidget : public QGraphicsView -{ - Q_OBJECT - -public: - LineardialGadgetWidget(QWidget *parent = 0); - ~LineardialGadgetWidget(); - void setDialFile(QString dfn); - void paint(); - void setRange(double min, double max) { minValue=min; maxValue=max;} - void setGreenRange(double min, double max) {greenMin=min; greenMax=max;} - void setYellowRange(double min, double max) {yellowMin=min; yellowMax=max;} - void setRedRange(double min, double max) {redMin=min; redMax=max;} - void connectInput(QString obj, QString field); - void setIndex(double val); - void setDialFont(QString fontProps); - void setFactor (double val) { factor = val;} - void setDecimalPlaces(int val) { places = val;} - -public slots: - void updateIndex(UAVObject *object1); - - -protected: - void paintEvent(QPaintEvent *event); - void resizeEvent(QResizeEvent *event); - -private: - -private slots: - void moveIndex(); - -private: - QSvgRenderer *m_renderer; - QGraphicsSvgItem *background; - QGraphicsSvgItem *foreground; - QGraphicsSvgItem *index; - QGraphicsSvgItem *green; - QGraphicsSvgItem *yellow; - QGraphicsSvgItem *red; - QGraphicsSvgItem *fieldSymbol; - - QGraphicsTextItem *fieldName; - QGraphicsTextItem *fieldValue; - - // Simple flag to skip rendering if the - bool fgenabled; // layer does not exist. - bool verticalDial; // True if the dials scales vertically. - - qreal startX; // Where we should draw the bargraph - qreal startY; // green/yellow/red zones. - qreal bargraphSize; - qreal indexHeight; - qreal indexWidth; - - double minValue; - double maxValue; - double greenMin; - double greenMax; - double yellowMin; - double yellowMax; - double redMin; - double redMax; - double factor; - int places; - - // The Value and target variables - // are expressed in degrees - double indexTarget; - double indexValue; - - // Rotation timer - QTimer dialTimer; - - // Name of the fields to read when an update is received: - UAVDataObject* obj1; - QString field1; - QString subfield1; - bool haveSubField1; - -}; -#endif /* LINEARDIALGADGETWIDGET_H_ */ +/** + ****************************************************************************** + * + * @file lineardialgadgetwidget.h + * @author Edouard Lafargue Copyright (C) 2010. + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup LinearDialPlugin Linear Dial Plugin + * @{ + * @brief Impliments a gadget that displays linear gauges + *****************************************************************************/ +/* + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef LINEARDIALGADGETWIDGET_H_ +#define LINEARDIALGADGETWIDGET_H_ + +#include "lineardialgadgetconfiguration.h" +#include "extensionsystem/pluginmanager.h" +#include "uavobjectmanager.h" +#include "uavobject.h" +#include +#include +#include + +#include +#include + +class LineardialGadgetWidget : public QGraphicsView +{ + Q_OBJECT + +public: + LineardialGadgetWidget(QWidget *parent = 0); + ~LineardialGadgetWidget(); + void enableOpenGL(bool flag); + void setDialFile(QString dfn); + void paint(); + void setRange(double min, double max) { minValue=min; maxValue=max;} + void setGreenRange(double min, double max) {greenMin=min; greenMax=max;} + void setYellowRange(double min, double max) {yellowMin=min; yellowMax=max;} + void setRedRange(double min, double max) {redMin=min; redMax=max;} + void connectInput(QString obj, QString field); + void setIndex(double val); + void setDialFont(QString fontProps); + void setFactor (double val) { factor = val;} + void setDecimalPlaces(int val) { places = val;} + +public slots: + void updateIndex(UAVObject *object1); + + +protected: + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); + +private: + +private slots: + void moveIndex(); + +private: + QSvgRenderer *m_renderer; + QGraphicsSvgItem *background; + QGraphicsSvgItem *foreground; + QGraphicsSvgItem *index; + QGraphicsSvgItem *green; + QGraphicsSvgItem *yellow; + QGraphicsSvgItem *red; + QGraphicsSvgItem *fieldSymbol; + + QGraphicsTextItem *fieldName; + QGraphicsTextItem *fieldValue; + + // Simple flag to skip rendering if the + bool fgenabled; // layer does not exist. + bool verticalDial; // True if the dials scales vertically. + + qreal startX; // Where we should draw the bargraph + qreal startY; // green/yellow/red zones. + qreal bargraphSize; + qreal indexHeight; + qreal indexWidth; + + double minValue; + double maxValue; + double greenMin; + double greenMax; + double yellowMin; + double yellowMax; + double redMin; + double redMax; + double factor; + int places; + + // The Value and target variables + // are expressed in degrees + double indexTarget; + double indexValue; + + // Rotation timer + QTimer dialTimer; + + // Name of the fields to read when an update is received: + UAVDataObject* obj1; + QString field1; + QString subfield1; + bool haveSubField1; + +}; +#endif /* LINEARDIALGADGETWIDGET_H_ */