1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-18 08:54:15 +01:00

Merge branch 'laurent/OP-1660_RCInput_Manual_Calibration' into next

This commit is contained in:
Laurent Lalanne 2015-01-03 13:22:16 +01:00
commit 5ddc70e2f0
14 changed files with 323 additions and 182 deletions

View File

@ -13,7 +13,6 @@ QSlider::groove:horizontal {
background: white;
height: 6px;
border-radius: 2px;
margin 10px 10px;
}
QSlider::add-page:horizontal {
@ -110,3 +109,5 @@ QSlider::handle:horizontal:hover {
border: 1px solid #444;
border-radius: 4px;
}

View File

@ -1,5 +1,11 @@
<RCC>
<qresource prefix="/configgadget">
<file>images/flightmode_bg1.png</file>
<file>images/flightmode_bg2.png</file>
<file>images/flightmode_bg3.png</file>
<file>images/flightmode_bg4.png</file>
<file>images/flightmode_bg5.png</file>
<file>images/flightmode_bg6.png</file>
<file>images/help2.png</file>
<file>images/ahrs-calib.svg</file>
<file>images/multirotor-shapes.svg</file>

View File

@ -71,6 +71,7 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
accessoryDesiredObj0 = AccessoryDesired::GetInstance(getObjectManager(), 0);
accessoryDesiredObj1 = AccessoryDesired::GetInstance(getObjectManager(), 1);
accessoryDesiredObj2 = AccessoryDesired::GetInstance(getObjectManager(), 2);
actuatorSettingsObj = ActuatorSettings::GetInstance(getObjectManager());
// Only instance 0 is present if the board is not connected.
// The other instances are populated lazily.
@ -96,6 +97,7 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
Q_ASSERT(index < ManualControlSettings::CHANNELGROUPS_NUMELEM);
InputChannelForm *form = new InputChannelForm(index, this);
form->setName(name);
form->moveTo(*(ui->channelLayout));
// The order of the following binding calls is important. Since the values will be populated
@ -104,7 +106,9 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
// will not be set correctly.
addWidgetBinding("ManualControlSettings", "ChannelNumber", form->ui->channelNumber, index);
addWidgetBinding("ManualControlSettings", "ChannelGroups", form->ui->channelGroup, index);
addWidgetBinding("ManualControlSettings", "ChannelNeutral", form->ui->channelNeutral, index);
// Slider position based on real time Rcinput (allow monitoring)
addWidgetBinding("ManualControlCommand", "Channel", form->ui->channelNeutral, index);
// Neutral value stored on board (SpinBox)
addWidgetBinding("ManualControlSettings", "ChannelNeutral", form->ui->neutralValue, index);
addWidgetBinding("ManualControlSettings", "ChannelMax", form->ui->channelMax, index);
addWidgetBinding("ManualControlSettings", "ChannelMin", form->ui->channelMin, index);
@ -408,6 +412,13 @@ void ConfigInputWidget::goToWizard()
previousFlightModeSettingsData = flightModeSettingsData;
flightModeSettingsData.Arming = FlightModeSettings::ARMING_ALWAYSDISARMED;
flightModeSettingsObj->setData(flightModeSettingsData);
// Stash actuatorSettings
actuatorSettingsData = actuatorSettingsObj->getData();
previousActuatorSettingsData = actuatorSettingsData;
// Now reset channel and actuator settings (disable outputs)
resetChannelSettings();
resetActuatorSettings();
// Use faster input update rate.
fastMdata();
@ -447,6 +458,7 @@ void ConfigInputWidget::wzCancel()
// Load settings back from beginning of wizard
manualSettingsObj->setData(previousManualSettingsData);
flightModeSettingsObj->setData(previousFlightModeSettingsData);
actuatorSettingsObj->setData(previousActuatorSettingsData);
}
void ConfigInputWidget::registerControlActivity()
@ -528,13 +540,16 @@ void ConfigInputWidget::wzNext()
// Restore original input update rate.
restoreMdata();
// Load actuator settings back from beginning of wizard
actuatorSettingsObj->setData(previousActuatorSettingsData);
// Leave setting the throttle neutral until the final Next press,
// else the throttle scaling causes the graphical stick movement to not
// match the tx stick
manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_THROTTLE] =
manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE] +
((manualSettingsData.ChannelMax[ManualControlSettings::CHANNELMAX_THROTTLE] -
manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE]) * 0.02);
manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE]) * 0.04);
if ((abs(manualSettingsData.ChannelMax[ManualControlSettings::CHANNELMAX_FLIGHTMODE] -
manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_FLIGHTMODE]) < 100) ||
(abs(manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_FLIGHTMODE] -
@ -1533,6 +1548,26 @@ void ConfigInputWidget::updatePositionSlider()
default:
break;
}
QString fmNumber = QString().setNum(manualSettingsDataPriv.FlightModeNumber);
int count = 0;
foreach(QSlider * sp, findChildren<QSlider *>()) {
// Find FlightMode slider and apply stylesheet
if (sp->objectName() == "channelNeutral") {
if (count == 4) {
sp->setStyleSheet(
"QSlider::groove:horizontal {border: 2px solid rgb(196, 196, 196); height: 12px; border-radius: 4px; "
"border-image:url(:/configgadget/images/flightmode_bg" + fmNumber + ".png); }"
"QSlider::add-page:horizontal { background: none; border: none; }"
"QSlider::sub-page:horizontal { background: none; border: none; }"
"QSlider::handle:horizontal { background: rgba(196, 196, 196, 255); width: 10px; height: 28px; "
"margin: -3px -2px; border-radius: 3px; border: 1px solid #777; }");
count++;
} else {
count++;
}
}
}
}
void ConfigInputWidget::updateCalibration()
@ -1547,8 +1582,12 @@ void ConfigInputWidget::updateCalibration()
(reverse[i] && manualSettingsData.ChannelMax[i] > manualCommandData.Channel[i])) {
manualSettingsData.ChannelMax[i] = manualCommandData.Channel[i];
}
if (i == ManualControlSettings::CHANNELNUMBER_FLIGHTMODE || i == ManualControlSettings::CHANNELNUMBER_FLIGHTMODE) {
adjustSpecialNeutrals();
} else {
manualSettingsData.ChannelNeutral[i] = manualCommandData.Channel[i];
}
}
manualSettingsObj->setData(manualSettingsData);
manualSettingsObj->updated();
@ -1558,10 +1597,15 @@ void ConfigInputWidget::simpleCalibration(bool enable)
{
if (enable) {
ui->configurationWizard->setEnabled(false);
ui->saveRCInputToRAM->setEnabled(false);
ui->saveRCInputToSD->setEnabled(false);
ui->runCalibration->setText(tr("Stop Manual Calibration"));
QMessageBox msgBox;
msgBox.setText(tr("Arming Settings are now set to 'Always Disarmed' for your safety."));
msgBox.setDetailedText(tr("You will have to reconfigure the arming settings manually when the wizard is finished."));
msgBox.setText(tr("<p>Arming Settings are now set to 'Always Disarmed' for your safety.</p>"
"<p>Be sure your receiver is powered with an external source and Transmitter is on.</p>"
"<p align='center'><b>Stop Manual Calibration</b> when done</p>"));
msgBox.setDetailedText(tr("You will have to reconfigure the arming settings manually when the manual calibration is finished."));
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.setDefaultButton(QMessageBox::Ok);
msgBox.exec();
@ -1582,9 +1626,19 @@ void ConfigInputWidget::simpleCalibration(bool enable)
fastMdataSingle(manualCommandObj, &manualControlMdata);
// Stash actuatorSettings
actuatorSettingsData = actuatorSettingsObj->getData();
previousActuatorSettingsData = actuatorSettingsData;
// Disable all actuators
resetActuatorSettings();
connect(manualCommandObj, SIGNAL(objectUnpacked(UAVObject *)), this, SLOT(updateCalibration()));
} else {
ui->configurationWizard->setEnabled(true);
ui->saveRCInputToRAM->setEnabled(true);
ui->saveRCInputToSD->setEnabled(true);
ui->runCalibration->setText(tr("Start Manual Calibration"));
manualCommandData = manualCommandObj->getData();
manualSettingsData = manualSettingsObj->getData();
@ -1592,22 +1646,64 @@ void ConfigInputWidget::simpleCalibration(bool enable)
restoreMdataSingle(manualCommandObj, &manualControlMdata);
for (unsigned int i = 0; i < ManualControlCommand::CHANNEL_NUMELEM; i++) {
if (i == ManualControlSettings::CHANNELNUMBER_FLIGHTMODE || i == ManualControlSettings::CHANNELNUMBER_FLIGHTMODE) {
adjustSpecialNeutrals();
} else {
manualSettingsData.ChannelNeutral[i] = manualCommandData.Channel[i];
}
}
manualSettingsObj->setData(manualSettingsData);
// Load actuator settings back from beginning of manual calibration
actuatorSettingsObj->setData(previousActuatorSettingsData);
disconnect(manualCommandObj, SIGNAL(objectUnpacked(UAVObject *)), this, SLOT(updateCalibration()));
}
}
void ConfigInputWidget::adjustSpecialNeutrals()
{
// FlightMode and Throttle need special neutral settings
//
// Force flight mode neutral to middle
manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNUMBER_FLIGHTMODE] =
(manualSettingsData.ChannelMax[ManualControlSettings::CHANNELNUMBER_FLIGHTMODE] +
manualSettingsData.ChannelMin[ManualControlSettings::CHANNELNUMBER_FLIGHTMODE]) / 2;
// Force throttle to be near min
// Force throttle to be near min, add 4% from total range to avoid arming issues
manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_THROTTLE] =
manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE] +
((manualSettingsData.ChannelMax[ManualControlSettings::CHANNELMAX_THROTTLE] -
manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE]) * 0.02);
manualSettingsData.ChannelMin[ManualControlSettings::CHANNELMIN_THROTTLE]) * 0.04);
}
bool ConfigInputWidget::shouldObjectBeSaved(UAVObject *object)
{
// ManualControlCommand no need to be saved
return dynamic_cast<ManualControlCommand *>(object) == NULL;
}
void ConfigInputWidget::resetChannelSettings()
{
manualSettingsData = manualSettingsObj->getData();
// Clear all channel data : Channel Type (PPM,PWM..) and Number
for (unsigned int channel = 0; channel < 9; channel++) {
manualSettingsData.ChannelGroups[channel] = ManualControlSettings::CHANNELGROUPS_NONE;
manualSettingsData.ChannelNumber[channel] = 0;
manualSettingsObj->setData(manualSettingsData);
disconnect(manualCommandObj, SIGNAL(objectUnpacked(UAVObject *)), this, SLOT(updateCalibration()));
}
}
void ConfigInputWidget::resetActuatorSettings()
{
actuatorSettingsData = actuatorSettingsObj->getData();
// Clear all output data : Min, max, neutral = 1500
// 1500 = servo middle, can be applied to all outputs because board is 'Alwaysdisarmed'
for (unsigned int output = 0; output < 12; output++) {
actuatorSettingsData.ChannelMax[output] = 1500;
actuatorSettingsData.ChannelMin[output] = 1500;
actuatorSettingsData.ChannelNeutral[output] = 1500;
actuatorSettingsObj->setData(actuatorSettingsData);
}
}

