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);
}
}
}
lm
committed
void QGCParamSlider::startEditMode()
{
ui->valueSlider->hide();
ui->doubleValueSpinBox->hide();
ui->intValueSpinBox->hide();
ui->nameLabel->hide();
ui->writeButton->hide();
ui->readButton->hide();
Lorenz Meier
committed
ui->editInfoCheckBox->show();
lm
committed
ui->editNameLabel->show();
ui->editRefreshParamsButton->show();
ui->editSelectParamComboBox->show();
ui->editSelectComponentComboBox->show();
ui->editStatusLabel->show();
ui->editMinSpinBox->show();
ui->editMaxSpinBox->show();
ui->writeButton->hide();
ui->readButton->hide();
ui->editLine1->show();
ui->editLine2->show();
lm
committed
isInEditMode = true;
}
void QGCParamSlider::endEditMode()
{
// Store component id
selectComponent(ui->editSelectComponentComboBox->currentIndex());
// Store parameter name and id
selectParameter(ui->editSelectParamComboBox->currentIndex());
// Min/max
parameterMin = ui->editMinSpinBox->value();
parameterMax = ui->editMaxSpinBox->value();
Lorenz Meier
committed
ui->editInfoCheckBox->hide();
lm
committed
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();
ui->writeButton->show();
ui->readButton->show();
ui->valueSlider->show();
switch ((int)parameterValue.type())
Michael Carpenter
committed
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;
}
ui->nameLabel->show();
lm
committed
isInEditMode = false;
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
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
{
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());