Newer
Older
lm
committed
#include <QMenu>
#include <QContextMenuEvent>
Mariano Lizarraga
committed
#include <QSettings>
lm
committed
#include <QTimer>
lm
committed
#include "QGCParamSlider.h"
#include "ui_QGCParamSlider.h"
lm
committed
#include "UASInterface.h"
Mariano Lizarraga
committed
QGCParamSlider::QGCParamSlider(QWidget *parent) :
lm
committed
QGCToolWidgetItem("Slider", parent),
parameterName(""),
parameterValue(0.0f),
parameterScalingFactor(0.0),
parameterMin(0.0f),
parameterMax(0.0f),
ui(new Ui::QGCParamSlider)
{
Michael Carpenter
committed
valueModLock = false;
Michael Carpenter
committed
visibleEnabled = true;
Michael Carpenter
committed
valueModLockParam = false;
ui->setupUi(this);
ui->intValueSpinBox->hide();
Michael Carpenter
committed
ui->valueSlider->setEnabled(false);
ui->doubleValueSpinBox->setEnabled(false);
scaledInt = ui->valueSlider->maximum() - ui->valueSlider->minimum();
Lorenz Meier
committed
ui->editInfoCheckBox->hide();
ui->editDoneButton->hide();
ui->editNameLabel->hide();
ui->editRefreshParamsButton->hide();
ui->editSelectParamComboBox->hide();
ui->editSelectComponentComboBox->hide();
ui->editStatusLabel->hide();
ui->editMinSpinBox->hide();
ui->editMaxSpinBox->hide();
ui->editLine1->hide();
ui->editLine2->hide();
Michael Carpenter
committed
ui->infoLabel->hide();
connect(ui->editDoneButton, SIGNAL(clicked()), this, SLOT(endEditMode()));
connect(ui->writeButton, SIGNAL(clicked()),
this, SLOT(setParamPending()));
connect(ui->editSelectComponentComboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(selectComponent(int)));
connect(ui->editSelectParamComboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(selectParameter(int)));
connect(ui->valueSlider, SIGNAL(valueChanged(int)),
this, SLOT(setSliderValue(int)));
connect(ui->doubleValueSpinBox, SIGNAL(valueChanged(double)),
this, SLOT(setParamValue(double)));
connect(ui->intValueSpinBox, SIGNAL(valueChanged(int)),
this, SLOT(setParamValue(int)));
connect(ui->editNameLabel, SIGNAL(textChanged(QString)),
ui->nameLabel, SLOT(setText(QString)));
connect(ui->readButton, SIGNAL(clicked()), this, SLOT(requestParameter()));
connect(ui->editRefreshParamsButton, SIGNAL(clicked()),
this, SLOT(refreshParamList()));
connect(ui->editInfoCheckBox, SIGNAL(clicked(bool)),
this, SLOT(showInfo(bool)));
connect(ui->infoLabel, SIGNAL(released()),
this, SLOT(showTooltip()));
connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
this, SLOT(setActiveUAS(UASInterface*)));
}
QGCParamSlider::~QGCParamSlider()
{
delete ui;
}
void QGCParamSlider::showTooltip()
{
QWidget* sender = dynamic_cast<QWidget*>(QObject::sender());
if (sender)
{
QPoint point = mapToGlobal(ui->infoLabel->pos());
QToolTip::showText(point, sender->toolTip());
}
}
lm
committed
void QGCParamSlider::refreshParamList()
{
ui->editSelectParamComboBox->setEnabled(true);
ui->editSelectComponentComboBox->setEnabled(true);
lm
committed
uas->getParamManager()->requestParameterList();
ui->editStatusLabel->setText(tr("Parameter list updating.."));
lm
committed
}
}
void QGCParamSlider::setActiveUAS(UASInterface* activeUas)
{
if (uas != activeUas) {
if (uas) {
disconnect(uas, SIGNAL(parameterChanged(int,int,int,int,QString,QVariant)),
this, SLOT(setParameterValue(int,int,int,int,QString,QVariant)));
Michael Carpenter
committed
}
if (activeUas) {
connect(activeUas, SIGNAL(parameterChanged(int,int,int,int,QString,QVariant)),
this, SLOT(setParameterValue(int,int,int,int,QString,QVariant)), Qt::UniqueConnection);
if (uas && !parameterName.isEmpty()) {
QString text = uas->getParamManager()->dataModel()->getParamDescription(parameterName);
if (!text.isEmpty()) {
ui->infoLabel->setToolTip(text);
ui->infoLabel->show();
}
// Force-uncheck and hide label if no description is available
if (ui->editInfoCheckBox->isChecked()) {
showInfo((text.length() > 0));
}
}
}
void QGCParamSlider::requestParameter()
{
if (uas && !parameterName.isEmpty()) {
uas->getParamManager()->requestParameterUpdate(componentId, parameterName);
Lorenz Meier
committed
void QGCParamSlider::showInfo(bool enable)
{
ui->editInfoCheckBox->setChecked(enable);
ui->infoLabel->setVisible(enable);
}
lm
committed
void QGCParamSlider::setParamValue(double value)
{
parameterValue = (float)value;
Michael Carpenter
committed
//disconnect(ui->valueSlider,SIGNAL(valueChanged(int)));
if (!valueModLock && !valueModLockParam)
{
valueModLock = true;
ui->valueSlider->setValue(floatToScaledInt(value));
}
else
{
valueModLock = false;
}
//connect(ui->valueSlider, SIGNAL(valueChanged(int)), this, SLOT(setSliderValue(int)));
lm
committed
}
void QGCParamSlider::setParamValue(int value)
{
parameterValue = value;
Michael Carpenter
committed
// disconnect(ui->valueSlider,SIGNAL(valueChanged(int)));
if (!valueModLock && !valueModLockParam)
{
valueModLock = true;
ui->valueSlider->setValue(floatToScaledInt(value));
}
else
{
valueModLock = false;
}
//connect(ui->valueSlider, SIGNAL(valueChanged(int)), this, SLOT(setSliderValue(int)));
void QGCParamSlider::selectComponent(int componentIndex)
{
this->componentId = ui->editSelectComponentComboBox->itemData(componentIndex).toInt();
}
void QGCParamSlider::selectParameter(int paramIndex)
{
parameterName = ui->editSelectParamComboBox->itemText(paramIndex);
if (parameterName.isEmpty()) {
return;
}
UASParameterDataModel* dataModel = uas->getParamManager()->dataModel();
if (dataModel->isParamMinKnown(parameterName)) {
parameterMin = dataModel->getParamMin(parameterName);
ui->editMinSpinBox->setValue(parameterMin);
}
// Maximum
if (dataModel->isParamMaxKnown(parameterName)) {
parameterMax = dataModel->getParamMax(parameterName);
ui->editMaxSpinBox->setValue(parameterMax);
}
}
}
John Tapsell
committed
void QGCParamSlider::setEditMode(bool editMode)
lm
committed
{
John Tapsell
committed
if(!editMode) {
// Store component id
selectComponent(ui->editSelectComponentComboBox->currentIndex());
John Tapsell
committed
// Store parameter name and id
selectParameter(ui->editSelectParamComboBox->currentIndex());
John Tapsell
committed
// Min/max
parameterMin = ui->editMinSpinBox->value();
parameterMax = ui->editMaxSpinBox->value();
John Tapsell
committed
switch ((int)parameterValue.type())
{
case QVariant::Char:
case QVariant::Int:
case QVariant::UInt:
ui->intValueSpinBox->show();
break;
case QMetaType::Float:
ui->doubleValueSpinBox->show();
break;
default:
qCritical() << "ERROR: NO VALID PARAM TYPE";
return;
}
} else {
ui->doubleValueSpinBox->hide();
ui->intValueSpinBox->hide();
John Tapsell
committed
ui->valueSlider->setVisible(!editMode);
ui->nameLabel->setVisible(!editMode);
ui->writeButton->setVisible(!editMode);
ui->readButton->setVisible(!editMode);
ui->editInfoCheckBox->setVisible(editMode);
ui->editDoneButton->setVisible(editMode);
ui->editNameLabel->setVisible(editMode);
ui->editRefreshParamsButton->setVisible(editMode);
ui->editSelectParamComboBox->setVisible(editMode);
ui->editSelectComponentComboBox->setVisible(editMode);
ui->editStatusLabel->setVisible(editMode);
ui->editMinSpinBox->setVisible(editMode);
ui->editMaxSpinBox->setVisible(editMode);
ui->writeButton->setVisible(!editMode);
ui->readButton->setVisible(!editMode);
ui->editLine1->setVisible(editMode);
ui->editLine2->setVisible(editMode);
QGCToolWidgetItem::setEditMode(editMode);
lm
committed
}
void QGCParamSlider::setParamPending()
lm
committed
{
uas->getParamManager()->setPendingParam(componentId, parameterName, parameterValue);
else {
qWarning() << __FILE__ << __LINE__ << "NO UAS SET, DOING NOTHING";
lm
committed
}
}
void QGCParamSlider::setSliderValue(int sliderValue)
{
Michael Carpenter
committed
if (!valueModLock && !valueModLockParam)
Michael Carpenter
committed
valueModLock = true;
switch ((int)parameterValue.type())
Michael Carpenter
committed
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
{
case QVariant::Char:
parameterValue = QVariant(QChar((unsigned char)scaledIntToFloat(sliderValue)));
ui->intValueSpinBox->setValue(parameterValue.toInt());
break;
case QVariant::Int:
parameterValue = (int)scaledIntToFloat(sliderValue);
ui->intValueSpinBox->setValue(parameterValue.toInt());
break;
case QVariant::UInt:
parameterValue = (unsigned int)scaledIntToFloat(sliderValue);
ui->intValueSpinBox->setValue(parameterValue.toUInt());
break;
case QMetaType::Float:
parameterValue = scaledIntToFloat(sliderValue);
ui->doubleValueSpinBox->setValue(parameterValue.toFloat());
break;
default:
qCritical() << "ERROR: NO VALID PARAM TYPE";
valueModLock = false;
return;
}
}
else
{
valueModLock = false;
/**
* @brief uas Unmanned system sending the parameter
* @brief component UAS component sending the parameter
* @brief parameterName Key/name of the parameter
* @brief value Value of the parameter
*/
void QGCParamSlider::setParameterValue(int uasId, int compId, int paramCount, int paramIndex, QString paramName, QVariant value)
if (uasId != this->uas->getUASID()) {
return;
}
if (ui->nameLabel->text() == "Name") {
ui->nameLabel->setText(paramName);
Michael Carpenter
committed
}
// Check if this component and parameter are part of the list
bool found = false;
for (int i = 0; i< ui->editSelectComponentComboBox->count(); ++i) {
if (compId == ui->editSelectComponentComboBox->itemData(i).toInt()) {
if (!found) {
ui->editSelectComponentComboBox->addItem(tr("Component #%1").arg(compId), compId);
}
// Parameter checking
found = false;
for (int i = 0; i < ui->editSelectParamComboBox->count(); ++i) {
if (paramName == ui->editSelectParamComboBox->itemText(i)) {
if (!found) {
ui->editSelectParamComboBox->addItem(paramName, paramIndex);
if (visibleParam != "") {
if (paramName == visibleParam) {
if (visibleVal == value.toInt()) {
uas->getParamManager()->requestParameterUpdate(compId,paramName);
Michael Carpenter
committed
visibleEnabled = true;
this->show();
}
Michael Carpenter
committed
//Disable the component here.
ui->valueSlider->setEnabled(false);
ui->intValueSpinBox->setEnabled(false);
ui->doubleValueSpinBox->setEnabled(false);
visibleEnabled = false;
this->hide();
}
}
}
if (compId == this->componentId && paramName == this->parameterName) {
if (!visibleEnabled) {
Michael Carpenter
committed
return;
}
parameterValue = value;
ui->valueSlider->setEnabled(true);
Michael Carpenter
committed
valueModLockParam = true;
switch ((int)value.type())
Michael Carpenter
committed
case QVariant::Char:
ui->intValueSpinBox->show();
ui->intValueSpinBox->setEnabled(true);
ui->doubleValueSpinBox->hide();
ui->intValueSpinBox->setValue(value.toUInt());
ui->intValueSpinBox->setRange(0, UINT8_MAX);
Michael Carpenter
committed
if (parameterMax == 0 && parameterMin == 0)
{
ui->editMaxSpinBox->setValue(UINT8_MAX);
Michael Carpenter
committed
ui->editMinSpinBox->setValue(0);
}
ui->valueSlider->setValue(floatToScaledInt(value.toUInt()));
Michael Carpenter
committed
break;
case QVariant::Int:
ui->intValueSpinBox->show();
Michael Carpenter
committed
ui->intValueSpinBox->setEnabled(true);
ui->doubleValueSpinBox->hide();
Michael Carpenter
committed
ui->intValueSpinBox->setValue(value.toInt());
ui->intValueSpinBox->setRange(INT32_MIN, INT32_MAX);
Michael Carpenter
committed
if (parameterMax == 0 && parameterMin == 0)
{
ui->editMaxSpinBox->setValue(INT32_MAX);
ui->editMinSpinBox->setValue(INT32_MIN);
Michael Carpenter
committed
}
ui->valueSlider->setValue(floatToScaledInt(value.toInt()));
break;
case QVariant::UInt:
ui->intValueSpinBox->show();
Michael Carpenter
committed
ui->intValueSpinBox->setEnabled(true);
ui->doubleValueSpinBox->hide();
Michael Carpenter
committed
ui->intValueSpinBox->setValue(value.toUInt());
ui->intValueSpinBox->setRange(0, UINT32_MAX);
Michael Carpenter
committed
if (parameterMax == 0 && parameterMin == 0)
{
ui->editMaxSpinBox->setValue(UINT32_MAX);
Michael Carpenter
committed
ui->editMinSpinBox->setValue(0);
}
ui->valueSlider->setValue(floatToScaledInt(value.toUInt()));
break;
case QMetaType::Float:
Michael Carpenter
committed
ui->doubleValueSpinBox->setValue(value.toFloat());
ui->doubleValueSpinBox->show();
Michael Carpenter
committed
ui->doubleValueSpinBox->setEnabled(true);
ui->intValueSpinBox->hide();
Michael Carpenter
committed
if (parameterMax == 0 && parameterMin == 0)
{
ui->editMaxSpinBox->setValue(10000);
ui->editMinSpinBox->setValue(0);
}
ui->valueSlider->setValue(floatToScaledInt(value.toFloat()));
break;
default:
qCritical() << "ERROR: NO VALID PARAM TYPE";
Michael Carpenter
committed
valueModLockParam = false;
return;
}
Michael Carpenter
committed
valueModLockParam = false;
parameterMax = ui->editMaxSpinBox->value();
parameterMin = ui->editMinSpinBox->value();
if (paramIndex == paramCount - 1) {
ui->editStatusLabel->setText(tr("Complete parameter list received."));
}
void QGCParamSlider::changeEvent(QEvent *e)
{
QWidget::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
float QGCParamSlider::scaledIntToFloat(int sliderValue)
float result = (((double)sliderValue)/(double)scaledInt)*(ui->editMaxSpinBox->value() - ui->editMinSpinBox->value());
lm
committed
//qDebug() << "INT TO FLOAT: CONVERTED" << sliderValue << "TO" << result;
int QGCParamSlider::floatToScaledInt(float value)
{
int result = ((value - ui->editMinSpinBox->value())/(ui->editMaxSpinBox->value() - ui->editMinSpinBox->value()))*scaledInt;
lm
committed
//qDebug() << "FLOAT TO INT: CONVERTED" << value << "TO" << result << "SCALEDINT" << scaledInt;
void QGCParamSlider::writeSettings(QSettings& settings)
settings.setValue("TYPE", "SLIDER");
settings.setValue("QGC_PARAM_SLIDER_DESCRIPTION", ui->nameLabel->text());
//settings.setValue("QGC_PARAM_SLIDER_BUTTONTEXT", ui->actionButton->text());
settings.setValue("QGC_PARAM_SLIDER_PARAMID", parameterName);
settings.setValue("QGC_PARAM_SLIDER_COMPONENTID", componentId);
settings.setValue("QGC_PARAM_SLIDER_MIN", ui->editMinSpinBox->value());
settings.setValue("QGC_PARAM_SLIDER_MAX", ui->editMaxSpinBox->value());
Lorenz Meier
committed
settings.setValue("QGC_PARAM_SLIDER_DISPLAY_INFO", ui->editInfoCheckBox->isChecked());
Michael Carpenter
committed
void QGCParamSlider::readSettings(const QString& pre,const QVariantMap& settings)
{
parameterName = settings.value(pre + "QGC_PARAM_SLIDER_PARAMID").toString();
componentId = settings.value(pre + "QGC_PARAM_SLIDER_COMPONENTID").toInt();
Michael Carpenter
committed
ui->nameLabel->setText(settings.value(pre + "QGC_PARAM_SLIDER_DESCRIPTION").toString());
ui->editNameLabel->setText(settings.value(pre + "QGC_PARAM_SLIDER_DESCRIPTION").toString());
//settings.setValue("QGC_PARAM_SLIDER_BUTTONTEXT", ui->actionButton->text());
ui->editSelectParamComboBox->addItem(settings.value(pre + "QGC_PARAM_SLIDER_PARAMID").toString());
ui->editSelectParamComboBox->setCurrentIndex(ui->editSelectParamComboBox->count()-1);
ui->editSelectComponentComboBox->addItem(tr("Component #%1").arg(settings.value(pre + "QGC_PARAM_SLIDER_COMPONENTID").toInt()), settings.value(pre + "QGC_PARAM_SLIDER_COMPONENTID").toInt());
ui->editMinSpinBox->setValue(settings.value(pre + "QGC_PARAM_SLIDER_MIN").toFloat());
ui->editMaxSpinBox->setValue(settings.value(pre + "QGC_PARAM_SLIDER_MAX").toFloat());
Michael Carpenter
committed
visibleParam = settings.value(pre+"QGC_PARAM_SLIDER_VISIBLE_PARAM","").toString();
visibleVal = settings.value(pre+"QGC_PARAM_SLIDER_VISIBLE_VAL",0).toInt();
Michael Carpenter
committed
parameterMax = ui->editMaxSpinBox->value();
parameterMin = ui->editMinSpinBox->value();
//ui->valueSlider->setMaximum(parameterMax);
//ui->valueSlider->setMinimum(parameterMin);
Michael Carpenter
committed
showInfo(settings.value(pre + "QGC_PARAM_SLIDER_DISPLAY_INFO", true).toBool());
ui->editSelectParamComboBox->setEnabled(true);
ui->editSelectComponentComboBox->setEnabled(true);
setActiveUAS(UASManager::instance()->getActiveUAS());
}
void QGCParamSlider::readSettings(const QSettings& settings)
{
Michael Carpenter
committed
QVariantMap map;
foreach (QString key,settings.allKeys())
{
map[key] = settings.value(key);
}
readSettings("",map);
return;
parameterName = settings.value("QGC_PARAM_SLIDER_PARAMID").toString();
componentId = settings.value("QGC_PARAM_SLIDER_COMPONENTID").toInt();
ui->nameLabel->setText(settings.value("QGC_PARAM_SLIDER_DESCRIPTION").toString());
ui->editNameLabel->setText(settings.value("QGC_PARAM_SLIDER_DESCRIPTION").toString());
//settings.setValue("QGC_PARAM_SLIDER_BUTTONTEXT", ui->actionButton->text());
ui->editSelectParamComboBox->addItem(settings.value("QGC_PARAM_SLIDER_PARAMID").toString());
ui->editSelectParamComboBox->setCurrentIndex(ui->editSelectParamComboBox->count()-1);
ui->editSelectComponentComboBox->addItem(tr("Component #%1").arg(settings.value("QGC_PARAM_SLIDER_COMPONENTID").toInt()), settings.value("QGC_PARAM_SLIDER_COMPONENTID").toInt());
lm
committed
ui->editMinSpinBox->setValue(settings.value("QGC_PARAM_SLIDER_MIN").toFloat());
ui->editMaxSpinBox->setValue(settings.value("QGC_PARAM_SLIDER_MAX").toFloat());
Michael Carpenter
committed
visibleParam = settings.value("QGC_PARAM_SLIDER_VISIBLE_PARAM","").toString();
//QGC_TOOL_WIDGET_ITEMS\1\QGC_PARAM_SLIDER_VISIBLE_PARAM=RC5_FUNCTION
visibleVal = settings.value("QGC_PARAM_SLIDER_VISIBLE_VAL",0).toInt();
parameterMax = ui->editMaxSpinBox->value();
parameterMin = ui->editMinSpinBox->value();
Lorenz Meier
committed
showInfo(settings.value("QGC_PARAM_SLIDER_DISPLAY_INFO", true).toBool());
lm
committed
ui->editSelectParamComboBox->setEnabled(true);
ui->editSelectComponentComboBox->setEnabled(true);
Lorenz Meier
committed
setActiveUAS(UASManager::instance()->getActiveUAS());