View File

@ -39,6 +39,7 @@
#include <QRadioButton>
#include "manualcontrolcommand.h"
#include "manualcontrolsettings.h"
#include "actuatorsettings.h"
#include "flightmodesettings.h"
#include "receiveractivity.h"
#include <QGraphicsView>
@ -65,6 +66,7 @@ public:
goToWizard();
}
void enableControls(bool enable);
bool shouldObjectBeSaved(UAVObject *object);
private:
bool growing;
@ -121,6 +123,10 @@ private:
ManualControlSettings::DataFields manualSettingsData;
ManualControlSettings::DataFields previousManualSettingsData;
ActuatorSettings *actuatorSettingsObj;
ActuatorSettings::DataFields actuatorSettingsData;
ActuatorSettings::DataFields previousActuatorSettingsData;
FlightModeSettings *flightModeSettingsObj;
FlightModeSettings::DataFields flightModeSettingsData;
FlightModeSettings::DataFields previousFlightModeSettingsData;
@ -188,7 +194,10 @@ private slots:
void updatePositionSlider();
void invertControls();
void simpleCalibration(bool state);
void adjustSpecialNeutrals();
void updateCalibration();
void resetChannelSettings();
void resetActuatorSettings();
protected:
void resizeEvent(QResizeEvent *event);

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -116,8 +116,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>772</width>
<height>514</height>
<width>774</width>
<height>497</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
@ -419,7 +419,7 @@
<bool>false</bool>
</property>
<property name="text">
<string>Manual Calibration</string>
<string>Start Manual Calibration</string>
</property>
<property name="checkable">
<bool>true</bool>
@ -542,8 +542,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>724</width>
<height>497</height>
<width>730</width>
<height>554</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_7" rowstretch="1,0,0,0">
@ -2044,8 +2044,8 @@ Setup the flight mode channel on the RC Input tab if you have not done so alread
<rect>
<x>0</x>
<y>0</y>
<width>407</width>
<height>138</height>
<width>544</width>
<height>169</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">

