1
0
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:
banigreyling 2010-07-01 20:03:12 +00:00 committed by banigreyling
parent 13168b6b4c
commit 760fc69cba
11 changed files with 1693 additions and 1315 deletions

View File

@ -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;
}

View File

@ -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() {}

View File

@ -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()
{

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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

View File

@ -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();
}

View File

@ -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

View File

@ -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>&gt;&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_2">
<widget class="QPushButton" name="btnRemoveCurve">
<property name="text">
<string>&lt;&lt;</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>

View File

@ -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;
}

View File

@ -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;