mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-02-21 11:54:15 +01:00
OP-42 GCS/Scope: The completed basic set of features to make this plug-in usable.
git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@978 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
parent
13168b6b4c
commit
760fc69cba
@ -29,10 +29,10 @@
|
||||
#include "plotdata.h"
|
||||
#include <math.h>
|
||||
|
||||
PlotData::PlotData(QString* p_uavObject, QString* p_uavField)
|
||||
PlotData::PlotData(QString p_uavObject, QString p_uavField)
|
||||
{
|
||||
uavObject = new QString(*p_uavObject);
|
||||
uavField = new QString(*p_uavField);
|
||||
uavObject = p_uavObject;
|
||||
uavField = p_uavField;
|
||||
|
||||
xData = new QVector<double>();
|
||||
yData = new QVector<double>();
|
||||
@ -47,8 +47,6 @@ PlotData::PlotData(QString* p_uavObject, QString* p_uavField)
|
||||
|
||||
PlotData::~PlotData()
|
||||
{
|
||||
delete uavObject;
|
||||
delete uavField;
|
||||
delete xData;
|
||||
delete yData;
|
||||
}
|
||||
@ -56,22 +54,19 @@ PlotData::~PlotData()
|
||||
|
||||
bool SequencialPlotData::append(UAVObject* obj)
|
||||
{
|
||||
if (*uavObject == obj->getName()) {
|
||||
if (uavObject == obj->getName()) {
|
||||
//Get the field of interest
|
||||
UAVObjectField* field = obj->getField(*uavField);
|
||||
UAVObjectField* field = obj->getField(uavField);
|
||||
|
||||
if (field) {
|
||||
//Shift data forward and put the new value at the front
|
||||
yData->append(field->getDouble() * pow(10, scalePower));
|
||||
if (yData->size() > m_xWindowSize) {
|
||||
yData->pop_front();
|
||||
|
||||
//Make the x-axis values scroll...
|
||||
//xData->append( xData->last() + 1 );
|
||||
//xData->pop_front();
|
||||
} else
|
||||
xData->insert(xData->size(), xData->size());
|
||||
|
||||
//notify the gui of changes in the data
|
||||
dataChanged();
|
||||
return true;
|
||||
}
|
||||
@ -82,9 +77,9 @@ bool SequencialPlotData::append(UAVObject* obj)
|
||||
|
||||
bool ChronoPlotData::append(UAVObject* obj)
|
||||
{
|
||||
if (*uavObject == obj->getName()) {
|
||||
if (uavObject == obj->getName()) {
|
||||
//Get the field of interest
|
||||
UAVObjectField* field = obj->getField(*uavField);
|
||||
UAVObjectField* field = obj->getField(uavField);
|
||||
|
||||
if (field) {
|
||||
//Put the new value at the front
|
||||
@ -97,6 +92,7 @@ bool ChronoPlotData::append(UAVObject* obj)
|
||||
//Remove stale data
|
||||
removeStaleData();
|
||||
|
||||
//notify the gui of chages in the data
|
||||
dataChanged();
|
||||
return true;
|
||||
}
|
||||
@ -135,4 +131,3 @@ bool UAVObjectPlotData::append(UAVObject* obj)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -43,6 +43,9 @@
|
||||
#include <QTime>
|
||||
#include <QVector>
|
||||
|
||||
/*!
|
||||
\brief Defines the different type of plots.
|
||||
*/
|
||||
enum PlotType {
|
||||
SequencialPlot,
|
||||
ChronoPlot,
|
||||
@ -51,25 +54,26 @@ enum PlotType {
|
||||
NPlotTypes
|
||||
};
|
||||
|
||||
|
||||
/*!
|
||||
\brief Base class that keeps the data for each curve in the plot.
|
||||
*/
|
||||
class PlotData : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PlotData(QString* uavObject, QString* uavField);
|
||||
PlotData(QString uavObject, QString uavField);
|
||||
~PlotData();
|
||||
|
||||
QString* uavObject;
|
||||
QString* uavField;
|
||||
QString uavObject;
|
||||
QString uavField;
|
||||
int scalePower; //This is the power to which each value must be raised
|
||||
double yMinimum;
|
||||
double yMaximum;
|
||||
double m_xWindowSize;
|
||||
QwtPlotCurve* curve;
|
||||
QVector<double>* xData;
|
||||
QVector<double>* yData;
|
||||
int scalePower; //This is the power to wich each value must be raised
|
||||
double yMinimum;
|
||||
double yMaximum;
|
||||
|
||||
double m_xWindowSize;
|
||||
|
||||
virtual bool append(UAVObject* obj) = 0;
|
||||
virtual PlotType plotType() = 0;
|
||||
@ -78,32 +82,45 @@ signals:
|
||||
void dataChanged();
|
||||
};
|
||||
|
||||
/*!
|
||||
\brief The sequencial plot have a fixed size buffer of data. All the curves in one plot
|
||||
have the same size buffer.
|
||||
*/
|
||||
class SequencialPlotData : public PlotData
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
SequencialPlotData(QString* uavObject, QString* uavField)
|
||||
SequencialPlotData(QString uavObject, QString uavField)
|
||||
: PlotData(uavObject, uavField) {}
|
||||
~SequencialPlotData() {}
|
||||
|
||||
/*!
|
||||
\brief Append new data to the plot
|
||||
*/
|
||||
bool append(UAVObject* obj);
|
||||
|
||||
/*!
|
||||
\brief The type of plot
|
||||
*/
|
||||
virtual PlotType plotType() {
|
||||
return SequencialPlot;
|
||||
}
|
||||
};
|
||||
|
||||
/*!
|
||||
\brief The chrono plot have a variable sized buffer of data, where the data is for a specified time period.
|
||||
*/
|
||||
class ChronoPlotData : public PlotData
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ChronoPlotData(QString* uavObject, QString* uavField)
|
||||
ChronoPlotData(QString uavObject, QString uavField, double refreshInterval)
|
||||
: PlotData(uavObject, uavField) {
|
||||
scalePower = 1;
|
||||
//Setup timer
|
||||
//Setup timer that removes stale data
|
||||
timer = new QTimer();
|
||||
connect(timer, SIGNAL(timeout()), this, SLOT(removeStaleDataTimeout()));
|
||||
timer->start(100);
|
||||
timer->start(refreshInterval * 1000);
|
||||
}
|
||||
~ChronoPlotData() {
|
||||
delete timer;
|
||||
@ -115,7 +132,6 @@ public:
|
||||
return ChronoPlot;
|
||||
}
|
||||
private:
|
||||
//QDateTime m_epoch;
|
||||
void removeStaleData();
|
||||
|
||||
QTimer *timer;
|
||||
@ -124,11 +140,15 @@ private slots:
|
||||
void removeStaleDataTimeout();
|
||||
};
|
||||
|
||||
/*!
|
||||
\brief UAVObject plot use a fixed size buffer of data, where the horizontal axis values come from
|
||||
a UAVObject field.
|
||||
*/
|
||||
class UAVObjectPlotData : public PlotData
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
UAVObjectPlotData(QString* uavObject, QString* uavField)
|
||||
UAVObjectPlotData(QString uavObject, QString uavField)
|
||||
: PlotData(uavObject, uavField) {}
|
||||
~UAVObjectPlotData() {}
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
*/
|
||||
|
||||
#include "scopegadget.h"
|
||||
#include "scopegadgetconfiguration.h"
|
||||
#include "scopegadgetwidget.h"
|
||||
|
||||
ScopeGadget::ScopeGadget(QString classId, ScopeGadgetWidget *widget, QWidget *parent) :
|
||||
@ -34,6 +35,32 @@ ScopeGadget::ScopeGadget(QString classId, ScopeGadgetWidget *widget, QWidget *pa
|
||||
{
|
||||
}
|
||||
|
||||
void ScopeGadget::loadConfiguration(IUAVGadgetConfiguration* config)
|
||||
{
|
||||
ScopeGadgetConfiguration *sgConfig = qobject_cast<ScopeGadgetConfiguration*>(config);
|
||||
ScopeGadgetWidget* widget = qobject_cast<ScopeGadgetWidget*>(m_widget);
|
||||
|
||||
widget->setXWindowSize(sgConfig->dataSize());
|
||||
widget->setRefreshInterval(sgConfig->refreshInterval());
|
||||
|
||||
if(sgConfig->plotType() == SequencialPlot )
|
||||
widget->setupSequencialPlot();
|
||||
else if(sgConfig->plotType() == ChronoPlot)
|
||||
widget->setupChronoPlot();
|
||||
// else if(sgConfig->plotType() == UAVObjectPlot)
|
||||
// widget->setupUAVObjectPlot();
|
||||
|
||||
foreach (PlotCurveConfiguration* plotCurveConfig, sgConfig->plotCurveConfigs()) {
|
||||
|
||||
QString uavObject = plotCurveConfig->uavObject;
|
||||
QString uavField = plotCurveConfig->uavField;
|
||||
int scale = plotCurveConfig->yScalePower;
|
||||
QRgb color = plotCurveConfig->color;
|
||||
|
||||
widget->addCurvePlot(uavObject,uavField,scale,QPen(QColor(color)));
|
||||
}
|
||||
}
|
||||
|
||||
ScopeGadget::~ScopeGadget()
|
||||
{
|
||||
|
||||
|
@ -46,6 +46,8 @@ public:
|
||||
ScopeGadget(QString classId, ScopeGadgetWidget *widget, QWidget *parent = 0);
|
||||
~ScopeGadget();
|
||||
|
||||
void loadConfiguration(IUAVGadgetConfiguration* config);
|
||||
|
||||
QList<int> context() const {
|
||||
return m_context;
|
||||
}
|
||||
|
@ -28,9 +28,64 @@
|
||||
#include "scopegadgetconfiguration.h"
|
||||
#include <QtCore/QDataStream>
|
||||
|
||||
|
||||
ScopeGadgetConfiguration::ScopeGadgetConfiguration(QString classId, const QByteArray &state, QObject *parent) :
|
||||
IUAVGadgetConfiguration(classId, parent)
|
||||
IUAVGadgetConfiguration(classId, parent),
|
||||
m_plotType((int)ChronoPlot),
|
||||
m_dataSize(60),
|
||||
m_refreshInterval(1)
|
||||
{
|
||||
uint currentStreamVersion = 0;
|
||||
int plotCurveCount = 0;
|
||||
|
||||
if (state.count() > 0) {
|
||||
|
||||
QDataStream stream(state);
|
||||
stream >> currentStreamVersion;
|
||||
|
||||
if(currentStreamVersion != m_configurationStreamVersion)
|
||||
return;
|
||||
|
||||
stream >> m_plotType;
|
||||
stream >> m_dataSize;
|
||||
stream >> m_refreshInterval;
|
||||
stream >> plotCurveCount;
|
||||
|
||||
while(plotCurveCount-- > 0)
|
||||
{
|
||||
QString uavObject;
|
||||
QString uavField;
|
||||
QRgb color;
|
||||
|
||||
PlotCurveConfiguration* plotCurveConf = new PlotCurveConfiguration();
|
||||
stream >> uavObject;
|
||||
plotCurveConf->uavObject = uavObject;
|
||||
stream >> uavField;
|
||||
plotCurveConf->uavField = uavField;
|
||||
stream >> color;
|
||||
plotCurveConf->color = color;
|
||||
stream >> plotCurveConf->yScalePower;
|
||||
stream >> plotCurveConf->yMinimum;
|
||||
stream >> plotCurveConf->yMaximum;
|
||||
|
||||
m_PlotCurveConfigs.append(plotCurveConf);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ScopeGadgetConfiguration::clearPlotData()
|
||||
{
|
||||
PlotCurveConfiguration* poltCurveConfig;
|
||||
|
||||
while(m_PlotCurveConfigs.size() > 0)
|
||||
{
|
||||
poltCurveConfig = m_PlotCurveConfigs.first();
|
||||
m_PlotCurveConfigs.pop_front();
|
||||
|
||||
delete poltCurveConfig;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -39,34 +94,73 @@ ScopeGadgetConfiguration::ScopeGadgetConfiguration(QString classId, const QByteA
|
||||
*/
|
||||
IUAVGadgetConfiguration *ScopeGadgetConfiguration::clone()
|
||||
{
|
||||
int plotCurveCount = 0;
|
||||
int plotDatasLoadIndex = 0;
|
||||
|
||||
ScopeGadgetConfiguration *m = new ScopeGadgetConfiguration(this->classId());
|
||||
//m->m_defaultDial=m_defaultDial;
|
||||
m->setPlotType(m_plotType);
|
||||
m->setDataSize( m_dataSize);
|
||||
m->setRefreashInterval( m_refreshInterval);
|
||||
|
||||
plotCurveCount = m_PlotCurveConfigs.size();
|
||||
|
||||
for(plotDatasLoadIndex = 0; plotDatasLoadIndex < plotCurveCount; plotDatasLoadIndex++)
|
||||
{
|
||||
PlotCurveConfiguration* currentPlotCurveConf = m_PlotCurveConfigs.at(plotDatasLoadIndex);
|
||||
|
||||
PlotCurveConfiguration* newPlotCurveConf = new PlotCurveConfiguration();
|
||||
newPlotCurveConf->uavObject = currentPlotCurveConf->uavObject;
|
||||
newPlotCurveConf->uavField = currentPlotCurveConf->uavField;
|
||||
newPlotCurveConf->color = currentPlotCurveConf->color;
|
||||
newPlotCurveConf->yScalePower = currentPlotCurveConf->yScalePower;
|
||||
newPlotCurveConf->yMinimum = currentPlotCurveConf->yMinimum;
|
||||
newPlotCurveConf->yMaximum = currentPlotCurveConf->yMaximum;
|
||||
|
||||
m->addPlotCurveConfig(newPlotCurveConf);
|
||||
}
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves a configuration.
|
||||
*
|
||||
*/
|
||||
QByteArray ScopeGadgetConfiguration::saveState() const
|
||||
{
|
||||
int plotCurveCount = m_PlotCurveConfigs.size();
|
||||
int plotDatasLoadIndex = 0;
|
||||
QByteArray bytes;
|
||||
// QDataStream stream(&bytes, QIODevice::WriteOnly);
|
||||
// stream << m_defaultDial;
|
||||
// stream << dialBackgroundID;
|
||||
// stream << dialForegroundID;
|
||||
// stream << dialNeedleID1;
|
||||
// stream << dialNeedleID2;
|
||||
// stream << needle1MinValue;
|
||||
// stream << needle1MaxValue;
|
||||
// stream << needle2MinValue;
|
||||
// stream << needle2MaxValue;
|
||||
// stream << needle1DataObject;
|
||||
// stream << needle1ObjectField;
|
||||
// stream << needle2DataObject;
|
||||
// stream << needle2ObjectField;
|
||||
// stream << needle1Factor;
|
||||
// stream << needle2Factor;
|
||||
QDataStream stream(&bytes, QIODevice::WriteOnly);
|
||||
stream << m_configurationStreamVersion;
|
||||
stream << m_plotType;
|
||||
stream << m_dataSize;
|
||||
stream << m_refreshInterval;
|
||||
stream << plotCurveCount;
|
||||
|
||||
for(plotDatasLoadIndex = 0; plotDatasLoadIndex < plotCurveCount; plotDatasLoadIndex++)
|
||||
{
|
||||
PlotCurveConfiguration* plotCurveConf = m_PlotCurveConfigs.at(plotDatasLoadIndex);
|
||||
|
||||
stream << plotCurveConf->uavObject;
|
||||
stream << plotCurveConf->uavField;
|
||||
stream << plotCurveConf->color;
|
||||
stream << plotCurveConf->yScalePower;
|
||||
stream << plotCurveConf->yMinimum;
|
||||
stream << plotCurveConf->yMaximum;
|
||||
}
|
||||
|
||||
return bytes;
|
||||
}
|
||||
|
||||
void ScopeGadgetConfiguration::replacePlotCurveConfig(QList<PlotCurveConfiguration*> newPlotCurveConfigs)
|
||||
{
|
||||
clearPlotData();
|
||||
|
||||
m_PlotCurveConfigs.append(newPlotCurveConfigs);
|
||||
}
|
||||
|
||||
ScopeGadgetConfiguration::~ScopeGadgetConfiguration()
|
||||
{
|
||||
clearPlotData();
|
||||
}
|
||||
|
@ -28,19 +28,58 @@
|
||||
#ifndef SCOPEGADGETCONFIGURATION_H
|
||||
#define SCOPEGADGETCONFIGURATION_H
|
||||
|
||||
#include "plotdata.h"
|
||||
#include <coreplugin/iuavgadgetconfiguration.h>
|
||||
|
||||
#include <QVector>
|
||||
|
||||
using namespace Core;
|
||||
|
||||
struct PlotCurveConfiguration
|
||||
{
|
||||
QString uavObject;
|
||||
QString uavField;
|
||||
int yScalePower; //This is the power to which each value must be raised
|
||||
QRgb color;
|
||||
double yMinimum;
|
||||
double yMaximum;
|
||||
};
|
||||
|
||||
class ScopeGadgetConfiguration : public IUAVGadgetConfiguration
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ScopeGadgetConfiguration(QString classId, const QByteArray &state = 0, QObject *parent = 0);
|
||||
~ScopeGadgetConfiguration();
|
||||
|
||||
//configuration setter functions
|
||||
void setPlotType(int value){m_plotType = value;}
|
||||
void setDataSize(int value){m_dataSize = value;}
|
||||
void setRefreashInterval(int value){m_refreshInterval = value;}
|
||||
void addPlotCurveConfig(PlotCurveConfiguration* value){m_PlotCurveConfigs.append(value);}
|
||||
void replacePlotCurveConfig(QList<PlotCurveConfiguration*> m_PlotCurveConfigs);
|
||||
|
||||
|
||||
//configurations getter functions
|
||||
int plotType(){return m_plotType;}
|
||||
int dataSize(){return m_dataSize;}
|
||||
int refreshInterval(){return m_refreshInterval;}
|
||||
QList<PlotCurveConfiguration*> plotCurveConfigs(){return m_PlotCurveConfigs;}
|
||||
|
||||
QByteArray saveState() const;
|
||||
IUAVGadgetConfiguration *clone();
|
||||
|
||||
private:
|
||||
|
||||
static const uint m_configurationStreamVersion = 1000;//Increment this if the stream format is not compatible with previous versions. This would cause existing configs to be discarded.
|
||||
int m_plotType; //The type of the plot
|
||||
int m_dataSize; //The size of the data buffer to render in the curve plot
|
||||
int m_refreshInterval; //The interval to replot the curve widget. The data buffer is refresh as the data comes in.
|
||||
QList<PlotCurveConfiguration*> m_PlotCurveConfigs;
|
||||
|
||||
void clearPlotData();
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // SCOPEGADGETCONFIGURATION_H
|
@ -33,6 +33,8 @@
|
||||
#include "uavobjects/uavobjectmanager.h"
|
||||
#include "uavobjects/uavdataobject.h"
|
||||
|
||||
|
||||
|
||||
ScopeGadgetOptionsPage::ScopeGadgetOptionsPage(ScopeGadgetConfiguration *config, QObject *parent) :
|
||||
IOptionsPage(parent),
|
||||
m_config(config)
|
||||
@ -49,12 +51,115 @@ QWidget* ScopeGadgetOptionsPage::createPage(QWidget *parent)
|
||||
//main layout
|
||||
options_page->setupUi(optionsPageWidget);
|
||||
|
||||
//TODO: Rest of the init stuff here
|
||||
options_page->cmbPlotType->addItem("Sequencial Plot","");
|
||||
options_page->cmbPlotType->addItem("Chronological Plot","");
|
||||
|
||||
// Fills the combo boxes for the UAVObjects
|
||||
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
|
||||
QList< QList<UAVDataObject*> > objList = objManager->getDataObjects();
|
||||
foreach (QList<UAVDataObject*> list, objList) {
|
||||
foreach (UAVDataObject* obj, list) {
|
||||
options_page->cmbUAVObjects->addItem(obj->getName());
|
||||
}
|
||||
}
|
||||
|
||||
//Connect signals to slots cmbUAVObjects.currentIndexChanged
|
||||
connect(options_page->cmbUAVObjects, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_cmbUAVObjects_currentIndexChanged(QString)));
|
||||
|
||||
if(options_page->cmbUAVObjects->currentIndex() >= 0)
|
||||
on_cmbUAVObjects_currentIndexChanged(options_page->cmbUAVObjects->currentText());
|
||||
|
||||
options_page->cmbColor->addItem("Black", QVariant(qRgb(0,0,0)));
|
||||
options_page->cmbColor->addItem("Red", QVariant(qRgb(255,0,0)));
|
||||
options_page->cmbColor->addItem("Green", QVariant(qRgb(0,255,0)));
|
||||
options_page->cmbColor->addItem("Blue", QVariant(qRgb(0,0,255)));
|
||||
|
||||
options_page->cmbScale->addItem("E-9", -9);
|
||||
options_page->cmbScale->addItem("E-6", -6);
|
||||
options_page->cmbScale->addItem("E-5",-5);
|
||||
options_page->cmbScale->addItem("E-4",-4);
|
||||
options_page->cmbScale->addItem("E-3",-3);
|
||||
options_page->cmbScale->addItem("E-2",-2);
|
||||
options_page->cmbScale->addItem("E-1",-1);
|
||||
options_page->cmbScale->addItem("E0",0);
|
||||
options_page->cmbScale->addItem("E1",1);
|
||||
options_page->cmbScale->addItem("E2",2);
|
||||
options_page->cmbScale->addItem("E3",3);
|
||||
options_page->cmbScale->addItem("E4",4);
|
||||
options_page->cmbScale->addItem("E5",5);
|
||||
options_page->cmbScale->addItem("E6",6);
|
||||
options_page->cmbScale->addItem("E9",9);
|
||||
options_page->cmbScale->addItem("E12",12);
|
||||
options_page->cmbScale->setCurrentIndex(7);
|
||||
|
||||
//Set widget values from settings
|
||||
options_page->cmbPlotType->setCurrentIndex(m_config->plotType());
|
||||
options_page->spnDataSize->setValue(m_config->dataSize());
|
||||
options_page->spnRefreshInterval->setValue(m_config->refreshInterval());
|
||||
|
||||
//add the configured curves
|
||||
foreach (PlotCurveConfiguration* plotData, m_config->plotCurveConfigs()) {
|
||||
|
||||
QString uavObject = plotData->uavObject;
|
||||
QString uavField = plotData->uavField;
|
||||
int scale = plotData->yScalePower;
|
||||
QVariant varColor = plotData->color;
|
||||
|
||||
addPlotCurveConfig(uavObject,uavField,scale,varColor);
|
||||
}
|
||||
|
||||
|
||||
connect(options_page->btnAddCurve, SIGNAL(clicked()), this, SLOT(on_btnAddCurve_clicked()));
|
||||
connect(options_page->btnRemoveCurve, SIGNAL(clicked()), this, SLOT(on_btnRemoveCurve_clicked()));
|
||||
connect(options_page->lstCurves, SIGNAL(currentRowChanged(int)), this, SLOT(on_lstCurves_currentRowChanged(int)));
|
||||
|
||||
setYAxisWidgetFromPlotCurve();
|
||||
|
||||
return optionsPageWidget;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Populate the widgets that containts the configs for the Y-Axis from
|
||||
the selected plot curve
|
||||
*/
|
||||
void ScopeGadgetOptionsPage::setYAxisWidgetFromPlotCurve()
|
||||
{
|
||||
QListWidgetItem* listItem = options_page->lstCurves->currentItem();
|
||||
|
||||
if(listItem == 0)
|
||||
return;
|
||||
|
||||
int currentIndex = options_page->cmbUAVObjects->findText( listItem->data(Qt::UserRole + 0).toString());
|
||||
options_page->cmbUAVObjects->setCurrentIndex(currentIndex);
|
||||
|
||||
currentIndex = options_page->cmbUAVField->findText( listItem->data(Qt::UserRole + 1).toString());
|
||||
options_page->cmbUAVField->setCurrentIndex(currentIndex);
|
||||
|
||||
currentIndex = options_page->cmbScale->findData( listItem->data(Qt::UserRole + 2), Qt::UserRole, Qt::MatchExactly);
|
||||
options_page->cmbScale->setCurrentIndex(currentIndex);
|
||||
|
||||
currentIndex = options_page->cmbColor->findData( listItem->data(Qt::UserRole + 3), Qt::UserRole, Qt::MatchExactly);
|
||||
options_page->cmbColor->setCurrentIndex(currentIndex);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief When a new UAVObject is selected, populate the UAVObject field combo box with the correct values.
|
||||
*/
|
||||
void ScopeGadgetOptionsPage::on_cmbUAVObjects_currentIndexChanged(QString val)
|
||||
{
|
||||
options_page->cmbUAVField->clear();
|
||||
|
||||
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
|
||||
UAVDataObject* obj = dynamic_cast<UAVDataObject*>( objManager->getObject(val) );
|
||||
|
||||
QList<UAVObjectField*> fieldList = obj->getFields();
|
||||
foreach (UAVObjectField* field, fieldList) {
|
||||
options_page->cmbUAVField->addItem(field->getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the user presses apply or OK.
|
||||
*
|
||||
@ -64,12 +169,98 @@ QWidget* ScopeGadgetOptionsPage::createPage(QWidget *parent)
|
||||
void ScopeGadgetOptionsPage::apply()
|
||||
{
|
||||
|
||||
//Apply configuration changes
|
||||
// m_config->setDialFile(options_page->svgSourceFile->text());
|
||||
bool parseOK = false;
|
||||
|
||||
//Apply configuration changes
|
||||
m_config->setPlotType(options_page->cmbPlotType->currentIndex());
|
||||
m_config->setDataSize(options_page->spnDataSize->value());
|
||||
m_config->setRefreashInterval(options_page->spnRefreshInterval->value());
|
||||
|
||||
QList<PlotCurveConfiguration*> m_PlotCurveConfigs;
|
||||
for(int iIndex = 0; iIndex < options_page->lstCurves->count();iIndex++) {
|
||||
QListWidgetItem* listItem = options_page->lstCurves->item(iIndex);
|
||||
|
||||
PlotCurveConfiguration* newPlotCurveConfigs = new PlotCurveConfiguration();
|
||||
newPlotCurveConfigs->uavObject = listItem->data(Qt::UserRole + 0).toString();
|
||||
newPlotCurveConfigs->uavField = listItem->data(Qt::UserRole + 1).toString();
|
||||
newPlotCurveConfigs->yScalePower = listItem->data(Qt::UserRole + 2).toInt(&parseOK);
|
||||
if(!parseOK)
|
||||
newPlotCurveConfigs->yScalePower = 0;
|
||||
|
||||
QVariant varColor = listItem->data(Qt::UserRole + 3);
|
||||
int rgb = varColor.toInt(&parseOK);
|
||||
if(!parseOK)
|
||||
newPlotCurveConfigs->color = QColor(Qt::black).rgb();
|
||||
else
|
||||
newPlotCurveConfigs->color = (QRgb)rgb;
|
||||
|
||||
m_PlotCurveConfigs.append(newPlotCurveConfigs);
|
||||
}
|
||||
|
||||
m_config->replacePlotCurveConfig(m_PlotCurveConfigs);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Add a new curve to the plot.
|
||||
*/
|
||||
void ScopeGadgetOptionsPage::on_btnAddCurve_clicked()
|
||||
{
|
||||
bool parseOK = false;
|
||||
QString uavObject = options_page->cmbUAVObjects->currentText();
|
||||
QString uavField = options_page->cmbUAVField->currentText();
|
||||
int scale = options_page->cmbScale->itemData(options_page->cmbScale->currentIndex()).toInt(&parseOK);
|
||||
|
||||
if(!parseOK)
|
||||
scale = 0;
|
||||
|
||||
//TODO: Find an existing plot curve config based on the uavobject and uav field. If it
|
||||
//exists, update it, else add a new one.
|
||||
|
||||
QVariant varColor = options_page->cmbColor->itemData(options_page->cmbColor->currentIndex());
|
||||
|
||||
addPlotCurveConfig(uavObject,uavField,scale,varColor);
|
||||
|
||||
options_page->lstCurves->setCurrentRow(options_page->lstCurves->count() - 1);
|
||||
}
|
||||
|
||||
void ScopeGadgetOptionsPage::addPlotCurveConfig(QString uavObject, QString uavField, int scale, QVariant varColor)
|
||||
{
|
||||
bool parseOK = false;
|
||||
|
||||
//Add a new curve config to the list
|
||||
QString listItemDisplayText = uavObject + "." + uavField;
|
||||
options_page->lstCurves->addItem(listItemDisplayText);
|
||||
QListWidgetItem *listWidgetItem = options_page->lstCurves->item(options_page->lstCurves->count() - 1);
|
||||
|
||||
//Set the properties of the newly added list item
|
||||
QColor color = QColor( (QRgb)varColor.toInt(&parseOK) );
|
||||
listWidgetItem->setText(listItemDisplayText);
|
||||
listWidgetItem->setTextColor( color );
|
||||
|
||||
//Store some additional data for the plot curve on the list item
|
||||
listWidgetItem->setData(Qt::UserRole + 0,QVariant(uavObject));
|
||||
listWidgetItem->setData(Qt::UserRole + 1,QVariant(uavField));
|
||||
listWidgetItem->setData(Qt::UserRole + 2,QVariant(scale));
|
||||
listWidgetItem->setData(Qt::UserRole + 3,varColor);
|
||||
}
|
||||
|
||||
/*!
|
||||
Remove a curve config from the plot.
|
||||
*/
|
||||
void ScopeGadgetOptionsPage::on_btnRemoveCurve_clicked()
|
||||
{
|
||||
options_page->lstCurves->takeItem(options_page->lstCurves->currentIndex().row());
|
||||
}
|
||||
|
||||
void ScopeGadgetOptionsPage::finish()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*!
|
||||
When a different plot curve config is selected, populate its values into the widgets.
|
||||
*/
|
||||
void ScopeGadgetOptionsPage::on_lstCurves_currentRowChanged(int currentRow)
|
||||
{
|
||||
setYAxisWidgetFromPlotCurve();
|
||||
}
|
||||
|
@ -29,7 +29,7 @@
|
||||
#define SCOPEGADGETOPTIONSPAGE_H
|
||||
|
||||
#include "coreplugin/dialogs/ioptionspage.h"
|
||||
#include "QString"
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QDebug>
|
||||
|
||||
@ -61,6 +61,16 @@ private:
|
||||
Ui::ScopeGadgetOptionsPage *options_page;
|
||||
ScopeGadgetConfiguration *m_config;
|
||||
|
||||
void addPlotCurveConfig(QString uavObject, QString uavField, int scale, QVariant varColor);
|
||||
void setYAxisWidgetFromPlotCurve();
|
||||
|
||||
|
||||
|
||||
private slots:
|
||||
void on_lstCurves_currentRowChanged(int currentRow);
|
||||
void on_btnRemoveCurve_clicked();
|
||||
void on_btnAddCurve_clicked();
|
||||
void on_cmbUAVObjects_currentIndexChanged(QString val);
|
||||
};
|
||||
|
||||
#endif // SCOPEGADGETOPTIONSPAGE_H
|
@ -36,18 +36,7 @@
|
||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="comboBox">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Chronological Plot</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Sequencial Plot</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
<widget class="QComboBox" name="cmbPlotType"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
@ -57,7 +46,7 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QSpinBox" name="spinBox">
|
||||
<widget class="QSpinBox" name="spnDataSize">
|
||||
<property name="suffix">
|
||||
<string> seconds</string>
|
||||
</property>
|
||||
@ -65,7 +54,7 @@
|
||||
<number>5000</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>10</number>
|
||||
<number>30</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>300</number>
|
||||
@ -80,7 +69,7 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QSpinBox" name="spinBox_2">
|
||||
<widget class="QSpinBox" name="spnRefreshInterval">
|
||||
<property name="suffix">
|
||||
<string> seconds</string>
|
||||
</property>
|
||||
@ -98,7 +87,7 @@
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Refresh Time:</string>
|
||||
<string>Data Timeout:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -110,10 +99,13 @@
|
||||
<x>0</x>
|
||||
<y>160</y>
|
||||
<width>481</width>
|
||||
<height>131</height>
|
||||
<height>102</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SetDefaultConstraint</enum>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
@ -124,7 +116,7 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="comboBox_2"/>
|
||||
<widget class="QComboBox" name="cmbUAVObjects"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
@ -134,7 +126,7 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QComboBox" name="comboBox_4"/>
|
||||
<widget class="QComboBox" name="cmbColor"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
@ -144,7 +136,7 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="comboBox_3"/>
|
||||
<widget class="QComboBox" name="cmbUAVField"/>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
@ -154,7 +146,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QComboBox" name="comboBox_5"/>
|
||||
<widget class="QComboBox" name="cmbScale">
|
||||
<property name="editable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
@ -164,14 +160,14 @@
|
||||
<enum>QLayout::SetFixedSize</enum>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
<widget class="QPushButton" name="btnAddCurve">
|
||||
<property name="text">
|
||||
<string>>></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_2">
|
||||
<widget class="QPushButton" name="btnRemoveCurve">
|
||||
<property name="text">
|
||||
<string><<</string>
|
||||
</property>
|
||||
@ -182,7 +178,10 @@
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QListView" name="listView">
|
||||
<widget class="QListWidget" name="lstCurves">
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectItems</enum>
|
||||
</property>
|
||||
<property name="batchSize">
|
||||
<number>100</number>
|
||||
</property>
|
||||
|
@ -28,12 +28,8 @@
|
||||
|
||||
#include "uavobjects/uavobjectmanager.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
//#include "uavobjects/uavobject.h"
|
||||
//#include "uavobjects/uavdataobject.h"
|
||||
//#include "uavobjects/uavobjectfield.h"
|
||||
//#include "uavobjects/uavmetaobject.h"
|
||||
|
||||
#include "scopegadgetwidget.h"
|
||||
|
||||
#include "qwt/src/qwt_plot_curve.h"
|
||||
#include "qwt/src/qwt_legend.h"
|
||||
|
||||
@ -50,15 +46,8 @@ TestDataGen* ScopeGadgetWidget::testDataGen;
|
||||
|
||||
ScopeGadgetWidget::ScopeGadgetWidget(QWidget *parent) : QwtPlot(parent)
|
||||
{
|
||||
//setupExamplePlot();
|
||||
//Setup defaults
|
||||
//setupSequencialPlot();
|
||||
setupChronoPlot();
|
||||
addCurvePlot(QString("AltitudeActual"), QString("Altitude"), -1, QPen(Qt::blue));
|
||||
addCurvePlot(QString("AltitudeActual"), QString("Temperature"), 0, QPen(Qt::red));
|
||||
|
||||
//if(testDataGen == 0)
|
||||
// testDataGen = new TestDataGen();
|
||||
// if(testDataGen == 0)
|
||||
// testDataGen = new TestDataGen();
|
||||
}
|
||||
|
||||
void ScopeGadgetWidget::preparePlot(PlotType plotType)
|
||||
@ -82,20 +71,17 @@ void ScopeGadgetWidget::preparePlot(PlotType plotType)
|
||||
|
||||
void ScopeGadgetWidget::setupSequencialPlot()
|
||||
{
|
||||
//setAutoReplot(true);
|
||||
m_xWindowSize = 100;
|
||||
preparePlot(SequencialPlot);
|
||||
|
||||
setAxisTitle(QwtPlot::xBottom, "Index");
|
||||
setAxisScaleDraw(QwtPlot::xBottom, new QwtScaleDraw());
|
||||
setAxisScale(QwtPlot::xBottom, 0, m_xWindowSize);
|
||||
//setAxisLabelRotation(QwtPlot::xBottom, -50.0);
|
||||
setAxisLabelRotation(QwtPlot::xBottom, 0.0);
|
||||
setAxisLabelAlignment(QwtPlot::xBottom, Qt::AlignLeft | Qt::AlignBottom);
|
||||
}
|
||||
|
||||
void ScopeGadgetWidget::setupChronoPlot()
|
||||
{
|
||||
//setAutoReplot(true);
|
||||
m_xWindowSize = 100;
|
||||
preparePlot(ChronoPlot);
|
||||
|
||||
setAxisTitle(QwtPlot::xBottom, "Time [h:m:s]");
|
||||
@ -124,11 +110,11 @@ void ScopeGadgetWidget::addCurvePlot(QString uavObject, QString uavField, int sc
|
||||
PlotData* plotData;
|
||||
|
||||
if (m_plotType == SequencialPlot)
|
||||
plotData = new SequencialPlotData(&uavObject, &uavField);
|
||||
plotData = new SequencialPlotData(uavObject, uavField);
|
||||
else if (m_plotType == ChronoPlot)
|
||||
plotData = new ChronoPlotData(&uavObject, &uavField);
|
||||
else if (m_plotType == UAVObjectPlot)
|
||||
plotData = new UAVObjectPlotData(&uavObject, &uavField);
|
||||
plotData = new ChronoPlotData(uavObject, uavField, m_refreshInterval);
|
||||
//else if (m_plotType == UAVObjectPlot)
|
||||
// plotData = new UAVObjectPlotData(uavObject, uavField);
|
||||
|
||||
plotData->m_xWindowSize = m_xWindowSize;
|
||||
plotData->scalePower = scaleOrderFactor;
|
||||
@ -138,7 +124,7 @@ void ScopeGadgetWidget::addCurvePlot(QString uavObject, QString uavField, int sc
|
||||
setAxisScale(QwtPlot::yLeft, plotData->yMinimum, plotData->yMaximum);
|
||||
|
||||
//Create the curve
|
||||
QString curveName = *(plotData->uavObject) + "." + *(plotData->uavField);
|
||||
QString curveName = (plotData->uavObject) + "." + (plotData->uavField);
|
||||
QwtPlotCurve* plotCurve = new QwtPlotCurve(curveName);
|
||||
plotCurve->setPen(pen);
|
||||
plotCurve->setData(*plotData->xData, *plotData->yData);
|
||||
@ -151,7 +137,7 @@ void ScopeGadgetWidget::addCurvePlot(QString uavObject, QString uavField, int sc
|
||||
//Get the object to monitor
|
||||
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
|
||||
UAVDataObject* obj = dynamic_cast<UAVDataObject*>(objManager->getObject(*(plotData->uavObject)));
|
||||
UAVDataObject* obj = dynamic_cast<UAVDataObject*>(objManager->getObject((plotData->uavObject)));
|
||||
|
||||
//Link to the signal of new data only if this UAVObject has not been to connected yet
|
||||
if (!m_connectedUAVObjects.contains(obj->getName())) {
|
||||
@ -170,6 +156,7 @@ void ScopeGadgetWidget::removeCurvePlot(QString uavObject, QString uavField)
|
||||
m_curvesData.remove(curveName);
|
||||
plotData->curve->detach();
|
||||
|
||||
delete plotData->curve;
|
||||
delete plotData;
|
||||
}
|
||||
|
||||
@ -258,8 +245,8 @@ void ScopeGadgetWidget::clearCurvePlots()
|
||||
{
|
||||
foreach(PlotData* plotData, m_curvesData.values()) {
|
||||
plotData->curve->detach();
|
||||
delete plotData->curve;
|
||||
|
||||
delete plotData->curve;
|
||||
delete plotData;
|
||||
}
|
||||
|
||||
@ -278,7 +265,7 @@ TestDataGen::TestDataGen()
|
||||
//Setup timer
|
||||
timer = new QTimer(this);
|
||||
connect(timer, SIGNAL(timeout()), this, SLOT(genTestData()));
|
||||
timer->start(100);
|
||||
timer->start(5000);
|
||||
}
|
||||
|
||||
void TestDataGen::genTestData()
|
||||
@ -311,5 +298,3 @@ TestDataGen::~TestDataGen()
|
||||
|
||||
delete timer;
|
||||
}
|
||||
|
||||
|
||||
|
@ -44,6 +44,10 @@
|
||||
#include <QTime>
|
||||
#include <QVector>
|
||||
|
||||
/*!
|
||||
\brief This class is used to render the time values on the horizontal axis for the
|
||||
ChronoPlot.
|
||||
*/
|
||||
class TimeScaleDraw : public QwtScaleDraw
|
||||
{
|
||||
public:
|
||||
@ -58,6 +62,9 @@ private:
|
||||
double baseTime;
|
||||
};
|
||||
|
||||
/*!
|
||||
\brief This class is used to inject UAVTalk messages for testing.
|
||||
*/
|
||||
class TestDataGen : QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
@ -87,6 +94,21 @@ public:
|
||||
ScopeGadgetWidget(QWidget *parent = 0);
|
||||
~ScopeGadgetWidget();
|
||||
|
||||
void setupSequencialPlot();
|
||||
void setupChronoPlot();
|
||||
void setupUAVObjectPlot();
|
||||
PlotType plotType(){return m_plotType;}
|
||||
|
||||
void setXWindowSize(double xWindowSize){m_xWindowSize = xWindowSize;}
|
||||
double xWindowSize(){return m_xWindowSize;}
|
||||
void setRefreshInterval(double refreshInterval){m_refreshInterval = refreshInterval;}
|
||||
int refreshInterval(){return m_refreshInterval;}
|
||||
|
||||
|
||||
void addCurvePlot(QString uavObject, QString uavField, int scaleOrderFactor = 0, QPen pen = QPen(Qt::black));
|
||||
void removeCurvePlot(QString uavObject, QString uavField);
|
||||
void clearCurvePlots();
|
||||
|
||||
|
||||
private slots:
|
||||
void uavObjectReceived(UAVObject*);
|
||||
@ -96,18 +118,12 @@ private:
|
||||
|
||||
void preparePlot(PlotType plotType);
|
||||
void setupExamplePlot();
|
||||
void setupSequencialPlot();
|
||||
void setupChronoPlot();
|
||||
void setupUAVObjectPlot();
|
||||
|
||||
void addCurvePlot(QString uavObject, QString uavField, int scaleOrderFactor = 0, QPen pen = QPen(Qt::black));
|
||||
void removeCurvePlot(QString uavObject, QString uavField);
|
||||
void clearCurvePlots();
|
||||
|
||||
PlotType m_plotType;
|
||||
|
||||
double m_xWindowSize;
|
||||
QVector<QString> m_connectedUAVObjects;
|
||||
int m_refreshInterval;
|
||||
QList<QString> m_connectedUAVObjects;
|
||||
QMap<QString, PlotData*> m_curvesData;
|
||||
|
||||
static TestDataGen* testDataGen;
|
||||
|
Loading…
x
Reference in New Issue
Block a user