View File

@ -12,6 +12,7 @@ InputChannelForm::InputChannelForm(const int index, QWidget *parent) :
connect(ui->channelMin, SIGNAL(valueChanged(int)), this, SLOT(minMaxUpdated()));
connect(ui->channelMax, SIGNAL(valueChanged(int)), this, SLOT(minMaxUpdated()));
connect(ui->neutralValue, SIGNAL(valueChanged(int)), this, SLOT(neutralUpdated()));
connect(ui->channelNeutral, SIGNAL(valueChanged(int)), this, SLOT(updateTooltip()));
connect(ui->channelGroup, SIGNAL(currentIndexChanged(int)), this, SLOT(groupUpdated()));
connect(ui->channelRev, SIGNAL(toggled(bool)), this, SLOT(reversedUpdated()));
@ -53,6 +54,15 @@ void InputChannelForm::minMaxUpdated()
ui->channelRev->setChecked(reverse);
ui->channelNeutral->setInvertedAppearance(reverse);
ui->channelNeutral->setInvertedControls(reverse);
updateNeutralMark();
}
void InputChannelForm::updateTooltip()
{
int currentValue = ui->channelNeutral->value();
ui->channelNeutral->setToolTip(QString::number(currentValue));
}
void InputChannelForm::neutralUpdated()
@ -72,6 +82,30 @@ void InputChannelForm::neutralUpdated()
ui->channelMax->setValue(neutralValue);
}
}
updateNeutralMark();
}
void InputChannelForm::updateNeutralMark()
{
// Add a small neutral red mark on groove background
int neutral = ui->neutralValue->value();
int min = ui->channelMin->value();
int max = ui->channelMax->value();
float range = max - min;
float offset = neutral - min;
float neutralPosition = offset / range;
ui->channelNeutral->setStyleSheet(
"QSlider::groove:horizontal { border: 1px solid rgb(196, 196, 196); height: 6px; border-radius: 2px; "
"background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:" + QString::number(neutralPosition - 0.01) + " transparent, stop:"
+ QString::number(neutralPosition) + " red, stop:" + QString::number(neutralPosition + 0.01) + " transparent); }"
"QSlider::add-page:horizontal { background: rgba(255,255,255,180); border: 1px solid #777; margin: 0px 0px 0px 2px; border-radius: 4px; }"
"QSlider::sub-page:horizontal { background: rgba(78,147,246,180); border: 1px solid #777; margin: 0px 2px 0px 0px; border-radius: 4px; }"
"QSlider::handle:horizontal { background: rgba(196,196,196,180); width: 18px; height: 28px; margin: -2px 0px; border-radius: 3px; "
"border: 1px solid #777; }"
);
}
void InputChannelForm::reversedUpdated()

