From a2af596b56cac8102651b717ab77ee87dedff698 Mon Sep 17 00:00:00 2001 From: m_thread Date: Mon, 25 Aug 2014 23:45:46 +0200 Subject: [PATCH] OP-1222 Changed servo calibarion to contain min, max and center on the same page. --- .../pages/airframestabfixedwingpage.cpp | 1 - .../pages/outputcalibrationpage.cpp | 186 +++-- .../setupwizard/pages/outputcalibrationpage.h | 10 +- .../pages/outputcalibrationpage.ui | 707 +++++++++++------- 4 files changed, 571 insertions(+), 333 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/airframestabfixedwingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/airframestabfixedwingpage.cpp index c2d5eebaf..431e84f40 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/airframestabfixedwingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/airframestabfixedwingpage.cpp @@ -33,7 +33,6 @@ AirframeStabFixedwingPage::AirframeStabFixedwingPage(SetupWizard *wizard, QWidge ui(new Ui::AirframeStabFixedwingPage) { ui->setupUi(this); - setFinalPage(true); } AirframeStabFixedwingPage::~AirframeStabFixedwingPage() diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp index 969d88472..5b16e12f4 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp @@ -46,6 +46,15 @@ OutputCalibrationPage::OutputCalibrationPage(SetupWizard *wizard, QWidget *paren m_vehicleScene = new QGraphicsScene(this); ui->vehicleView->setScene(m_vehicleScene); + connect(ui->motorNeutralButton, SIGNAL(toggled(bool)), this, SLOT(on_motorNeutralButton_toggled(bool))); + connect(ui->motorNeutralSlider, SIGNAL(valueChanged(int)), this, SLOT(on_motorNeutralSlider_valueChanged(int))); + + connect(ui->servoButton, SIGNAL(toggled(bool)), this, SLOT(on_servoButton_toggled(bool))); + connect(ui->servoMinAngleSlider, SIGNAL(valueChanged(int)), this, SLOT(on_servoMinAngleSlider_valueChanged(int))); + connect(ui->servoCenterAngleSlider, SIGNAL(valueChanged(int)), this, SLOT(on_servoCenterAngleSlider_valueChanged(int))); + connect(ui->servoMaxAngleSlider, SIGNAL(valueChanged(int)), this, SLOT(on_servoMaxAngleSlider_valueChanged(int))); + + connect(ui->reverseCheckbox, SIGNAL(toggled(bool)), this, SLOT(on_reverseCheckbox_toggled(bool))); } OutputCalibrationPage::~OutputCalibrationPage() @@ -108,17 +117,17 @@ void OutputCalibrationPage::setupVehicle() // The m_wizardIndexes array contains the index of the QStackedWidget // in the page to use for each step. - m_wizardIndexes << 0 << 1 << 1 << 1 << 2 << 3 << 4; + m_wizardIndexes << 0 << 1 << 1 << 1 << 2; // All element ids to load from the svg file and manage. m_vehicleElementIds << "tri" << "tri-frame" << "tri-m1" << "tri-m2" << "tri-m3" << "tri-s1"; // The index of the elementId to highlight ( not dim ) for each step // this is the index in the m_vehicleElementIds - 1. - m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 4 << 4; + m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4; // The channel number to configure for each step. - m_channelIndex << 0 << 0 << 1 << 2 << 3 << 3 << 3; + m_channelIndex << 0 << 0 << 1 << 2 << 3; setupActuatorMinMaxAndNeutral(0, 2, 3); @@ -174,34 +183,34 @@ void OutputCalibrationPage::setupVehicle() // Fixed Wing case SetupWizard::FIXED_WING_DUAL_AILERON: loadSVGFile(FIXEDWING_SVG_FILE); - m_wizardIndexes << 0 << 1 << 2 << 3 << 4 << 2 << 3 << 4 << 2 << 3 << 4 << 2 << 3 << 4; + m_wizardIndexes << 0 << 1 << 2 << 2 << 2 << 2; m_vehicleElementIds << "aileron" << "aileron-frame" << "aileron-motor" << "aileron-ail-left" << "aileron-ail-right" << "aileron-rudder" << "aileron-elevator"; - m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 2 << 2 << 3 << 3 << 3 << 4 << 4 << 4 << 5 << 5 << 5; - m_channelIndex << 0 << 2 << 0 << 0 << 0 << 1 << 1 << 1 << 3 << 3 << 3 << 4 << 4 << 4; + m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 5; + m_channelIndex << 0 << 2 << 0 << 1 << 3 << 4; - setupActuatorMinMaxAndNeutral(3, 3, 5); + setupActuatorMinMaxAndNeutral(2, 2, 5); getWizard()->setActuatorSettings(m_actuatorSettings); break; case SetupWizard::FIXED_WING_AILERON: loadSVGFile(FIXEDWING_SVG_FILE); - m_wizardIndexes << 0 << 1 << 2 << 3 << 4 << 2 << 3 << 4 << 2 << 3 << 4; + m_wizardIndexes << 0 << 1 << 2 << 2 << 2; m_vehicleElementIds << "aileron-single" << "ail2-frame" << "ail2-motor" << "ail2-aileron" << "ail2-rudder" << "ail2-elevator"; - m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 2 << 2 << 3 << 3 << 3 << 4 << 4 << 4; - m_channelIndex << 0 << 2 << 0 << 0 << 0 << 4 << 4 << 4 << 1 << 1 << 1; + m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4; + m_channelIndex << 0 << 2 << 0 << 4 << 1; - setupActuatorMinMaxAndNeutral(3, 3, 4); + setupActuatorMinMaxAndNeutral(2, 2, 4); getWizard()->setActuatorSettings(m_actuatorSettings); break; case SetupWizard::FIXED_WING_ELEVON: loadSVGFile(FIXEDWING_SVG_FILE); - m_wizardIndexes << 0 << 1 << 2 << 3 << 4 << 2 << 3 << 4; + m_wizardIndexes << 0 << 1 << 2 << 2; m_vehicleElementIds << "elevon" << "elevon-frame" << "elevon-motor" << "elevon-left" << "elevon-right"; - m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 2 << 2 << 3 << 3 << 3; - m_channelIndex << 0 << 2 << 0 << 0 << 0 << 1 << 1 << 1; + m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3; + m_channelIndex << 0 << 2 << 0 << 1; - setupActuatorMinMaxAndNeutral(3, 3, 3); + setupActuatorMinMaxAndNeutral(2, 2, 3); getWizard()->setActuatorSettings(m_actuatorSettings); break; @@ -283,13 +292,16 @@ void OutputCalibrationPage::setWizardPage() if (currentPageIndex == 1) { ui->motorNeutralSlider->setValue(m_actuatorSettings[currentChannel].channelNeutral); } else if (currentPageIndex == 2) { - ui->servoCenterSlider->setValue(m_actuatorSettings[currentChannel].channelNeutral); - } else if (currentPageIndex == 3) { - ui->servoMinAngleSlider->setMaximum(m_actuatorSettings[currentChannel].channelNeutral); - ui->servoMinAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMin); - } else if (currentPageIndex == 4) { - ui->servoMaxAngleSlider->setMinimum(m_actuatorSettings[currentChannel].channelNeutral); - ui->servoMaxAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMax); + enableServoSliders(false); + if (ui->reverseCheckbox->isChecked()) { + ui->servoMaxAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMax); + ui->servoCenterAngleSlider->setValue(m_actuatorSettings[currentChannel].channelNeutral); + ui->servoMinAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMin); + } else { + ui->servoMinAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMin); + ui->servoCenterAngleSlider->setValue(m_actuatorSettings[currentChannel].channelNeutral); + ui->servoMaxAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMax); + } } } setupVehicleHighlightedPart(); @@ -360,6 +372,7 @@ void OutputCalibrationPage::enableButtons(bool enable) void OutputCalibrationPage::on_motorNeutralButton_toggled(bool checked) { ui->motorNeutralButton->setText(checked ? tr("Stop") : tr("Start")); + ui->motorNeutralSlider->setEnabled(checked); quint16 channel = getCurrentChannel(); quint16 safeValue = m_actuatorSettings[channel].channelNeutral; onStartButtonToggle(ui->motorNeutralButton, channel, m_actuatorSettings[channel].channelNeutral, safeValue, ui->motorNeutralSlider); @@ -370,6 +383,7 @@ void OutputCalibrationPage::onStartButtonToggle(QAbstractButton *button, quint16 if (button->isChecked()) { if (checkAlarms()) { enableButtons(false); + enableServoSliders(true); m_calibrationUtil->startChannelOutput(channel, safeValue); slider->setValue(value); m_calibrationUtil->setChannelOutputValue(value); @@ -378,11 +392,20 @@ void OutputCalibrationPage::onStartButtonToggle(QAbstractButton *button, quint16 } } else { m_calibrationUtil->stopChannelOutput(); + enableServoSliders(false); enableButtons(true); } debugLogChannelValues(); } +void OutputCalibrationPage::enableServoSliders(bool enabled) +{ + ui->servoCenterAngleSlider->setEnabled(enabled); + ui->servoMinAngleSlider->setEnabled(enabled); + ui->servoMaxAngleSlider->setEnabled(enabled); + ui->reverseCheckbox->setEnabled(!enabled); +} + bool OutputCalibrationPage::checkAlarms() { ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); @@ -434,68 +457,103 @@ void OutputCalibrationPage::on_motorNeutralSlider_valueChanged(int value) } } -void OutputCalibrationPage::on_servoCenterButton_toggled(bool checked) +void OutputCalibrationPage::on_servoButton_toggled(bool checked) { - ui->servoCenterButton->setText(checked ? tr("Stop") : tr("Start")); + ui->servoButton->setText(checked ? tr("Stop") : tr("Start")); quint16 channel = getCurrentChannel(); - quint16 safeValue = m_actuatorSettings[channel].channelNeutral; - onStartButtonToggle(ui->servoCenterButton, channel, safeValue, safeValue, ui->servoCenterSlider); + quint16 safeValue = m_actuatorSettings[channel].channelNeutral; + onStartButtonToggle(ui->servoButton, channel, safeValue, safeValue, ui->servoCenterAngleSlider); } -void OutputCalibrationPage::on_servoCenterSlider_valueChanged(int position) +void OutputCalibrationPage::on_servoCenterAngleSlider_valueChanged(int position) { Q_UNUSED(position); - if (ui->servoCenterButton->isChecked()) { - quint16 value = ui->servoCenterSlider->value(); - m_calibrationUtil->setChannelOutputValue(value); - quint16 channel = getCurrentChannel(); - m_actuatorSettings[channel].channelNeutral = value; + quint16 value = ui->servoCenterAngleSlider->value(); + m_calibrationUtil->setChannelOutputValue(value); + quint16 channel = getCurrentChannel(); + m_actuatorSettings[channel].channelNeutral = value; - // Adjust min and max - if (value < m_actuatorSettings[channel].channelMin) { - m_actuatorSettings[channel].channelMin = value; + // Adjust min and max + if (ui->reverseCheckbox->isChecked()) { + if (value >= m_actuatorSettings[channel].channelMin) { + ui->servoMinAngleSlider->setValue(value); } - if (value > m_actuatorSettings[channel].channelMax) { - m_actuatorSettings[channel].channelMax = value; + if (value <= m_actuatorSettings[channel].channelMax) { + ui->servoMaxAngleSlider->setValue(value); + } + } else { + if (value <= m_actuatorSettings[channel].channelMin) { + ui->servoMinAngleSlider->setValue(value); + } + if (value >= m_actuatorSettings[channel].channelMax) { + ui->servoMaxAngleSlider->setValue(value); } - debugLogChannelValues(); } -} - -void OutputCalibrationPage::on_servoMinAngleButton_toggled(bool checked) -{ - ui->servoMinAngleButton->setText(checked ? tr("Stop") : tr("Start")); - quint16 channel = getCurrentChannel(); - quint16 safeValue = m_actuatorSettings[channel].channelNeutral; - onStartButtonToggle(ui->servoMinAngleButton, channel, m_actuatorSettings[channel].channelMin, safeValue, ui->servoMinAngleSlider); + debugLogChannelValues(); } void OutputCalibrationPage::on_servoMinAngleSlider_valueChanged(int position) { Q_UNUSED(position); - if (ui->servoMinAngleButton->isChecked()) { - quint16 value = ui->servoMinAngleSlider->value(); - m_calibrationUtil->setChannelOutputValue(value); - m_actuatorSettings[getCurrentChannel()].channelMin = value; - debugLogChannelValues(); - } -} + quint16 value = ui->servoMinAngleSlider->value(); + m_calibrationUtil->setChannelOutputValue(value); + m_actuatorSettings[getCurrentChannel()].channelMin = value; -void OutputCalibrationPage::on_servoMaxAngleButton_toggled(bool checked) -{ - ui->servoMaxAngleButton->setText(checked ? tr("Stop") : tr("Start")); - quint16 channel = getCurrentChannel(); - quint16 safeValue = m_actuatorSettings[channel].channelNeutral; - onStartButtonToggle(ui->servoMaxAngleButton, channel, m_actuatorSettings[channel].channelMax, safeValue, ui->servoMaxAngleSlider); + // Adjust neutral and max + if (ui->reverseCheckbox->isChecked()) { + if(value <= m_actuatorSettings[getCurrentChannel()].channelNeutral) { + ui->servoCenterAngleSlider->setValue(value); + } + if(value <= m_actuatorSettings[getCurrentChannel()].channelMax) { + ui->servoMaxAngleSlider->setValue(value); + } + } else { + if(value >= m_actuatorSettings[getCurrentChannel()].channelNeutral) { + ui->servoCenterAngleSlider->setValue(value); + } + if(value >= m_actuatorSettings[getCurrentChannel()].channelMax) { + ui->servoMaxAngleSlider->setValue(value); + } + } + debugLogChannelValues(); } void OutputCalibrationPage::on_servoMaxAngleSlider_valueChanged(int position) { Q_UNUSED(position); - if (ui->servoMaxAngleButton->isChecked()) { - quint16 value = ui->servoMaxAngleSlider->value(); - m_calibrationUtil->setChannelOutputValue(value); - m_actuatorSettings[getCurrentChannel()].channelMax = value; - debugLogChannelValues(); + quint16 value = ui->servoMaxAngleSlider->value(); + m_calibrationUtil->setChannelOutputValue(value); + m_actuatorSettings[getCurrentChannel()].channelMax = value; + + // Adjust neutral and min + if (ui->reverseCheckbox->isChecked()) { + if(value >= m_actuatorSettings[getCurrentChannel()].channelNeutral) { + ui->servoCenterAngleSlider->setValue(value); + } + if(value >= m_actuatorSettings[getCurrentChannel()].channelMin) { + ui->servoMinAngleSlider->setValue(value); + } + } else { + if(value <= m_actuatorSettings[getCurrentChannel()].channelNeutral) { + ui->servoCenterAngleSlider->setValue(value); + } + if(value <= m_actuatorSettings[getCurrentChannel()].channelMin) { + ui->servoMinAngleSlider->setValue(value); + } } + debugLogChannelValues(); +} + +void OutputCalibrationPage::on_reverseCheckbox_toggled(bool checked) +{ + if (m_actuatorSettings[getCurrentChannel()].channelMax > m_actuatorSettings[getCurrentChannel()].channelMin) { + quint16 oldMax = m_actuatorSettings[getCurrentChannel()].channelMax; + m_actuatorSettings[getCurrentChannel()].channelMax = m_actuatorSettings[getCurrentChannel()].channelMin; + m_actuatorSettings[getCurrentChannel()].channelMin = oldMax; + } else if (m_actuatorSettings[getCurrentChannel()].channelMax < m_actuatorSettings[getCurrentChannel()].channelMin) { + quint16 oldMax = m_actuatorSettings[getCurrentChannel()].channelMax; + m_actuatorSettings[getCurrentChannel()].channelMax = m_actuatorSettings[getCurrentChannel()].channelMin; + m_actuatorSettings[getCurrentChannel()].channelMin = oldMax; + } + setWizardPage(); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h index d851fa639..998bd0cf9 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h @@ -65,14 +65,11 @@ private slots: void on_motorNeutralButton_toggled(bool checked); void on_motorNeutralSlider_valueChanged(int value); - void on_servoCenterButton_toggled(bool checked); - void on_servoCenterSlider_valueChanged(int position); - - void on_servoMinAngleButton_toggled(bool checked); + void on_servoButton_toggled(bool checked); + void on_servoCenterAngleSlider_valueChanged(int position); void on_servoMinAngleSlider_valueChanged(int position); - - void on_servoMaxAngleButton_toggled(bool checked); void on_servoMaxAngleSlider_valueChanged(int position); + void on_reverseCheckbox_toggled(bool checked); private: void setupVehicle(); @@ -81,6 +78,7 @@ private: void setupVehicleHighlightedPart(); void setWizardPage(); void enableButtons(bool enable); + void enableServoSliders(bool enabled); void onStartButtonToggle(QAbstractButton *button, quint16 channel, quint16 value, quint16 safeValue, QSlider *slider); bool checkAlarms(); void debugLogChannelValues(); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index e69c67666..fb56f4fb1 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -31,10 +31,29 @@ + + + + + 0 + 0 + + + + + 200 + 200 + + + + QFrame::NoFrame + + + - 4 + 2 @@ -133,7 +152,7 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p>This step calibrates<span style=" font-weight:600;"> the center position of the servo</span>. To set the center position for this servo, press the Start button below and slide the slider to center the servo. </p><p>When done press button again to stop.</p></body></html> + <html><head/><body><p>This step calibrates<span style=" font-weight:600;"> the minimum, center and maximum angle of the servo</span>. To set the angles for this servo, press the Start button below and slide the slider for the angle to set. The servo will follow the sliders position. <br/>When done press button again to stop.</p><p>Check Reverse to reverse servo action.</p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -144,47 +163,435 @@ p, li { white-space: pre-wrap; } - - - false - - - 600 - - - 2400 - - - 1 - - - 10 - - - 1500 - - - true - + - Qt::Horizontal + Qt::Vertical - - false - - - false - - - QSlider::TicksBelow - - - 40 + + + 20 + 40 + + + + + + + + 6 + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QSlider::groove:horizontal { + border: 1px solid rgb(196, 196, 196); + background: white; + height: 6px; + border-radius: 2px; + margin 10px 10px; +} + +QSlider::add-page:horizontal { + background: #fff; + border: 1px solid #777; + height: 1px; + border-radius: 4px; +} + +QSlider::add-page:horizontal:disabled { + background: #eee; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::sub-page:horizontal { + background: rgb(78, 147, 246); + border: 1px solid #777; + height: 1px; + border-radius: 4px; +} + +QSlider::sub-page:horizontal:disabled { + background: #ccc; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::handle:horizontal { + background: rgb(196, 196, 196); + width: 18px; + height: 28px; + margin: -2px 0; + border-radius: 3px; + border: 1px solid #777; +} + +QSlider::groove:vertical { + border: 1px solid rgb(196, 196, 196); + background: white; + width: 6px; + border-radius: 2px; + margin 0px -10px; + margin-top: 5px; + margin-bottom: 5px; +} + +QSlider::sub-page:vertical { + background: #fff; + border: 1px solid #777; + width: 1px; + border-radius: 4px; +} + +QSlider::sub-page:vertical:disabled { + background: #eee; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::add-page:vertical { + background: rgb(78, 147, 246); + border: 1px solid #777; + width: 1px; + border-radius: 4px; +} + +QSlider::add-page:vertical:disabled { + background: #ccc; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::handle:vertical { + background: rgb(196, 196, 196); + width: 18px; + margin: -6 -6; + border-radius: 3px; + border: 1px solid #777; +} + +QSlider::handle:vertical:hover { + background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #fff, stop:1 #ddd); + border: 1px solid #444; + border-radius: 4px; +} + +QSlider::handle:horizontal:hover { + background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #fff, stop:1 #ddd); + border: 1px solid #444; + border-radius: 4px; +} + + + 600 + + + 2400 + + + 1500 + + + Qt::Horizontal + + + + + + + QSlider::groove:horizontal { + border: 1px solid rgb(196, 196, 196); + background: white; + height: 6px; + border-radius: 2px; + margin 10px 10px; +} + +QSlider::add-page:horizontal { + background: rgb(78, 147, 246); + border: 1px solid #777; + height: 1px; + border-radius: 4px; +} + +QSlider::add-page:horizontal:disabled { + background: #eee; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::sub-page:horizontal { + background: rgb(78, 147, 246); + border: 1px solid #777; + height: 1px; + border-radius: 4px; +} + +QSlider::sub-page:horizontal:disabled { + background: #eee; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::handle:horizontal { + background: rgb(196, 196, 196); + width: 18px; + height: 28px; + margin: -2px 0; + border-radius: 3px; + border: 1px solid #777; +} + +QSlider::groove:vertical { + border: 1px solid rgb(196, 196, 196); + background: white; + width: 6px; + border-radius: 2px; + margin 0px -10px; + margin-top: 5px; + margin-bottom: 5px; +} + +QSlider::sub-page:vertical { + background: #fff; + border: 1px solid #777; + width: 1px; + border-radius: 4px; +} + +QSlider::sub-page:vertical:disabled { + background: #eee; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::add-page:vertical { + background: rgb(78, 147, 246); + border: 1px solid #777; + width: 1px; + border-radius: 4px; +} + +QSlider::add-page:vertical:disabled { + background: #ccc; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::handle:vertical { + background: rgb(196, 196, 196); + width: 18px; + margin: -6 -6; + border-radius: 3px; + border: 1px solid #777; +} + +QSlider::handle:vertical:hover { + background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #fff, stop:1 #ddd); + border: 1px solid #444; + border-radius: 4px; +} + +QSlider::handle:horizontal:hover { + background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #fff, stop:1 #ddd); + border: 1px solid #444; + border-radius: 4px; +} + + + 600 + + + 2400 + + + 1500 + + + Qt::Horizontal + + + + + + + QSlider::groove:horizontal { + border: 1px solid rgb(196, 196, 196); + background: white; + height: 6px; + border-radius: 2px; + margin 10px 10px; +} + +QSlider::sub-page:horizontal { + background: #fff; + border: 1px solid #777; + height: 1px; + border-radius: 4px; +} + +QSlider::sub-page:horizontal:disabled { + background: #eee; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::add-page:horizontal { + background: rgb(78, 147, 246); + border: 1px solid #777; + height: 1px; + border-radius: 4px; +} + +QSlider::add-page:horizontal:disabled { + background: #ccc; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::handle:horizontal { + background: rgb(196, 196, 196); + width: 18px; + height: 28px; + margin: -2px 0; + border-radius: 3px; + border: 1px solid #777; +} + +QSlider::groove:vertical { + border: 1px solid rgb(196, 196, 196); + background: white; + width: 6px; + border-radius: 2px; + margin 0px -10px; + margin-top: 5px; + margin-bottom: 5px; +} + +QSlider::sub-page:vertical { + background: #fff; + border: 1px solid #777; + width: 1px; + border-radius: 4px; +} + +QSlider::sub-page:vertical:disabled { + background: #eee; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::add-page:vertical { + background: rgb(78, 147, 246); + border: 1px solid #777; + width: 1px; + border-radius: 4px; +} + +QSlider::add-page:vertical:disabled { + background: #ccc; + border: 1px solid #999; + width: 1px; + border-radius: 4px; +} + +QSlider::handle:vertical { + background: rgb(196, 196, 196); + width: 18px; + margin: -6 -6; + border-radius: 3px; + border: 1px solid #777; +} + +QSlider::handle:vertical:hover { + background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #fff, stop:1 #ddd); + border: 1px solid #444; + border-radius: 4px; +} + +QSlider::handle:horizontal:hover { + background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #fff, stop:1 #ddd); + border: 1px solid #444; + border-radius: 4px; +} + + + 600 + + + 2400 + + + 1500 + + + Qt::Horizontal + + + false + + + + + + + Reverse + + + + + + + Min + + + + + + + Center + + + + + + + Max + + + + - + Start @@ -198,234 +605,10 @@ p, li { white-space: pre-wrap; } - - - - - - <html><head/><body><p>To save the servo and other hardware from damage we have to set the max and min angles for the servo. </p><p>To set <span style=" font-weight:600;">the minimum angle for the servo</span>, press the Start button below and select the top slider and slide it to the left until min angle is reached.</p><p>When done press button again to stop.</p></body></html> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - true - - - - - - - false - - - 600 - - - 2400 - - - 1 - - - 10 - - - 1500 - - - true - - - Qt::Horizontal - - - false - - - false - - - QSlider::TicksBelow - - - 40 - - - - - - - Start - - - true - - - false - - - - - - - - - - - <html><head/><body><p>To set <span style=" font-weight:600;">the maximum angle for the servo</span>, press the Start button below and select the top slider and slide it to the right until max angle is reached.</p><p>When done press button again to stop.</p></body></html> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - true - - - - - - - false - - - 600 - - - 2400 - - - 1 - - - 10 - - - 1500 - - - true - - - Qt::Horizontal - - - false - - - false - - - QSlider::TicksBelow - - - 40 - - - - - - - Start - - - true - - - false - - - - - - - - - - - - 0 - 0 - - - - - 200 - 200 - - - - QFrame::NoFrame - - - - motorNeutralButton - toggled(bool) - motorNeutralSlider - setEnabled(bool) - - - 147 - 291 - - - 150 - 249 - - - - - servoMinAngleButton - toggled(bool) - servoMinAngleSlider - setEnabled(bool) - - - 147 - 291 - - - 150 - 249 - - - - - servoMaxAngleButton - toggled(bool) - servoMaxAngleSlider - setEnabled(bool) - - - 147 - 291 - - - 150 - 249 - - - - - servoCenterButton - toggled(bool) - servoCenterSlider - setEnabled(bool) - - - 147 - 291 - - - 150 - 249 - - - - +