1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-19 04:52:12 +01:00

Merge branch 'laurent/OP-1728_Output_tab_servo_ignore_set_neutral' into next

This commit is contained in:
Laurent Lalanne 2015-02-18 22:18:09 +01:00
commit 54b8e7a2ab
3 changed files with 92 additions and 59 deletions

View File

@ -203,6 +203,15 @@ void ConfigOutputWidget::runChannelTests(bool state)
if (state) {
sendAllChannelTests();
}
// Add info at end
if (!state && isDirty()) {
QMessageBox mbox;
mbox.setText(QString(tr("You may want to save your neutral settings.")));
mbox.setStandardButtons(QMessageBox::Ok);
mbox.setIcon(QMessageBox::Information);
mbox.exec();
}
}
OutputChannelForm *ConfigOutputWidget::getOutputChannelForm(const int index) const

View File

@ -56,6 +56,15 @@ OutputChannelForm::OutputChannelForm(const int index, QWidget *parent) :
ui.actuatorMax->setMinimum(MINOUTPUT_VALUE);
ui.actuatorValue->setMinimum(MINOUTPUT_VALUE);
// Remove keyboard focus
ui.actuatorMin->setFocusPolicy(Qt::ClickFocus);
ui.actuatorMax->setFocusPolicy(Qt::ClickFocus);
ui.actuatorRev->setFocusPolicy(Qt::ClickFocus);
ui.actuatorLink->setFocusPolicy(Qt::ClickFocus);
ui.actuatorValue->setFocusPolicy(Qt::NoFocus);
setChannelRange();
disableMouseWheelEvents();
}
@ -120,11 +129,12 @@ void OutputChannelForm::enableChannelTest(bool state)
} else {
ui.actuatorMin->setEnabled(true);
ui.actuatorMax->setEnabled(true);
ui.actuatorRev->setEnabled(true);
if (m_mixerType != "Motor") {
ui.actuatorRev->setEnabled(true);
}
}
}
/**
* Toggles the channel linked state for use in testing mode
*/
@ -139,7 +149,7 @@ void OutputChannelForm::linkToggled(bool state)
if (!parent()) {
return;
}
int min = 10000;
int min = MAXOUTPUT_VALUE;
int linked_count = 0;
QList<OutputChannelForm *> outputChannelForms = parent()->findChildren<OutputChannelForm *>();
// set the linked channels of the parent widget to the same value
@ -179,7 +189,7 @@ int OutputChannelForm::max() const
*/
void OutputChannelForm::setMax(int maximum)
{
setRange(ui.actuatorMin->value(), maximum);
setRange(ui.actuatorMax->value(), maximum);
}
int OutputChannelForm::min() const
@ -192,7 +202,7 @@ int OutputChannelForm::min() const
*/
void OutputChannelForm::setMin(int minimum)
{
setRange(minimum, ui.actuatorMax->value());
setRange(minimum, ui.actuatorMin->value());
}
int OutputChannelForm::neutral() const
@ -216,11 +226,6 @@ void OutputChannelForm::setRange(int minimum, int maximum)
ui.actuatorMin->setValue(minimum);
ui.actuatorMax->setValue(maximum);
setChannelRange();
if (ui.actuatorMin->value() > ui.actuatorMax->value()) {
ui.actuatorRev->setChecked(true);
} else {
ui.actuatorRev->setChecked(false);
}
}
/**
@ -232,39 +237,59 @@ void OutputChannelForm::setRange(int minimum, int maximum)
*/
void OutputChannelForm::setChannelRange()
{
int oldMini = ui.actuatorNeutral->minimum();
int minValue = ui.actuatorMin->value();
int maxValue = ui.actuatorMax->value();
// int oldMaxi = ui.actuatorNeutral->maximum();
int oldMini = ui.actuatorNeutral->minimum();
int oldMaxi = ui.actuatorNeutral->maximum();
if (minValue <= maxValue) {
ui.actuatorNeutral->setRange(ui.actuatorMin->value(), ui.actuatorMax->value());
ui.actuatorRev->setChecked(false);
m_mixerType = outputMixerType();
// Red handle for Motors
if ((m_mixerType == "Motor") || (m_mixerType == "ReversableMotor")) {
ui.actuatorNeutral->setStyleSheet("QSlider::handle:horizontal { background: rgb(255, 100, 100); width: 18px; height: 28px;"
"margin: -3px 0; border-radius: 3px; border: 1px solid #777; }");
} else {
ui.actuatorNeutral->setRange(ui.actuatorMax->value(), ui.actuatorMin->value());
ui.actuatorRev->setChecked(true);
ui.actuatorNeutral->setStyleSheet("QSlider::handle:horizontal { background: rgb(196, 196, 196); width: 18px; height: 28px;"
"margin: -3px 0; border-radius: 3px; border: 1px solid #777; }");
}
// Normal motor will be *** never *** reversed : without arming a "Min" value (like 1900) can be applied !
if (m_mixerType == "Motor") {
if (minValue >= maxValue) {
// Keep old values
ui.actuatorMin->setValue(oldMini);
ui.actuatorMax->setValue(oldMaxi);
}
ui.actuatorRev->setChecked(false);
ui.actuatorRev->setEnabled(false);
ui.actuatorNeutral->setInvertedAppearance(false);
ui.actuatorNeutral->setRange(ui.actuatorMin->value(), ui.actuatorMax->value());
} else {
// Others output (!Motor)
// Auto check reverse checkbox SpinBox Min/Max changes
ui.actuatorRev->setEnabled(true);
if (minValue <= maxValue) {
ui.actuatorRev->setChecked(false);
ui.actuatorNeutral->setInvertedAppearance(false);
ui.actuatorNeutral->setRange(minValue, maxValue);
} else {
ui.actuatorRev->setChecked(true);
ui.actuatorNeutral->setInvertedAppearance(true);
ui.actuatorNeutral->setRange(maxValue, minValue);
}
}
// If old neutral was Min, stay Min
if (ui.actuatorNeutral->value() == oldMini) {
ui.actuatorNeutral->setValue(ui.actuatorNeutral->minimum());
}
// Enable only outputs already set in mixer
if (name() != "-") {
if (m_mixerType != "Disabled") {
ui.actuatorMin->setEnabled(true);
ui.actuatorMax->setEnabled(true);
ui.actuatorNeutral->setEnabled(true);
ui.actuatorValue->setEnabled(true);
// Enable checkboxes Rev and Link if some range
if (minValue != maxValue) {
ui.actuatorRev->setEnabled(true);
ui.actuatorLink->setEnabled(true);
} else {
ui.actuatorRev->setEnabled(false);
ui.actuatorLink->setEnabled(false);
}
} else {
ui.actuatorMin->setEnabled(false);
ui.actuatorMax->setEnabled(false);
@ -273,13 +298,9 @@ void OutputChannelForm::setChannelRange()
ui.actuatorMin->setValue(1000);
ui.actuatorMax->setValue(1000);
ui.actuatorNeutral->setRange(minValue, maxValue);
ui.actuatorNeutral->setEnabled(false);
ui.actuatorNeutral->setValue(minValue);
ui.actuatorValue->setEnabled(false);
}
// if (ui.actuatorNeutral->value() == oldMaxi)
// this can be dangerous if it happens to be controlling a motor at the time!
// ui.actuatorNeutral->setValue(ui.actuatorNeutral->maximum());
}
/**
@ -287,30 +308,17 @@ void OutputChannelForm::setChannelRange()
*/
void OutputChannelForm::reverseChannel(bool state)
{
// Sanity check: if state became true, make sure the Maxvalue was higher than Minvalue
// the situations below can happen!
if (state && (ui.actuatorMax->value() < ui.actuatorMin->value())) {
return;
}
if (!state && (ui.actuatorMax->value() > ui.actuatorMin->value())) {
return;
}
// if 'state' (reverse channel requested) apply only if not already reversed
if ((state && (ui.actuatorMax->value() > ui.actuatorMin->value()))
|| (!state && (ui.actuatorMax->value() < ui.actuatorMin->value()))) {
// Now, swap the min & max values (spin boxes)
int temp = ui.actuatorMax->value();
ui.actuatorMax->setValue(ui.actuatorMin->value());
ui.actuatorMin->setValue(temp);
ui.actuatorNeutral->setInvertedAppearance(state);
// Now, swap the min & max values (only on the spinboxes, the slider does not change!)
int temp = ui.actuatorMax->value();
ui.actuatorMax->setValue(ui.actuatorMin->value());
ui.actuatorMin->setValue(temp);
// Also update the channel value
// This is a trick to force the slider to update its value and
// emit the right signal itself, because our sendChannelTest(int) method
// relies on the object sender's identity.
if (ui.actuatorNeutral->value() < ui.actuatorNeutral->maximum()) {
ui.actuatorNeutral->setValue(ui.actuatorNeutral->value() + 1);
ui.actuatorNeutral->setValue(ui.actuatorNeutral->value() - 1);
} else {
ui.actuatorNeutral->setValue(ui.actuatorNeutral->value() - 1);
ui.actuatorNeutral->setValue(ui.actuatorNeutral->value() + 1);
setChannelRange();
return;
}
}
@ -328,10 +336,6 @@ void OutputChannelForm::sendChannelTest(int value)
return;
}
if (ui.actuatorRev->isChecked()) {
// the channel is reversed
value = ui.actuatorMin->value() - value + ui.actuatorMax->value();
}
// update the label
ui.actuatorValue->setValue(value);
@ -370,3 +374,21 @@ void OutputChannelForm::sendChannelTest(int value)
}
emit channelChanged(index(), value);
}
/**
*
* Returns MixerType
*/
QString OutputChannelForm::outputMixerType()
{
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings")));
Q_ASSERT(mixer);
QString mixerNumType = QString("Mixer%1Type").arg(index() + 1);
UAVObjectField *field = mixer->getField(mixerNumType);
Q_ASSERT(field);
QString mixerType = field->getValue().toString();
return mixerType;
}

View File

@ -58,6 +58,7 @@ public slots:
void setNeutral(int value);
void setRange(int minimum, int maximum);
void enableChannelTest(bool state);
QString outputMixerType();
signals:
void channelChanged(int index, int value);
@ -65,6 +66,7 @@ signals:
private:
Ui::outputChannelForm ui;
bool m_inChannelTest;
QString m_mixerType;
private slots:
void linkToggled(bool state);