View File

@ -23,6 +23,8 @@ public:
virtual void setName(const QString &name);
private slots:
void updateNeutralMark();
void updateTooltip();
void minMaxUpdated();
void neutralUpdated();
void reversedUpdated();

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>923</width>
<height>51</height>
<height>57</height>
</rect>
</property>
<property name="windowTitle">
@ -215,7 +215,7 @@ margin:1px;</string>
</property>
</widget>
</item>
<item row="1" column="9">
<item row="1" column="11">
<widget class="QSpinBox" name="channelResponseTime">
<property name="enabled">
<bool>true</bool>
@ -311,7 +311,7 @@ margin:1px;</string>
</property>
</widget>
</item>
<item row="0" column="7">
<item row="0" column="9">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -343,7 +343,7 @@ margin:1px;</string>
</property>
</spacer>
</item>
<item row="1" column="7">
<item row="1" column="9">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -359,8 +359,8 @@ margin:1px;</string>
</property>
</spacer>
</item>
<item row="0" column="8">
<widget class="QLabel" name="legend6">
<item row="0" column="10">
<widget class="QLabel" name="legend7">
<property name="enabled">
<bool>true</bool>
</property>
@ -408,8 +408,8 @@ margin:1px;</string>
</property>
</widget>
</item>
<item row="0" column="9">
<widget class="QLabel" name="legend7">
<item row="0" column="11">
<widget class="QLabel" name="legend8">
<property name="enabled">
<bool>true</bool>
</property>
@ -457,8 +457,8 @@ margin:1px;</string>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QLabel" name="legend5">
<item row="0" column="8">
<widget class="QLabel" name="legend6">
<property name="enabled">
<bool>true</bool>
</property>
@ -506,52 +506,6 @@ margin:1px;</string>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QLabel" name="legend4">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="font">
<font>
<pointsize>-1</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Channel neutral</string>
</property>
<property name="styleSheet">
<string notr="true">background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255));
color: rgb(255, 255, 255);
border-radius: 5;
font: bold 12px;
margin:1px;</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="text">
<string>Neutral</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="legend3">
<property name="enabled">
@ -644,7 +598,7 @@ margin:1px;</string>
</property>
</widget>
</item>
<item row="1" column="6">
<item row="1" column="8">
<widget class="QSpinBox" name="channelMax">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@ -684,105 +638,7 @@ margin:1px;</string>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QFrame" name="frame">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSlider" name="channelNeutral">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>50</width>
<height>0</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="neutralValue">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="value">
<number>1000</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="8">
<item row="1" column="10">
<widget class="QFrame" name="frame_1">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
@ -846,6 +702,143 @@ margin:1px;</string>
</layout>
</widget>
</item>
<item row="1" column="7">
<widget class="QSpinBox" name="neutralValue">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="value">
<number>1000</number>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QSlider" name="channelNeutral">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>50</width>
<height>0</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string/>
</property>
<property name="accessibleDescription">
<string/>
</property>
<property name="inputMethodHints">
<set>Qt::ImhNone</set>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBothSides</enum>
</property>
<property name="tickInterval">
<number>50</number>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QLabel" name="legend4">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="font">
<font>
<pointsize>-1</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Channel value</string>
</property>
<property name="styleSheet">
<string notr="true">background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255));
color: rgb(255, 255, 255);
border-radius: 5;
font: bold 12px;
margin:1px;</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="text">
<string>Channel Value</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="7">
<widget class="QLabel" name="legend5">
<property name="toolTip">
<string>Channel neutral</string>
</property>
<property name="styleSheet">
<string notr="true">background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255));
color: rgb(255, 255, 255);
border-radius: 5;
font: bold 12px;
margin:1px;</string>
</property>
<property name="text">
<string>Neutral</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>